IOS播放异常音频案例分析

前言

IOS播放器对播放文件要求比较严格,对于一些异常文件兼容性不是特别好,而且IOS播放器相对封闭,无法查看源代码或者看相关日志跟踪问题,所以定位IOS播放问题可谓是费时费力。本文就两个比较常见的案例进行分析,希望对大家分析IOS播放异常问题有所帮助。

案例一

现象:播放画面无卡顿,音频听起来有噪音,音频有卡顿感。

原因:音频时间戳混乱,存在误差,不严格对齐。可以使用如下代码进行分析

pktDuaraion = pkt.pts - last_pts;
printf("**********************************************\n"
        "pts duration: %d, tb: 1/%d, msDuration: %f\n"
        "pkt duration: %d, tb: 1/%d, msDuration: %f\n"
        "cal duration: %d, tb: 1/%d, msDuration: %f\n",
        pktDuaraion, timeBase->den, float(pktDuaraion) / timeBase->den,
        pkt.duration, timeBase->den, float(pkt.duration) / timeBase->den,
        av_get_audio_frame_duration(rtmpReader.GetRtmpAudioContext(), pkt.size),
        rtmpReader.GetRtmpAudioContext()->sample_rate,
        av_get_audio_frame_duration(rtmpReader.GetRtmpAudioContext(), pkt.size) /
        float(rtmpReader.GetRtmpAudioContext()->sample_rate));
  • pts duration,是使用前后两个pkt的pts之差计算得到
  • pkt duration,是使用pkt本身记录的duration得到的
  • cal duration,是使用av_get_audio_frame_duration函数获取得到的音频数据本身播放持续的时长

由此可知,cal duration是准确值,是数据实际能播放的时长,而前两个duration是记录或者计算出来的,不一定是准确。当其他两个值和cal duration差距过大时,即文件记录的时间戳出现异常,那么就可能会导致IOS播放异常。

异常举例:

异常案例

正常举例:

正常案例

解决方案:生成录制文件时,边录制边利用cal duration重新生成音频时间戳,不过该方案涉及到修改文件的时间戳,存在错改时间戳的风险,需业务评估后再使用。

案例二

现象:播放不流畅或者播放加速,音频闪现一些杂音,无法听清。播放过程中可能会导致IOS播放器闪退。

原因:音频声道数异常,例如文件数据本是单声道,文件却记录为双声道,反之亦然。

简单分析如下:

1.使用MP4 Reader查看问题文件的音频元数据信息

问题文件

可以看到文件的Audio Decoder Specific Info为 11 88,这两个字节的解读可以使用如下代码

5 bits: object type
if (object type == 31)
    6 bits + 32: object type
4 bits: frequency index
if (frequency index == 15)
    24 bits: frequency
4 bits: channel configuration
var bits: AOT Specific Config

11 88 = 00010 0011 0001 000 即

object type = 00010 = 2

frequency index = 0011 = 3

channel configuration = 0001 = 1

使用以上数据进行查如下三表

