[Libav-user] Bug to generate a video file h264 with a bitrate set in code?

David SY dsy at yacast.fr
Thu Jun 16 15:59:08 CEST 2011


Hi !

I'm working on a project that generates a kind of CBR video file and I want to reproduce the same following command line in code :

ffmpeg -i videoFile.ts -qmin 10 -qmax 51 -vcodec libx264 -vb 300k -acodec libfaac -ab 64k videoFile.mp4

It generates correctly a video file with about 300k bit / s for the video and 64k bit / s for the audio = 364 kb/s.

But when I'm trying to do the same thing by sing fmpeg library in C. It never creates a videoFile with the bitrate set.

Here is a sample of my code, I think that some initialisations are missing ...

                               AVOutputFormat * pAVOutputFormat = ::guess_format(NULL, wFilesOut[i].strFileOut, NULL);
                               wFilesOut[i].pAVFormatCtxW = ::av_alloc_format_context();
                               AVFormatContext* pAVFormatCtxW = wFilesOut[i].pAVFormatCtxW;
                               pAVFormatCtxW->oformat = pAVOutputFormat;
                               strcpy(pAVFormatCtxW->filename, wFilesOut[i].strFileOut);

                               pAVFormatCtxW->ctx_flags = AVFMTCTX_NOHEADER;
                               pAVFormatCtxW->oformat->flags |= AVFMT_GLOBALHEADER;

                               // add stream video
                               AVStream* pAVStream = ::av_new_stream(pAVFormatCtxW, pAVFormatCtxW->nb_streams);

                               avcodec_get_context_defaults2(pAVStream->codec, AVMEDIA_TYPE_VIDEO);

                               pAVStream->codec->codec_id = CODEC_ID_H264;
                               pAVStream->codec->codec_type = CODEC_TYPE_VIDEO;

                               AVCodecContext * pAVCodecContext = pAVStream->codec;

                               pAVCodecContext->width = srcWidth;
                               pAVCodecContext->height = srcHeight;

                               pAVCodecContext->time_base.num = 1;
                               pAVCodecContext->time_base.den = 25;

                               pAVCodecContext->bit_rate = video_bitrate;

                               pAVCodecContext->pix_fmt = PIX_FMT_YUV420P;
                               pAVCodecContext->strict_std_compliance = -2;
                               pAVCodecContext->flags |= CODEC_FLAG_GLOBAL_HEADER;

                               pAVCodecContext->qmin = qmin;
                               pAVCodecContext->qmax = qmax;

                               pAVCodecContext->gop_size = gop_size;

                               pAVCodecContext->bit_rate_tolerance = 0;

                               AVCodec* pAVCodecVideo = ::avcodec_find_encoder(pAVStream->codec->codec_id);
                               int nRes = avcodec_open(pAVStream->codec, pAVCodecVideo);
                               if (nRes < 0)
                               {
                                               cerr<<"ERROR : avcodec_open failed for video"<<endl;
                                               return nRes;
                               }

                               // Add stream audio
                               pAVStream = ::av_new_stream(pAVFormatCtxW, audio_channel);
                               avcodec_get_context_defaults2(pAVStream->codec, AVMEDIA_TYPE_AUDIO);

                               pAVStream->codec->codec_id = CODEC_ID_AAC;

                               pAVStream->codec->codec_type = CODEC_TYPE_AUDIO;

                               pAVCodecContext = pAVStream->codec;

                               pAVCodecContext->channels = audio_channel;

                               pAVCodecContext->sample_rate = audio_sample_rate;

                               pAVCodecContext->bit_rate = audio_bitrate;

                               pAVCodecContext->channels = audio_channel;
                               pAVCodecContext->sample_rate = srcAF;

                               pAVCodecContext->flags |= CODEC_FLAG_GLOBAL_HEADER;

                               AVCodec* pAVCodecAudio = ::avcodec_find_encoder(pAVStream->codec->codec_id);
                               //AVCodec* pAVCodecAudio = ::avcodec_find_encoder_by_name("libfaac");

                               pAVCodecContext->sample_fmt = pAVCodecAudio->sample_fmts[0];

                               nRes = avcodec_open(pAVStream->codec, pAVCodecAudio);


I thought :
                               pAVCodecContext->bit_rate = video_bitrate;

                               pAVCodecContext->qmin = qmin;
                               pAVCodecContext->qmax = qmax;

and
                               pAVCodecContext->bit_rate = audio_bitrate;

                               pAVCodecContext->qmin = qmin;
                               pAVCodecContext->qmax = qmax;

could solved the issue, but no, it simply generates a kind of CBR does not depend on video or audio bitrate set.

Does somebody know why?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20110616/0ed94c24/attachment.html>


More information about the Libav-user mailing list