5步告诉你QQ音乐的完美音质是怎么来的,播放器的秘密都在这里

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由QQ音乐技术团队发表于云+社区专栏

一、问题背景与分析

不久前,团队发现其Android平台App在播放MV视频《凤凰花开的路口》时,会带有如电流声一般的杂音,这影响了用户体验。 研发同学在初步定位时,发现有如下特征:

  • Android平台杂音问题必现;
  • iOS、PC平台能正常播放,没有噪音。

然而,各平台都是统一用HLS格式播放,即源头都是一样的。对于该问题,我们的定位思路如下:

  1. 梳理视频播放流程;
  2. 找到切入点排查。

二、播放流程概览

分析播放流程如上图(图中内容从左往右),概括其关键步骤如下:

  1. 播放器初始化:

    • 创建读数据线程:read_thread
    • 创建存放audio解码前数据的队列:audioq
    • 创建存放audio解码后数据的队列:sampq
  2. 数据读取:
    • ①创建context;
    • ②探测协议类型:avformat_open_input
    • ③探测媒体类型:avformat_find_stream_info
    • ④获取音视频流:av_find_best_stream
    • ⑤打开媒体解码器:stream_component_open
    • ⑥读取媒体数据,获得AVPacket:av_read_frame(ic, pkt)
    • ⑦音视频数据分别送入audioq中;
    • 重复⑥、⑦步骤到数据完毕。
  3. 音频解码:
    • audio_thread中对audioq中的数据进行decoder_decode_frame解码;
    • 解码后的帧AVFrame存放到sampq中;
  4. 音频播放:
    • 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数据频谱图:

异常PCM数据频谱图:

正常PCM数据波形图:

异常PCM数据波形图:

对比分析可得出:

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

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

4、数据读取是否有问题

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

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

  • 第一条正常播放(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;
        best_multiframe = multiframe;
        ret          = real_stream_index;//最后选择的流index
        best_decoder = decoder;
    }
    return ret;
}

在该视频中,我们可以看到:

codec_info_nb_frames bit_rate
audio_stream 1 38 122625
audio_stream 2 39 126375

第二条流的解码帧数和比特率要比第一条高,因此选择了第二条流播放

2、对比同类方案

分析了以上选择规则后,我们对各平台、框架进行了选择规则的对比:

备注:

  • ExoPlayer对多音频流的ts分片支持不完善(issue),因此测试时需要调整相关接口。但选择规则依然以上述所示(DefaultTrackSelector)
  • iOS和PC平台采用闭源组件,因此测试时使用了“互换两条音频流顺序”的方法进行测试。互换后,两平台都播放了杂音音频流 ffmpeg -i INPUT_FILE -map 0:0 -map 0:2 -map 0:1 -c copy -y OUTPUT_FILE
  • QuickTime同样是闭源,互换音频流后无法明显差别,通过合成第三条音频流,来验证是它是对所有音频流全播放 ffmpeg -i INPUT_FILE_1 -i INPUT_FILE_2 -map 0:0 -map 0:1 -map 0:2 -map 1:0 -c copy OUTPUT_FILE

3、总结

从以上数据看到,iOS和PC平台会默认选择第一条流,而在Android平台的FFmpeg和ExoPlayer会根据音频流属性来选择数值更好的一条。

  • “默认选择第一条”方案能更容易地把音源问题暴露
  • “比较音频流属性”方案能更大几率地选择质量更好的流来提升用户体验。

但以上2个选择方案都无法识别“内容异常”的音频流。

五、问题解决方案

因此,处理该问题,需要从音源上进行修复和规避,我们的建议是从源头杜绝,从终端规避:

  1. 编辑重新上架正常音源;
  2. 短期内增加双音频流的检测上报,帮助后台、编辑进行复查;
  3. 长远看由后台开发工具,分别对存量视频进行双音频流检测和对增量视频保证只转码单音频流;

参考资料

相关阅读

wamp2.0配置Zend Optimizer

藏匿在邮件里的“坏小子”

打造一个个人阅读追踪系统

【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

此文已由作者授权腾讯云+社区发布,更多原文请点击

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区

原文地址:https://www.cnblogs.com/qcloud1001/p/9768030.html

时间: 2024-10-08 11:37:37

5步告诉你QQ音乐的完美音质是怎么来的,播放器的秘密都在这里的相关文章

添加音乐播放器

在这里先制作虾米的音乐播放器:虾米音乐 找到想要添加的音乐->点击音乐右边的add按钮->右边出现了播放器及添加的音乐: 全部添加好后滚动到页面底部,设置想要的样式. 记下你设置的宽度值,复制HTML代码.

Android开发实战之简单音乐播放器

最近开始学习音频相关.所以,很想自己做一个音乐播放器,于是,花了一天学习,将播放器的基本功能实现了出来.我觉得学习知识点还是蛮多的,所以写篇博客总结一下关于一个音乐播放器实现的逻辑.希望这篇博文对你的学习和生活有所帮助.效果图: **实现逻辑** 在市面上的音乐播放app,即时你关了.那么一样会在后台播放,所以播放的逻辑应该写在Service中.并且能够实现Service和Activity之间进行通信.那么Service是四大组件之一,所以在使用的时候一定不要忘了在配置文件中声明一下. <ser

