IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 5步告诉你QQ音乐的完美音质是怎么来的,播放器的秘密都在这里,面试经历分享 -> 正文阅读

[移动开发]5步告诉你QQ音乐的完美音质是怎么来的,播放器的秘密都在这里,面试经历分享

  *   ④获取音视频流:`av_find_best_stream`;
*   ⑤打开媒体解码器:`stream_component_open`;
*   ⑥读取媒体数据,获得AVPacket:`av_read_frame(ic, pkt)`;
*   ⑦音视频数据分别送入`audioq`中;
*   重复⑥、⑦步骤到数据完毕。
  1. 音频解码:
    • audio_thread中对audioq中的数据进行decoder_decode_frame解码;
    • 解码后的帧AVFrame存放到sampq中;
  2. 音频播放:
    • aout_thread_n中,通过调用回调接口sdl_audio_callback,对sampq中的音频帧数据进行解码成PCM数据;
    • 写入PCM数据到buffer数组,并由AudioTrack播放。

三、问题分解与切入

在梳理出播放流程后,标记出找到有可能出错的环节,方便进行“分层定位”(图中黄色标记)

  • 播放下载文件是否有问题;
  • 数据读取是否有问题;
  • 音频解码逻辑是否有问题;
  • AudioTrack的设置是否有问题;

接下来,根据难易程度,对上述环节逐个验证。

1、播放下载文件是否正常

把Android平台播放的ts文件与各平台的进行比对,发现两者一样,该环节正常。

2、AudioTrack设置是否正常

通过日志检查AudioTrack以下配置参数:

  • 采样率
  • 位深
  • 频道

以上参数设置的值与音频流的相符合,该环节正常。

3、音频解码逻辑是否有问题

验证解码逻辑是否有问题,可以通过对PCM数据进行分析来确认。 对aout_thread_n进行修改,将PCM数据额外输出到本地,并与正常的PCM数据进行对比。

正常PCM数据频谱图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6z4TnnIn-1631184763213)(https://user-gold-cdn.xitu.io/2018/10/10/1665d7bc37f6ba03?imageView2/0/w/1280/h/960/ignore-error/1)]

异常PCM数据频谱图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-77gdbNg4-1631184763214)(https://user-gold-cdn.xitu.io/2018/10/10/1665d7bc384dd90c?imageView2/0/w/1280/h/960/ignore-error/1)]

正常PCM数据波形图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7EyIaPcS-1631184763216)(https://user-gold-cdn.xitu.io/2018/10/10/1665d7bc383573a3?imageView2/0/w/1280/h/960/ignore-error/1)]

异常PCM数据波形图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hTJNZemt-1631184763218)(https://user-gold-cdn.xitu.io/2018/10/10/1665d7bc384d7603?imageView2/0/w/1280/h/960/ignore-error/1)]

对比分析可得出:

  • 从频谱图中看出,异常的PCM在人耳十分敏感的频响(1000~8000Hz )区域内的音频数据严重缺失,导致“杂音问题”
  • 从波形图中看出,异常的与正常的无声区和有声区都吻合,若解封装、解码逻辑出现异常,极大几率是呈现无波动(一条直线的形式)情况。因此可以先大胆假设解码、解封装逻辑是符合预期的

若解码逻辑正常,再结合之前已经验证文件下载正常。可以推测是数据读取环节出现异常

4、数据读取是否有问题

通过对数据读取的各步骤增加日志后,发现在av_find_best_stream音频流选择时出现异常: ffmpeg -i 发现,该视频ts分片有2个音频流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kRj7HlZS-1631184763219)(https://user-gold-cdn.xitu.io/2018/10/10/1665d7bc3a693395?imageView2/0/w/1280/h/960/ignore-error/1)]

通过强制分别读取两条音频流数据播放,发现:

  • 第一条正常播放(PCM数据正常)
  • 第二条播放杂音(PCM数据异常)
  • Android平台选择了第二条进行播放

基于此,也就验证了在第3步中的假设是正确的。

由上分析,可以得出结论:Android平台选择了第二条数据有问题的流进行播放。

四、问题根源:音频流选择

1、选择方式

分析代码,大致如下所列,av_find_best_stream函数选择音频流,该函数会根据2个主要参数进行选择:

  1. 各音频流的在探测媒体类型(avformat_find_stream_info)时,额外解码出来的帧数(选择多的)
  2. 各音频流的比特率(选择高的)
int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
                        int wanted_stream_nb, int related_stream,
                        AVCodec **decoder_ret, int flags)
{
    for (i = 0; i < nb_streams; i++) {
        count = st->codec_info_nb_frames; //音频流探测中解码的帧数
        bitrate = avctx->bit_rate;//音频流的比特率
        multiframe = FFMIN(5, count);
        //先比较解码帧数,再比较音频流比特率,谁大谁选
        if ((best_multiframe >  multiframe) ||
            (best_multiframe == multiframe && best_bitrate >  bitrate) ||
            (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
            continue;
        best_count   = count;
        best_bitrate = bitrate;


### Android高级架构师

由于篇幅问题,我呢也将自己当前所在技术领域的各项知识点、工具、框架等汇总成一份技术路线图,还有一些架构进阶视频、全套学习PDF文件、面试文档、源码笔记。

**[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](

)**

*   **330页PDF Android学习核心笔记(内含上面8大板块)**

![](https://img-blog.csdnimg.cn/img_convert/34eef9648d03bf00d78288ef7a09e098.png)

![](https://img-blog.csdnimg.cn/img_convert/14130c7d00f67c4ca2460981a3774a14.png)

*   **Android学习的系统对应视频**

*   **Android进阶的系统对应学习资料**

![](https://img-blog.csdnimg.cn/img_convert/3ef7608520a97721c226db34ffecd998.png)

*   **Android BAT部分大厂面试题(有解析)**

![](https://img-blog.csdnimg.cn/img_convert/5d963a4a7ca2c1f08670bb9c6fd9d062.png)


好了,以上便是今天的分享,希望为各位朋友后续的学习提供方便。觉得内容不错,也欢迎多多分享给身边的朋友哈。



> **本文已被[腾讯CODING开源托管项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](https://ali1024.coding.net/public/P7/Android/git)收录,自学资源及系列文章持续更新中...**


> **本文已被[腾讯CODING开源托管项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](https://ali1024.coding.net/public/P7/Android/git)收录,自学资源及系列文章持续更新中...**
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 10:58:28  更:2021-09-10 10:58:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:05:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码