ffmpeg学习笔记之创建音频解码器失败 avcodec_open2() 返回值为-22

目录

 

前言

解决过程

总结分析


前言

由于项目需求,需要开发一个私有播放器,所以就无法使用ffmpeg通用的取流接口:avformat_open_input()(埋下祸根)其中遇上了一个坑在创建音频解码器的时候返回失败;反复对比视频解码器的创建流程,按理说不应出现问题才对。

解决过程

查阅资料根本原因:主要是由于AVCodecContext中赋值的不匹配,主要设置参数:codec_type、sample_fmt、channel_layout、sample_rate、channels。

最终,经过多方探索终于找到了问题所在:对比网上一些解码播放音频的demo,进入调试可以发现,在调用avcodec_open2()之前,AVCodecContext 结构体已经保存有音频的sample_rate及channels这两个变量已经被赋值了;对比我自己的调用了avcodec_alloc_context3()之后AVCodecContext 结构体里面这两个值都是为空的。所以,尝试着在调用avcodec_alloc_context3()之后对上述两个变量进行手动赋值;果然,avcode_open2()能够正确执行返回了。

其中创建解码器的常规流程如下图所示:

总结分析

前面说到创建h264视频解码器时候这个流程能正确执行下来;现在递推回去思考,很容易的发现;视频解码器根据一个codecID就能正确创建相应的解码器,然而对于音频解码器就不行。因为音频解码根据codecID并不能正确创建解码器,还需要采样率(sample_rate),通道数(channels)这些数据辅助才能正确解码。而这些值得赋值操作,如果使用avformat_open_input()进行获取音视频数据的话,它就会通过协议解析进行正确赋值,自然就没有问题正确解码了。。。

但是,我咨询了相关ffmpeg使用经验丰富的人,收到的答复是只需要一个codecID就能正确创建想要的解码器;这个我怀疑是我使用的ffmpeg版本过低,内部实现逻辑还没有那么兼容,这点不曾验证。日后有空,重新搞一个最新的ffmpeg玩玩看。

参考文章

https://www.jianshu.com/p/d77718947e21

https://blog.csdn.net/u010463663/article/details/87921452

https://blog.csdn.net/PETER327447/article/details/53215731

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值