Python Scrapy的QQ音乐爬虫 音乐下载、爬取歌曲信息、歌词、精彩评论

QQ音乐爬虫(with scrapy)/QQ Music Spider 磁力搜索网站2020/01/07更新 https://www.cnblogs.com/cilisousuo/p/12099547.html UPDATE 2019.12.23 已实现对QQ音乐文件的下载,出于版权考虑,不对此部分代码进行公开.此项目仅作为学习交流使用,支持正版,人人有责 项目介绍 在写一个项目的时候需要用到一些音乐的信息,但是在网上找了许久也没找到满意的音乐语料,于是便用scrapy写了一个QQ音乐的爬虫 由

将 QQ 音乐、网易云音乐和虾米音乐资源「整合」一起的Chrome 扩展Listen 1

原文地址:http://whosmall.com/?post=418 本文标签: Chrome扩展 Chrome浏览器 Chrome扩展Listen1 音乐资源整合 Listen1安装方法 在 Chrome 上安装了这款名为 Listen 1 的插件,妈妈可是再也不用担心你找不到想听的歌了.它将 QQ 音乐.网易云音乐以及虾米音乐的音乐资源「整合」在了一起,你只需要输入音乐关键词,就可以方便地三大曲库中跳转搜索. 安装方法 Listen 1 的安装方法与一般的 Chrome Extension

&nbsp; QQ音乐年度盛典 最具生命力的音乐

QQ音乐举办的国内以互联网用户行评奖标准的音乐盛事"QQ音乐年度盛典".此次盛典旨在打造真实.可信.公开.公正的新音乐典范和权威标榜,并以QQ音乐为核心调动互联网音乐.社交平台及乐迷共振,激活乐迷对音乐试听.音乐分享及音乐盛事的关注和参与,形成最具生命力的音乐生态环境. 第一届2014年3月27日,2014QQ音乐年度盛典暨颁奖典礼在深圳举行.基于国内数字音乐平台地位,同时又是2014年首场独具特色的数字音乐盛典,QQ音乐得到了数十位乐坛顶尖歌手的支持,阵容强大,组合亮眼,亚洲天王周杰

【QQ音乐Api】移花接木 打造自己的音乐电台

最近突发奇想想做个在线音乐小网页.需求很简单,如下 搜索歌曲 或 歌手 在线播放音乐 借用qq 或者 百度的 音乐接口 需求明确那就直接动手了 我首先尝试的百度音乐,但是不能在线播放(提示forbidden),虽然不能在线播放,但是下载是可以的 百度音乐具体Api如下 1:搜索接口 $url = "http://musicmini.baidu.com/app/search/searchList.php?qword=%s&ie=utf-8&page=1";//qword就

QQ音乐产品经理黄楚雄:产品与用户的情感联系

QQ 音乐产品经理关于产品的一些感悟. 2014 年是 QQ 音乐的第十个产品年度,这十年我们跟用户一起见证了整个互联网音乐的发展.2011 年的 3 月 QQ 音乐公布了第一个 iPhone 平台的版本号,在这三年多的时间里,QQ 音乐一共公布了 44 个版本号,这之中有非常多值得讲的故事和产品的情怀. 简单与复杂 为什么要把程序弄得这么复杂? 这样对用户来说,是否简单了! 这是 QQ 音乐开发的同学与产品经理间非经常见的一段对话.最初 QQ 音乐的版本号的时候,我们经常接到用户这种反馈:睡觉

从QQ音乐开发,探讨如何利用腾讯云SDK在直播中加入视频动画

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 看着精彩的德甲赛事,突然裁判一声口哨,球赛断掉了,屏幕开始自动播放"吃麦趣鸡盒,看德甲比赛"的视频广告 那么问题来了,如何在直播流中,无缝的插入点播视频文件呢? 本文介绍了QQ音乐基于腾讯云AVSDK,实现互动直播插播动画的方案以及踩过的坑. 01 从产品经理给的需求说起 "开场动画?插播广告?" 不久之前,产品同学说我们要在音视频直播中,加一个开场动画. 要播放插播动画

【tkm格式转mp3】qq音乐伴奏文件转码

tkm格式是qq音乐伴奏文件的一种加密格式,转化mp3比较复杂. 但办法还是有的. 经过一番研究,我终于将tkm格式成功转换mp3文件.如图: 那么tkm文件怎么转化成mp3呢? 可以联系我~ 第一步,发送你需要转换的tkm文件给我 第二步,我这边转好后发你 有需要转换tkm格式的,可以联系~ 徽信号:littlewzi QQ音乐是腾讯公司推出的一款网络音乐服务产品,海量音乐在线试听.新歌热歌在线首发.歌词翻译.手机铃声下载.高品质无损音乐试听.海量无损曲库.正版音乐下载.空间... qq音乐伴