Hi,

I am facing issue while encoding live capture video data.
i want to encode raw video data captured from web cam into wmv2 codec.
i am able to  encode the video frames  & write them in a file , but @ decoding 
side it shows lot of mess.
pls have a look at my code below
actually i have some queries , pls resolve them.

1 what should be container format for this output file.
2 As sson as i captured first frame i start writing them to file , i am not 
writing any header info , pls let me know how to get this header.
when i tried to decode this file it says  
                    picture size invalid (0x0)
                    [rawvideo @ 0x3edb30]Could not find codec parameters 
(Video: rawvideo, yuv420p)
                    Straem info can't be retrieve

Regards
Ajay


==============================================================================================
void  My_Video_Encode()
{
    const char      *ofilename    = "D:\\Ajay\\video\\myenc.yuv";
    AVOutputFormat  *fmt          = NULL;
    AVFormatContext *pInFormatCtx = NULL;
    AVCodec         *codec        = NULL;
    int              i = 0;
 #if WIN_CAP
 FILE *f;
 AVFrame            *Rframe      = NULL;
 AVPacket            packet      ;
 AVCodecContext     *pCodecCtx   = NULL;
 AVFormatParameters  formatParams;
 AVInputFormat      *pInfmt      = NULL;
 uint8_t            *outbuf      = NULL;
 int                 size, out_size ,outbuf_size , ret ;

   memset(&formatParams, 0, sizeof(AVFormatParameters));
    formatParams.time_base.num = 1;
   formatParams.time_base.den = 25;
   #endif

     f = fopen(ofilename, "wb");
     if (!f)
     {
        fprintf(stderr, "could not open %s\n", ofilename);
        exit(1);
     }

     av_register_all();
     /* allocate the output media context */

  #if WIN_CAP
     avdevice_register_all();
     pInfmt = av_find_input_format("vfwcap");
     if( !pInfmt )
     {
        fprintf(stderr,"Unknown input format:mjpeg\n");
        return -1;
     }

     if (av_open_input_file(&pInFormatCtx, "0",  pInfmt, 0, &formatParams) != 0)
          printf( "Could not open input file for windows  \n");
    #endif

    if(av_find_stream_info(pInFormatCtx) <0)
          printf("Stream info can't be retrieve \n"  );

    dump_format( pInFormatCtx , 0 ,"0" ,0 ) ;

    fmt = guess_format("rawvideo", "vfwcap", NULL);
   
    pInFormatCtx->oformat = fmt;

    /* ptr to codec ctx for video stream */
    pCodecCtx = pInFormatCtx->streams[0]->codec ;

       /* put sample parameters */
    pCodecCtx->bit_rate = 400000;
    /* resolution must be a multiple of two */
       pCodecCtx->max_b_frames=0;
  pCodecCtx->codec_id = CODEC_ID_WMV2 ;

    codec = avcodec_find_encoder(CODEC_ID_WMV2);
    if (!codec)
    {
        fprintf(stderr, "codec not found\n");
        exit(1);
    }

 if (avcodec_open(pCodecCtx, codec) < 0)
 {
        fprintf(stderr, "could not open codec\n");
        exit(1);
    }

    Rframe = avcodec_alloc_frame();
    if (!Rframe)
        return NULL;
   

    outbuf_size = 100000;
    outbuf = malloc(outbuf_size);

    size = pCodecCtx->width * pCodecCtx->height;
    while (av_read_frame (pInFormatCtx , &packet ) >= 0)
      {

        Rframe->data[0] = packet.data;
        Rframe->data[1] = Rframe->data[0] + size;
        Rframe->data[2] = Rframe->data[1] + size / 4;
        Rframe->linesize[0] = pCodecCtx->width;
        Rframe->linesize[1] = pCodecCtx->width / 2;
        Rframe->linesize[2] = pCodecCtx->width / 2;


      out_size = avcodec_encode_video(pCodecCtx, outbuf, outbuf_size, Rframe);
            printf("encoding frame %3d (size=%5d)\n", i, out_size);
            fwrite(outbuf, 1, out_size, f);

             if (i++ > 100)
               break;

       }
   
 fclose(f);
}
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to