ffmpeg(4.0.2)解码H264

FFmpeg 4.0.2中,AVStream.codec改为codecpar,av_register_all被弃用,新增av_demuxer_iterate()。视频音频解码接口合并,使用avcodec_send_packet()发送编码数据包,avcodec_receive_frame()接收解码后的数据。解码后图像空间由函数内部申请,需分配AVFrame对象空间。在调用关系中,avcodec_send_packet和avcodec_receive_frame并非一对一。最后一帧可能丢失,需要进一步研究解决。
摘要由CSDN通过智能技术生成

接口变更:

AVStream的codec参数被codecpar参数所替代

AVCodecContext *codec变为AVCodecParameters *codecpar

av_register_all被弃用

添加av_demuxer_iterate()

const AVInputFormat *av_demuxer_iterate(void **opaque);

解码接口变更:

视频解码接口avcodec_decode_video2和avcodec_decode_audio4音频解码deprecated,两个接口做了合并,使用统一的接口。将音视频解码步骤分为两步:

第一步:avcodec_send_packet()    发送编码数据包

第二步:avcodec_receive_frame()  接收解码后数据

函数原型:

int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);

参数:

AVCodecContext *avctx:视频解码的上下文,包含解码器。

const AVPacket *avpkt: 编码的音视频帧数据

返回值:

成功返回0

为什么要传递空的avpkt?

这里有一个说明是可以传递NULL,什么情况下需要传递NULL,你平时看一些视频播放器,播放经常会少最后几帧,很多情况就是因为没有处理好缓冲帧的问题,ffmpeg内部会缓冲几帧,要想取出来就需要传递空的AVPacket进去。

函数原型:

int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);

参数:

AVCodecContext *avctx:视频解码的上下文,包含解码器。

AVFrame *frame:解码后的视频帧数据。

返回值:

成功返回0

*******空间申请和释放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值