本文记录了在学习 iOS 音频方面的笔记。
第一次接触音频的同学可以先了解一下基本全貌和学习路径。

路径

audioLean.svg

  • 采集 不同平台会提供不一样的音频采集 API,采集和系统平台相关。
  • 转码 了解转码前,需要先补充一下音频编码的格式,PCM,AAC,G711a(alaw)等。不要被这些编码吓到,所有的编码都是规范好的二进制格式。此时你先了解这些内容即可。PCM 是音频采集和播放的原始格式,如果上面音频流的流动,它的开始节点和结束节点都是 PCM。此外你还要了解一种目前主流的编码方式 AAC,主要先了解它的二进制如何编码的就行,原理可以作为高级进阶方式再看。这一部分 iOS 提供了 AudioConverterFillComplexBuffer 的 API 可以进行转码。转码的实质是将 PCM 转为其他音频压缩格式便于传输,iOS 支持的音频格式在 <CoreAudioTypes/CoreAudioBaseTypes.h> 中。这一部分可以用系统的 API 也可以使用其他的转码库,总体来说这一部分的系统平台相关性并不高。
  • 打包 将转码后的音频格式打包,打包的目的是为了传输,所以和传输用的协议相关。如果只是本地录制,这里封装为 m4a 格式就好了,封装的目的是为了表明音频的编码格式,参数等。如果需要做传输,那就看传输协议需要的格式了。
  • 传输 目前直播使广泛使用的协议是 RTMP,RTMP 支持的格式为 FLV 格式。我们在获取到 AAC 的音频后按 FLV 的格式进行加工后就好了。具体的方式需要参考 FLV 格式。
  • 接受 接收协议,和传输息息相关,这一部分一般建立在 TCP/UDP(如 RTMP) 或 HTTP(如 HLS)协议的基础上。需要有网络相关的知识,调试可以使用 wireshark 进行抓包,调试,加快理解。
  • 解码 解码是将收到的音频数据转化为PCM,可以看到无论是什么格式最后最终都要转换为 PCM 格式才能播放。解码可以使用 ffmpeg 或系统 API 进行软解码,也可以使用系统的硬解码,不需要进行解码直接输入给系统即可,iOS 支持的编码方式和Android 支持的编码方式都可以自己支持的列表查看到。
  • 播放 将解码后的音频最终还是要输入到对应系统的平台进行播放。这一环节与系统 API 相关。需要熟悉系统进行播放的 api。

封装格式

此外 wav,flv,mp3并不是音频的编码方式,而是音频的封装格式,举个例子 AAC,G711可以认为是不同的酒,而 wav 和 mp3 是不同的酒瓶。酒瓶上写好了这是什么酒,每个瓶子的容量,这样有人在品尝的时候他可以预先知道这是什么酒。有的酒会装在一个大的酒瓶里,如果酒瓶的标签坏了你就无法得知里面酒的名字。而有的酒会装在一个一个小酒瓶里,即时有的酒瓶标签坏了,还是可以从其他小酒瓶里得到酒的信息。
各种封装格式可以参考这里

学习路径

学习需要的技能基本为:

  • 掌握音频基本概念
  • 平台音频采集框架
  • 音频编码格式
  • 二进制加工,网络传输技术

iOS 音频-知识地图 - 图2 学习的库可以参考 LFLiveKit

建立测试环境

使用 Wireshark 抓包,使用 VLC 做验证。

VLC

在 Mac 上的 VLC 有时候无法播放,将其硬解码关闭即可。需要考虑你的 RTMP 视频是否存在无法解码的可能。
image.png
然后在File -> Open Network 中输入 RTMP 的地址就可以播放了。

Wireshark

先下载 Wireshark 。需要安装两个脚本否则无法授权抓包。
下载完成后需要进入设置页面,在协议下选择 RTMPT,将 Maximum packet size 设置为 348895293。
Screen Shot 2021-01-25 at 11.43.47 AM.png
连接你的手机,通过 Xcode 的 Windows-> Devices And Simulators 找到手机的Identifier。
在控制台输入

  1. rvictl -s 手机的 Identifier

一般会多出一个 rv0 的网卡,选择开始抓包
Screen Shot 2021-01-25 at 11.49.06 AM.png
在过滤条件中输入 rtmpt 即可抓到 RTMP 的包

Audacity

音频分析工具,下载地址在这里。

RTMPDump

使用 brew 安装。

  1. brew install rtmpdump

使用方法 rtmpdump + rtmp 地址,可以将 rtmp 流保存到本地。

  1. rtmpdump -r "rtmp://xxxx" --flv test.flv