【写在前面】

前面我介绍了视频解码的流程,发现基础讲得有点少。

因此这里附上一些额外的基础内容:理解PCM音频数据格式

本篇主要内容:

1、FFmpeg音频解码基本流程

2、libswresample的基本使用方法


【正文开始】

实际上音频解码和视频解码的流程是一样的,因此就不花篇幅讲流程了。

这里先简单说一下不同的地方:

    //找到音频流的索引audioIndex = av_find_best_stream(formatContext, AVMEDIA_TYPE_AUDIO, -1, -1, nullptr, 0);

在第二个参数,改为 AVMEDIA_TYPE_AUDIO 即可。

然后从解复用到解码出 PCM,和视频解码的流程是一样的。

视频解码见:https://blog.csdn.net/u011283226/article/details/100868821

当然,本篇文章就这样结束也不太好,那么就简单讲一下关于 libswresample 的使用方法吧。

libswresample 是FFmpeg提供的重采样( Resample )库,所谓的重采样也可以简单理解为:样本转换,因此 libswresample 提供一组高度优化的样本转换函数,不管是采样类型,声道格式等等都可以进行转换。

要想使用 libswresample,首先得分配一个SwrContext ,它有两种分配方式:

1、使用 swr_alloc() 分配一个 SwrContext 指针,并且必须使用 av_opt_set_*() 来设置参数。

具体的参数在 FFmpeg 源码下的 libswresample / options.c 中。

如果你下载了Qt的源码,那么其中就包含了FFmpeg的源码( 因为 Chromium 源码包含FFmpeg,而Qt包含 Chromium ),它在 qtwebengine 中。

2、使用 swr_alloc_set_opts() 分配的同时设置一些参数。

    SwrContext *swrContext = swr_alloc_set_opts(nullptr, int64_t(codecContext->channel_layout), AV_SAMPLE_FMT_S32, codecContext->sample_rate,int64_t(codecContext->channel_layout), codecContext->sample_fmt, codecContext->sample_rate,0, nullptr);swr_init(swrContext);

我使用第二种方式分配,因为这里不需要那么多参数。

注意,分配了 SwrContext 后,必须使用 swr_init() 来进行初始化。

然后,当我们使用 avcodec_receive_frame() 获取到一帧解码的数据后,就可以进行转换了:

    int size = av_samples_get_buffer_size(nullptr, frame->channels, frame->nb_samples, AV_SAMPLE_FMT_S32, 0);uint8_t *buf = new uint8_t[size];swr_convert(swrContext, &buf, frame->nb_samples, const_cast<const uint8_t**>(frame->data), frame->nb_samples);delete[] buf;

1、使用 av_samples_get_buffer_size() 来获取给定音频参数所需的缓冲大小。

2、new (分配) 一个缓冲区。

3、使用 swr_convert() 来进行转换,in -> out。

因为FFmpeg的注释已经足够详细了,所以我从不讲参数。

4、转换完成后的数据存储在 buf 中了,记住别忘了 delete。


【结语】

本篇实在是没什么好写的,因为FFmpeg的抽象,所以解码视频和音频的流程基本差不多。

不过,解码字幕的时候倒是有些不同,这在后面会进行讲解的。

最后,附上项目地址:https://github.com/mengps/FFmpeg-Learn,可以自己尝试一下。

