5步告诉你QQ音乐的完美音质是怎么来的,播放器的秘密都在这里 (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、对比同类方案

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

img

备注:

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个选择方案都无法识别“内容异常”的音频流。

五、问题解决方案

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

编辑重新上架正常音源;

短期内增加双音频流的检测上报,帮助后台、编辑进行复查;

长远看由后台开发工具,分别对存量视频进行双音频流检测和对增量视频保证只转码单音频流;

参考资料

https://ffmpeg.org/doxygen/2.8/

https://github.com/google/ExoPlayer

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

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

https://codeday.me/bug/20170711/39603.html

相关阅读
wamp2.0配置Zend Optimizer
藏匿在邮件里的“坏小子”
打造一个个人阅读追踪系统
【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgfjd.html