iOS:制作简易的 AAC 播放器 —— 了解音频的播放流程

  

本文字数:1872

预计阅读时间:8分钟

    常用的播放文件,如 mp3、aac 都是已经封装的音频格式,将它们的文件提供到系统音频库或者第三方音频库,如 AVPlayer、IJKPlayer 等这些框架和播放器,然后声音就会由扬声器或耳机播放出来。如果读者对这些神奇的过程有兴趣,那就进入本次的了解旅程。

       《iOS 视音频入门系列》

    之前的都是针对图像,而本次来聊聊音频。

前言

    本次将基于 iOS 实现对aac(ADTS)文件的播放来讲解音频的播放流程。它将包括如下内容,可能大伙对这些名称有所耳闻:解封装、解编码等。流媒体的播放其实就是基于这些步骤来实现的。

 _______              ______________              ________
|       |            |              |            |        |
|  aac  |  demuxer   |    audio     |  decoder   | audio  |
| file  | ---------> | encoded data | ---------> | raw    |
|_______|            |______________|            |________|

AAC

    aac 的应用很广泛,在直播 rtmp 和 http-flv 中也使用的此音频格式。

AAC,全称Advanced Audio Coding,是一种专为声音数据设计的文件压缩格式。与MP3不同,它采用了全新的算法进行编码,更加高效,具有更高的“性价比”。利用AAC格式,可使人感觉声音质量没有明显降低的前提下,更加小巧。

    Demo 使用的 aac 音频信息如下:

Input #0, aac, from 'video.aac':
  Duration: 00:00:30.45, bitrate: 133 kb/s
  Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 133 kb/s

解封装

    解封装的最重要的目的是将 音频 的 音频的信息 & 音频的编码数据 分离出来。

    而 aac 是由多个 header + es body 组成。header 固定 7 个字节,所以只需每次读取 7 个字节,然后再读出 size,就能得到得到对应块的数据,从而得到 raw 数据。

// 读取 header
int head_buf_size = 7;
int *head_buf = malloc(head_buf_size);
fread(head_buf, 1, head_buf_size, _in_file);
    
// 读取 size
int s1 = ((int)(*(((uint8_t *)head_buf) + 3))&0x3) << 11;
int s2 = ((int)(*(((uint8_t *)head_buf) + 4))) << 3;
int s3 = (int)(*(((uint8_t *)head_buf) + 5)) >> 5;
int size = s1 + s2 + s3;

// 读取 raw
int raw_buf_size = size - head_buf_size;
int *raw_buf = malloc(raw_buf_size);
fread(raw_buf, 1, raw_buf_size, _in_file);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值