https://www.cnblogs.com/samirchen/p/7071824.html
https://www.cnblogs.com/my_life/articles/6835695.html
http://www.cnblogs.com/my_life/articles/6842155.html
音频
在数字音频领域,常用的采样率有:
- 8,000 Hz - 电话所用采样率, 对于人的说话已经足够
- 11,025 Hz
- 22,050 Hz - 无线电广播所用采样率
- 32,000 Hz - miniDV 数码视频 camcorder、DAT (LP mode)所用采样率
- 44,100 Hz - 音频CD, 也常用于MPEG-1 音频(VCD, SVCD, MP3)所用采样率
- 47,250 Hz - Nippon Columbia (Denon)开发的世界上第一个商用 PCM 录音机所用采样率
- 48,000 Hz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率
- 50,000 Hz - 二十世纪七十年代后期出现的3M 和Soundstream 开发的第一款商用数字录音机所用采样率
- 50,400 Hz - 三菱 X-80 数字录音机所用所用采样率
- 96,000 或者 192,000 Hz - DVD-Audio、一些 LPCM DVD 音轨、BD-ROM(蓝光盘)音轨、和 HD-DVD (高清晰度 DVD)音轨所用所用采样率
- 2.8224 MHz - SACD、索尼 和 飞利浦 联合开发的称为Direct Stream Digital的1位sigma-delta modulation 过程所用采样率。
采样频率定义了每秒从连续信号中提取并组成离散信号的采样个数,采样频率的倒数是采样周期或者叫作采样时间,它是采样之间的时间间隔
44100已是CD音质, 超过48000或96000的采样对人耳已经没有意义。这和电影的每秒 24 帧图片的道理差不多。
AAC一帧可以解析出的音频时长
- 一个AAC原始帧包含一段时间内1024个采样及相关数据
- 音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率(单位为s)
- 一帧 1024个 sample。采样率 Samplerate 44100KHz,每秒44100个sample, 所以 根据公式 音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率
- 当前AAC一帧的播放时间是= 1024*1000000/44100= 22.32ms(单位为ms)
(一个aac帧是由1024个样本组成的,一秒内aac的采样次数是44.1k次,所以一个aac帧的时长是1*1024/44.1k, 单位为秒)
对采样率为44.1kHz的AAC音频进行解码时,一帧的解码时间须控制在23.22毫秒内。
MP3一帧可以解析出的音频时长
- mp3 每帧均为1152个字节 (样本), 则:
- frame_duration = 1152 * 1000000 / sample_rate
- sample_rate = 44100HZ时, 计算出的时长为26.122ms,这就是经常听到的mp3每帧播放时间固定为26ms的由来。
H264 视频
视频的一个帧的播放时间跟帧率有关:
frame_duration = 1000/帧率(fps)
例如:fps = 25.00 ,计算出来的时常为40ms,这就是同行所说的40ms一帧视频数据。
8位PCM 编码每个声音采样点用8bit来表示,16位PCM 编码每个声音采样点用16bit表示。因为16位PCM编码的采样精度更高,所以音质好一些,但8位PCM 编码所使用的数据量小一半,所以更容易存储和传输。
8位PCM编码常用于电话等通讯电路,采样速率8k,节省传输带宽。16位PCM 编码常用于电脑多媒体声音文件,采样速率44.1K,音质好。为了提高信噪比,8位PCM编码动态压缩技术,也就是说非线性量化,对小信号采样级数更多,压缩方法有A率和u率两种,中国和欧洲用A率,美国用U率。8位PCM 编码播放的时候也要解压缩成16位pcm播放。
音频中经常会提到两个概念:采样率、比特率(码率)。实际上当我们在播放MP3时,这两个信息有些播放器会显示:例如:采样率44.1KHz,比特率192Kbps。
以电话为例,每秒3000次取样,每个取样是7比特,那么电话的比特率是21000。而CD是每秒44100次取样,两个声道,每个取样是13位PCM编码,所以CD的比特率是44100*2*13=1146600,也就是说CD每秒的数据量大约是144KB,而一张CD的容量是74分等于4440秒,就是639360KB=640MB。
AAC的原始数据有好几种格式,常见的有ADTS(Low Overhead Audio Transport Multiplex)和LOAS(Low Overhead Audio Stream)。
注意:LATM(Low Overhead Audio Transport Multiplex)是用于传输的封装,并不会见到可以存储的文件形式。
ADTS和LOAS都是一个数据头+FRAME数据。首先在数据流中检查标识头,分割出数据头+FRAME数据。然后根据数据头格式,解析数据头,取出frame_length和sample_rate信息。
其中ADTS的解析相对简单,LOAS的解析要复杂一点。在VLC和FFMPEG中均有相关的解析代码,可以直接参考挪用。
根据frame_count(当前FRAME的数量),以及frame_length、sample_rate,即可计算出这帧AAC FRAME的PTS。
计算公式:
pts = 1000000 * frame_count * frame_length / sample_rate;
这里的base_clock(基本时钟频率),我取的1000000(纳秒)。
DTS、PTS 的概念
DTS、PTS 的概念如下所述:
- DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
- PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
需要注意的是:虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。
当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,就回到了我们前面说的问题:解码顺序和播放顺序不一致了。
比如一个视频中,帧的显示顺序是:I B B P,现在我们需要在解码 B 帧时知道 P 帧中信息,因此这几帧在视频流中的顺序可能是:I P B B,这时候就体现出每帧都有 DTS 和 PTS 的作用了。DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像。顺序大概如下:
PTS: 1 4 2 3
DTS: 1 2 3 4
Stream: I P B B
音视频的同步
上面说了视频帧、DTS、PTS 相关的概念。我们都知道在一个媒体流中,除了视频以外,通常还包括音频。音频的播放,也有 DTS、PTS 的概念,但是音频没有类似视频中 B 帧,不需要双向预测,所以音频帧的 DTS、PTS 顺序是一致的。
音频视频混合在一起播放,就呈现了我们常常看到的广义的视频。在音视频一起播放的时候,我们通常需要面临一个问题:怎么去同步它们,以免出现画不对声的情况。
要实现音视频同步,通常需要选择一个参考时钟,参考时钟上的时间是线性递增的,编码音视频流时依据参考时钟上的时间给每帧数据打上时间戳。在播放时,读取数据帧上的时间戳,同时参考当前参考时钟上的时间来安排播放。这里的说的时间戳就是我们前面说的 PTS。实践中,我们可以选择:同步视频到音频、同步音频到视频、同步音频和视频到外部时钟。