hai.i am using libavcodec to write video file from buffer which is capture from usb camera.i am getting video output file with larger in size.i have to compress my video file size.plz suggest me needful thing..my code is here...
OS:linux IDE:Qt #
void videoctl(uint8_t *destination)
{
//destination -->buffer from video camera
AVCodec *codec;
AVCodecContext *c;
int out_size, size, x, y, outbuf_size;
FILE *f;
AVFrame *picture;
uint8_t *outbuf, *picture_buf;
avcodec_init(); //BLOCK ONE
//register all the codecs
avcodec_register_all();
c= NULL;
/* find the mpeg1 video encoder */
codec = avcodec_find_encoder(CODEC_ID_MPEG1VIDEO);//CODEC_ID_MPEG1VIDEO
if (!codec)
{
fprintf(stderr, "codec not found\n");
exit(1); //BLOCK TWO
}
c= avcodec_alloc_context();
picture= avcodec_alloc_frame();
/* put sample parameters */
c->bit_rate = 400000;
/* resolution must be a multiple of two */
c->width = 320 ;
c->height = 240 ;
/* frames per second */
c->time_base= (AVRational){1,25};
c->gop_size = 10; /* emit one intra frame every ten frames */
c->max_b_frames=1;
c->pix_fmt = PIX_FMT_YUV420P;
/* open it */
if (avcodec_open(c, codec) < 0)
{
fprintf(stderr, "could not open codec\n");
exit(1);
} //BLOCK FOUR
/* alloc image and output buffer */
outbuf_size = buf.length;//1000000;
outbuf = (uint8_t *)malloc(outbuf_size);
size = c->width * c->height ;
picture_buf =(uint8_t *) malloc((size * 3) / 2); /* size for YUV 420 */
picture_buf=(uint8_t *)destination;
picture->data[0] =picture_buf;
picture->data[1] = picture->data[0] + size;
picture->data[2] = picture->data[1] + size / 4;
picture->linesize[0] = c->width;
picture->linesize[1] = c->width / 2;
picture->linesize[2] = c->width / 2;
for(i=0;i<25;i++)
{
// picture->pts = i;
out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture);
printf("encoding frame %3d (size=%5d)\n", i, out_size);
fwrite(outbuf, 1, out_size, f);
/* add sequence end code to have a real mpeg file */
outbuf[0] = 0x00;
outbuf[1] = 0x00;
outbuf[2] = 0x01;
outbuf[3] = 0xb7;
fwrite(outbuf, 1, 4, f);
}
free(picture_buf);
free(outbuf);
av_free(c);
av_free(picture);
fclose(f);
avcodec_close(c);
}