[FFmpeg-devel] Maybe bit_rate is not correct?

Prince xianyu.ge
Tue Feb 9 10:11:02 CET 2010


Hi All,

I just want to decode a video which from my iPhone, get the many  
images and do some thing balabala...., then I will re-create a video  
from this images, the settings of video or audio is not change. This  
is my thinking.

According the output_simple.c sample code,  I write a test code, that  
just decode the video, then encode that to another video, but new  
there some issues with it.
The duration is decreased to half, and the quality is less that  
original, the file size is also less than original, what caused this,  
please give me a hand .
The following is the logs of ffmpeg, and some codes, any replies is  
welcome, thanks advance.

  The logs from dump_format:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/var/mobile/Applications/ 
E106BA0F-03B0-41EC-BCC4-D57688A3BBDE/mpegTest.app/IMG_0012.MOV':
   Metadata:
     major_brand     : qt
     minor_version   : 0
     compatible_brands: qt
     year            : 2010-02-08T14:47:17+0800
     year-eng        : 2010-02-08T14:47:17+0800
   Duration: 00:00:06.31, start: 0.000000, bitrate: 3696 kb/s
     Stream #0.0(und): Video: h264, yuv420p, 640x480, 3670 kb/s, 26.28  
fps, 300 tbr, 600 tbn, 1200 tbc
     Stream #0.1(und): Audio: aac, 44100 Hz, mono, s16, 63 kb/s
Output #0, mov, to '/var/mobile/Applications/E106BA0F-03B0-41EC-BCC4- 
D57688A3BBDE/Documents/TEST.MOV':
     Stream #0.0: Video: mpeg4, yuv420p, 640x480, q=2-31, 3670 kb/s,  
300 tbr, 600 tbn, 1200 tbc
     Stream #0.1: Audio: aac, 44100 Hz, 1 channels, 63 kb/s

Some codes that set the out put video stream:


static AVStream *add_video_stream(AVFormatContext *oc, int codec_id)
{
	AVCodecContext *c;
	AVStream *st;
	
	st = av_new_stream(oc, 0);
	if (!st) {
		fprintf(stderr, "Could not alloc stream\n");
		exit(1);
	}
	
	c = st->codec;
	c->codec_id = codec_id;
	c->codec_type = CODEC_TYPE_VIDEO;
	
	st->r_frame_rate.den = pFormatCtx->streams[videoStream]- 
 >r_frame_rate.den;
	st->r_frame_rate.num = pFormatCtx->streams[videoStream]- 
 >r_frame_rate.num;
	st->avg_frame_rate.den = pFormatCtx->streams[videoStream]- 
 >avg_frame_rate.den;
	st->avg_frame_rate.num = pFormatCtx->streams[videoStream]- 
 >avg_frame_rate.num;
	st->sample_aspect_ratio.den = pFormatCtx->streams[videoStream]- 
 >sample_aspect_ratio.den;
	st->sample_aspect_ratio.num = pFormatCtx->streams[videoStream]- 
 >sample_aspect_ratio.num;
	st->pts_wrap_bits = pFormatCtx->streams[videoStream]->pts_wrap_bits;
	
	st->quality = pFormatCtx->streams[videoStream]->quality;
	st->time_base.den = pFormatCtx->streams[videoStream]->time_base.den;
	st->time_base.num = pFormatCtx->streams[videoStream]->time_base.num;
	st->nb_frames = pFormatCtx->streams[videoStream]->nb_frames;
	
	/* put sample parameters */
	c->bit_rate = pCodecCtx->bit_rate;
	/* resolution must be a multiple of two */
	c->width = pCodecCtx->width;
	c->height = pCodecCtx->height;
	/* time base: this is the fundamental unit of time (in seconds) in  
terms
	 of which frame timestamps are represented. for fixed-fps content,
	 timebase should be 1/framerate and timestamp increments should be
	 identically 1. */
	c->coded_frame = pCodecCtx->coded_frame;
	c->time_base.den = pCodecCtx->time_base.den;
	c->time_base.num = pCodecCtx->time_base.num;
	c->gop_size = pCodecCtx->gop_size; /* emit one intra frame every  
twelve frames at most */
	c->pix_fmt = pCodecCtx->pix_fmt;
	c->max_b_frames = pCodecCtx->max_b_frames;
	c->me_method = pCodecCtx->me_method;
	c->rate_emu = 0;

	
	if (c->codec_id == CODEC_ID_MPEG2VIDEO) {
		/* just for testing, we also add B frames */
		c->max_b_frames = 2;
	}
	if (c->codec_id == CODEC_ID_MPEG1VIDEO){
		/* needed to avoid using macroblocks in which some coeffs overflow
		 this doesnt happen with normal video, it just happens here as the
		 motion of the chroma plane doesnt match the luma plane */
		c->mb_decision=2;
	}
	// some formats want stream headers to be separate
	if(!strcmp(oc->oformat->name, "mp4") || !strcmp(oc->oformat->name,  
"mov") || !strcmp(oc->oformat->name, "3gp"))
		c->flags |= CODEC_FLAG_GLOBAL_HEADER;
	
	return st;
}




More information about the ffmpeg-devel mailing list