FFMPEG AVCodecparameter 怎么用?

FFMPEG AVCodecparameter  怎么用?

       最近在研究FFMPEG 于是下载啦一个最新的2017年5月23号的ffmpeg 3.3.1。新版本的FFMpeg支持很多CUDA cuvid 等等,编码器,解码器,硬件加速等,。我是非常想用它。
        1.  但是在使用它封装MP4文件的时候,用着网上的代码去搞,提示我 :
     图片1
     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 那个互转的函数
   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 文件里有。 我看了一下还真有。
图片2


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);

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值