目录

前言

解决过程

总结分析


前言

由于项目需求,需要开发一个私有播放器,所以就无法使用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

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

  1. C语言学习笔记---结构体作为函数参数和返回值

      结构体不仅可以作为函数的参数传递,也可以作为函数的返回值.现在就分别来看一下这两种情况. 结构体作为参数 struct score {int chinese;int math;int englis ...

  2. Django:学习笔记(2)——创建第一个应用

    Django:学习笔记(2)--创建第一个应用 创建应用 在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定.Django 自带一个工具,可以帮你生成应用的基础目录结构, ...

  3. spring学习笔记02-spring-bean创建的细节问题

    spring学习笔记02-spring-bean创建的细节问题 三种创建Bean对象的方式 Bean的作用范围 Bean的生命周期 <?xml version="1.0" e ...

  4. JavaScript学习笔记:创建、添加与删除节点

    JavaScript学习笔记:创建.添加与删除节点 文章目录 JavaScript学习笔记:创建.添加与删除节点 一.DOM对象节点类型 二.创建节点 1.创建元素节点 2.创建文本节点 3.创建属性 ...

  5. Python学习笔记:创建分数类

    Python学习笔记:创建分数类 1.编写创建分数类.py # 创建分数类from math import gcd# 定义分数类 class Fraction: def __init__(self, ...

  6. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

  7. oracle 创建角色 权限设置,[学习笔记] Oracle创建用户、分配权限、设置角色,

    [学习笔记] Oracle创建用户.分配权限.设置角色, 创建用户 create user student --用户名 identified by "123456" --密码 de ...

  8. FFmpeg学习笔记之ffplay流程分析

    背景说明 FFmpeg是一个开源,免费,跨平台的视频和音频流方案,它提供了一套完整的录制.转换以及流化音视频的解决方案.而ffplay是有ffmpeg官方提供的一个基于ffmpeg的简单播放器.学习f ...

  9. FFmpeg学习3:播放音频

    参考dranger tutorial,本文将介绍如何使用FFmpeg解码音频数据,并使用SDL将解码后的数据输出. 本文主要包含以下几方面的内容: 关于播放音频的需要的一些基础知识介绍 使用SDL2播 ...

最新文章

  1. evoc服务器长鸣报警显示正常,UPS电源故障灯亮,蜂鸣器长鸣报警怎么办
  2. Python爬虫==【openurl】
  3. 中国人民大学_《组织行为学》_18权力:怎样防止授权走样?
  4. 经典推荐--程序员之打油诗
  5. AGC016B Colorful Hats(构造)
  6. linux隐藏特定进程,linux 隐藏进程
  7. python 数组去重复_numpy数组去掉重复的行,保留唯一的行数据
  8. oracle未获得监听器,无监听文件listener.ora的动态监听小例试验
  9. 参数估计法——最大似然估计和贝叶斯参数估计
  10. 【机器学习】一文详尽系列之EM算法
  11. java如何逆向工程_总结一下java如何进行逆向工程
  12. Arduino串口通信
  13. MyBatis第N+1种分页方式,全新的MyBatis分页
  14. java语言要学多久_零基础学JAVA语言难吗!需要多久
  15. Win7安装win10,无需全盘重新分区,原MBR格式转GPT格式,创建EFI和MSR分区,安装win10
  16. 11类商标有空调商标哦
  17. JAVA程序的逻辑控制及输入输出
  18. Object Removal by Exemplar-Based Inpainting 翻译
  19. folder.htt等文件的问题
  20. warning ..\package.json: No license field

热门文章

  1. centos 6.5升级内核到3.10
  2. java实现等待程序响应_java – Ning:连接到websocket并等待响应
  3. 关于HOOK,如何通过钩子截获指定窗口的所有消息 SetWindowsHookEx
  4. Python下的自然语言处理利器-LTP语言技术平台 pyltp 学习手札
  5. getopt.h和getopt(),getopt_long()等函数
  6. 利用网络编程实现TFTP协议
  7. windows7家庭普通版 添加 gpedit 组策略
  8. Ubuntu拔掉挂载硬盘后一直卡在ubuntu的logo处以及windows强制关机会出现ubuntu出现系统恢复模式
  9. 大学生申请软著的好处
  10. ps -ef | grep httpd | grep -v grep | wc -l