专栏首页谢金运的专栏IOS播放异常音频案例分析
原创

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 条评论
登录 后参与评论

相关文章

  • 音频缺失录制分析

    RTMP Reader和Muxing各自包含音视频的AVCodecContext,共四个AVCodecContext

    onexie
  • Neo4j Cypher语法整理

    算法之名
  • 一个oracle查询引起的bug (r4笔记第59天)

    任何软件都不是完美的,oracle也是如此,隔一段时间就会收到oracle的邮件说建议打哪些安全补丁什么的。新发布的产品都是release 1,比如10gR1...

    jeanron100
  • 《图解HTTP》读书笔记

      目前国内讲解HTTP协议的书是在太少了,记忆中有两本被誉为经典的书《HTTP权威指南》与《TCP/IP详解,卷1》,但内容晦涩难懂,学习难度较大。其实,HT...

    Edison Zhou
  • 详解http报文(2)-web容器是如何解析http报文的

    在详解http报文一文中,详细介绍了http报文的文本结构。那么作为服务端,web容器是如何解析http报文的呢?本文以jetty和undertow容器为例,来...

    方丈的寺院
  • “复学码”来了!~老师、家长看这里,教你如何“码”上复学~

    ? 随着国内疫情状况的好转,全国各地陆续公布返校复课时间。家长们纷纷喜极而泣:“神兽们”终于要回校园了! 开心之余,如何保障孩子们健康无忧地复学复课,也成为...

    腾讯智慧教育
  • 使用Mfuzz进行转录组表达模式聚类分析

    Mfuzz是用来进行不同时间点转录组数据表达模式聚类分析的R包,使用起来非常方便,直接输入不同样本归一化后的counts或者FPKM及TPM值就可进行聚类。

    生信小王子
  • 难点理解&面试题问答

    以包的形式去创建蓝图的时候更加的灵活,我们需要创建一个包,然后发现文件夹下自动的多出了一个__init__文件,这个文件是用来进行初始化的,在导入的时候会自动将...

    小闫同学啊
  • Aop学习笔记系列一

    一、Aop解决了什么问题? 1、在说解决了什么问题之前,先介绍一些关键的知识点 a、功能需求:功能需求指项目中的增值需求,比如业务逻辑,UI,持久化(数据库)。...

    郑小超.
  • 为什么选择SaaS ERP 与传统ERP区别?

    一个组织和它的业务系统之间的关系很像是婚姻关系,因为双方都在共同努力达成共同的目标。例如,企业资源规划(ERP)。ERP是一个包含了企业经营所需的所有信息的系统...

    人称T客

扫码关注云+社区

领取腾讯云代金券