Audio Object Types
MPEG-4 Audio Object Types:
· 0: Null
· 1: AAC Main
· 2: AAC LC (Low Complexity)
· 3: AAC SSR (Scalable Sample Rate)
· 4: AAC LTP (Long Term Prediction)
· 5: SBR (Spectral Band Replication)
· 6: AAC Scalable
· 7: TwinVQ
· 8: CELP (Code Excited Linear Prediction)
· 9: HXVC (Harmonic Vector eXcitation Coding)
· 10: Reserved
· 11: Reserved
· 12: TTSI (Text-To-Speech Interface)
· 13: Main Synthesis
· 14: Wavetable Synthesis
· 15: General MIDI
· 16: Algorithmic Synthesis and Audio Effects
· 17: ER (Error Resilient) AAC LC
· 18: Reserved
· 19: ER AAC LTP
· 20: ER AAC Scalable
· 21: ER TwinVQ
· 22: ER BSAC (Bit-Sliced Arithmetic Coding)
· 23: ER AAC LD (Low Delay)
· 24: ER CELP
· 25: ER HVXC
· 26: ER HILN (Harmonic and Individual Lines plus Noise)
· 27: ER Parametric
· 28: SSC (SinuSoidal Coding)
· 29: PS (Parametric Stereo)
· 30: MPEG Surround
· 31: (Escape value)
· 32: Layer-1
· 33: Layer-2
· 34: Layer-3
· 35: DST (Direct Stream Transfer)
· 36: ALS (Audio Lossless)
· 37: SLS (Scalable LosslesS)
· 38: SLS non-core
· 39: ER AAC ELD (Enhanced Low Delay)
· 40: SMR (Symbolic Music Representation) Simple
· 41: SMR Main
· 42: USAC (Unified Speech and Audio Coding) (no SBR)
· 43: SAOC (Spatial Audio Object Coding)
· 44: LD MPEG Surround
· 45: USAC
Sampling Frequencies
There are 13 supported frequencies:
· 0: 96000 Hz
· 1: 88200 Hz
· 2: 64000 Hz
· 3: 48000 Hz
· 4: 44100 Hz
· 5: 32000 Hz
· 6: 24000 Hz
· 7: 22050 Hz
· 8: 16000 Hz
· 9: 12000 Hz
· 10: 11025 Hz
· 11: 8000 Hz
· 12: 7350 Hz
· 13: Reserved
· 14: Reserved
· 15: frequency is written explictly
Channel Configurations
These are the channel configurations:
· 0: Defined in AOT Specifc Config
· 1: 1 channel: front-center
· 2: 2 channels: front-left, front-right
· 3: 3 channels: front-center, front-left, front-right
· 4: 4 channels: front-center, front-left, front-right, back-center
· 5: 5 channels: front-center, front-left, front-right, back-left, back-right
· 6: 6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel
· 7: 8 channels: front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel
· 8-15: Reserved

可知该文件标记为单声道,使用二进制编辑软件把文件强制修改为双声道文件,即11 88改成11 90

修改后文件可以播放。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏進无尽的文章

储存篇 - CoreData使用大全

Core Data框架提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC...

13820
来自专栏美团技术团队

Category 特性在 iOS 组件化中的应用与管控

除了引用中提到的添加方法,Category 还有很多优势,比如将一个类的实现拆分开放在不同的文件内,以及可以声明私有方法,甚至可以模拟多继承等操作,具体可参考官...

15820
来自专栏美团技术团队

iOS 增量代码覆盖率检测实践

本文介绍了对iOS覆盖率检测算法的研究,分享一种可以嵌入到现有开发流程中,并对开发透明的增量代码测试覆盖率工具的实现。

27930
来自专栏程序员维他命

面向对象设计的设计模式(二):工厂方法模式

工厂方法模式的适用场景与简单工厂类似,都是创建数据和行为比较类似的对象。但是和简单工厂不同的是:在工厂方法模式中,因为创建对象的责任移交给了抽象工厂的子类,因此...

14630
来自专栏美团技术团队

Hades:移动端静态分析框架

本文主要介绍大众点评自主研发的移动端静态分析框架——Hades,它可以帮助我们更好的审视代码、把控大型项目。

15020
来自专栏三流程序员的挣扎

Flutter 学习笔记4-构建布局示例

一行中有三个子元素,其中第一列子元素本身又是一列,包含两行文字。需要占用大量空间,所以它必须包装在 Expanded widget 中。

12630
来自专栏iOS开发攻城狮的集散地

iOS 前台重启应用和清除角标的问题已知条件:问题描述:调试分析解决问题

前台时重启应用调用了applicationWillEnterForeground:

25630
来自专栏mukekeheart的iOS之旅

(转)iOS学习——UIlabel设置行间距和字间距

  在iOS开发中经常会用到UIlabel来展示一些文字性的内容,但是默认的文字排版会觉得有些挤,为了更美观也更易于阅读我们可以通过某些方法将UIlabel的行...

39220
来自专栏互联网数据官iCDO

关于iOS 12 - 移动营销人需要了解的4件事

苹果公司于9月12号宣布发布新的iPhone及其即将推出的iOS 12。苹果此举是为了回应消费者日益增长的新思维,即人们希望对自身的数字化体验拥有更多的控制权。...

10120
来自专栏Alice

ios 版本更新提示-硬更新/软更新

步骤一: 将检测更新写到APPDelegate的applicationDidBecomeActive中

21840

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励