FFmpeg开发之旅(二)---音频解码相关推荐

  1. ffmpeg开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer)

    ffmpeg开发之旅(3):AAC编码格式分析与MP4文件封装(MediaCodec+MediaMuxer) (原文链接:http://blog.csdn.net/andrexpert/article ...

  2. ffmpeg开发之旅(4):MP3编码格式分析与lame库编译封装

    ffmpeg开发之旅(4):MP3编码格式分析与lame库编译封装 原文链接:http://blog.csdn.net/andrexpert/article/77683776 一.Mp3编码格式分析 ...

  3. 【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )

    文章目录 I . FFMPEG 播放视频流程 II . OpenSLES 播放音频流程 III . OpenSLES 播放参考 Google 官方示例 IV . OpenSL ES 播放代码 ( 详细 ...

  4. Qt与FFmpeg联合开发指南(二)——解码(2):封装和界面设计

    与解码相关的主要代码在上一篇博客中已经做了介绍,本篇我们会先讨论一下如何控制解码速度再提供一个我个人的封装思路.最后回归到界面设计环节重点看一下如何保证播放器界面在缩放和拖动的过程中保证视频画面的宽高 ...

  5. FFmpeg开发之旅(三)---理解过滤图并使用字幕过滤器

    [写在前面] 首先,抛开字幕本身的格式不说. 一般的字幕分三种,内封字幕.内嵌字幕和外挂字幕. 而本篇所讲的是外挂字幕,主要内容有: 1.FFmpeg过滤图基础. 2.使用FFmpeg字幕过滤器添加字 ...

  6. 音视频开发之旅(36) -FFmpeg +OpenSL ES实现音频解码和播放

    目录 OpenSL ES基本介绍 OpenSL ES播放音频流程 代码实现 遇到的问题 资料 收获 上一篇我们通过AudioTrack实现了FFmpeg解码后的PCM音频数据的播放,在Android上 ...

  7. FFmpeg开发笔记(七):ffmpeg解码音频保存为PCM并使用软件播放

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/108799279 各位读者,知识无穷而人力有穷 ...

  8. Android直播开发之旅(13):使用FFmpeg+OpenSL ES播放PCM音频

    文章目录 1. OpenSL ES原理 1.1 OpenSL ES核心API讲解 1.1.1 对象(Object)与接口(Interface) 1.1.2 [OpenSL ES的状态机制](https ...

  9. Android NDK开发之旅31 FFmpeg音频解码

    ###前言 #####基于Android NDK开发之旅30--FFmpeg视频播放这篇文章,我们已经学会视频解码基本过程.这篇文章就对音频解码进行分析. #####音频解码和视频解码的套路基本是一样 ...

最新文章

  1. ap忘记管理ip地址怎么办_什么是无线AP?胖瘦AP如何区分?
  2. 5、Linux-Mac配置环境变量
  3. 【Nginx】错误: [emerg] “proxy_set_header“ directive is not allowed here in D:\sde\phpstudy_pro\...
  4. 【ASP.NET】登陆成功后如何跳转到上一个页面
  5. oracle10g检测未通过,win64bit安装oracle 10g版本检查未通过解决 提示要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1...
  6. 推荐一款国产免费开源的ERP进销存系统 附带安装详细教程
  7. 软件著作权的申请超详细图文
  8. 【数学建模】Python+Gurobi求解线性规划
  9. ECCV 2020预会议 直播笔记| Suppress and Balance: A Simple Gated Network for Salient Object Detection
  10. matplotlib 点线动画
  11. 互联网+双“高新”时代
  12. 程序员转行中,深入研究一下产品经理岗,有兴趣的一起来学习进步吧!
  13. PC端网页特效 | 常见网页特效案例
  14. 用python练习日语五十音图
  15. 用python计算每一年的节日
  16. 宋维刚老师词霸天下38000词汇思维导图使用指南
  17. 国产芯片替代ST很容易:记航顺HK32F103RET6替代STM32F103RET6
  18. Could not change any device features - 开启 TSO fail
  19. android+metro风格,Metro、iOS、Android之三大UI风格对比
  20. C语言之复数的加减乘除

热门文章

  1. stm32如何读取并口_CH374T STM32模拟并口总线读写U盘
  2. 【沃顿商学院学习笔记】宏观经济学——08贸易集团Trade Blocs
  3. 无线传感器网络及应用
  4. 最短移臂调度算法_MATLAB优化算法实例——蚁群算法
  5. Vim/Cscope使用
  6. 使用junction为itunes备份目录创建硬链接
  7. you-get简明使用教程
  8. SpringBoot ajax文件下载实现
  9. 锐速与BBR的原理简单解析
  10. [Kriging](二)Matlab Kriging工具箱dace简单使用