FFMPEG AVCodecparameter 怎么用?
最近在研究FFMPEG 于是下载啦一个最新的2017年5月23号的ffmpeg 3.3.1。新版本的FFMpeg支持很多CUDA cuvid 等等,编码器,解码器,硬件加速等,。我是非常想用它。
1.
但是在使用它封装MP4文件的时候,用着网上的代码去搞,提示我 :
Using AVStream.codec to pass codec parameters to muxers is deparecated ,use AVStream.codecpar instead.
2. 然后兄弟我开始各种找代码 ,来解决这个问题,国内的用的很少,大家都是老代码,国外的用了不能用,而且FFMPEG自己的exmple里的例子还是使用的AVCodecContext.
然后我就说脏话了。
3. 再次探索,在google上高了一下,看到一个外国人和我做了同样的事情:
[Libav-user] AVStream::codec deprecated, but example uses it?
4. 用了avcodeccontext 和avcodecparameter 那个互转的函数
The avcodec docs index <https://ffmpeg.org/doxygen/3.1/avcodec_8h.html>: > Well, there's this avcodec_parameters_to_context > <https://ffmpeg.org/doxygen/3.1/group__lavc__core.html#gac7b282f51540ca7a99416a3ba6ee0d16>
5. 后来有个 文章告诉我们为啥avcodecContext 被抛弃,改用avcodecparameter 了
Here's something I found about why it's deprecated: https://lists.libav.org/pipermail/libav-commits/2016-February/018031.html
总之搞了这么久,我也还没试通,你们有谁弄好了请告诉我!
--------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------------
经过多方询问,在群里请教,终于得到了一个大哥的指导,告诉我FFMpeg 根目录下的ffmpeg.c 文件里有。 我看了一下还真有。
2017年5月31日19:56:54 终于知道了这个该怎么用了
首先请参考: http://blog.csdn.net/luotuo44/article/details/54981809 中的内容
const char *filename = "b.mp4";
AVFormatContext *fmt_ctx = nullptr;
avformat_alloc_output_context2(&fmt_ctx, nullptr, nullptr, filename); //需要调用avformat_free_context释放
//new一个流并挂到fmt_ctx名下,调用avformat_free_context时会释放该流
AVStream *stream = avformat_new_stream(fmt_ctx, nullptr);
AVCodec *codec = avcodec_find_encoder(fmt_ctx->oformat->video_codec);//音频为audio_codec
AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);
codec_ctx->video_type = AVMEDIA_TYPE_VIDEO;
codec_ctx->codec_id = m_fmt_ctx->oformat->video_codec;
codec_ctx->width = 1280;//你想要的宽度
codec_ctx->height = 720;//你想要的高度
codec_ctx->format = AV_PIX_FMT_YUV420P;//受codec->pix_fmts数组限制
codec_ctx->gop_size = 12;
codec_ctx->time_base = AVRational{1, 25};//应该根据帧率设置
codec_ctx->bit_rate = 1400 * 1000;
avcodec_open2(codec_ctx, codec, nullptr);
//将AVCodecContext的成员复制到AVCodecParameters结构体。前后两行不能调换顺序
avcodec_parameters_from_context(stream->codecpar, codec_ctx);
av_stream_set_r_frame_rate(stream, {1, 25});
以上只是它使用的顺序问题,但是你发现你的录制处理的MP4文件的码率,帧率还是很大。和自己设置的完全不一样。
为甚么会y偶这个原因,是因为新版本中该了很多东西,下面请参考这个文章。
AVDictionary* opt = NULL;
av_dict_set_int(&opt, "video_track_timescale", 25, 0);
avformat_write_header(m_pFormatCtx, &opt);
av_dict_set_int(&opt, "video_track_timescale", 25, 0);
avformat_write_header(m_pFormatCtx, &opt);