音频格式

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一帧可以解析出的音频时长

  1. 一个AAC原始帧包含一段时间内1024个采样及相关数据
  2. 音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率(单位为s)
  3. 一帧 1024个 sample。采样率 Samplerate 44100KHz,每秒44100个sample, 所以 根据公式 音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率
  4. 当前AAC一帧的播放时间是= 1024*1000000/44100= 22.32ms(单位为ms)

(一个aac帧是由1024个样本组成的,一秒内aac的采样次数是44.1k次,所以一个aac帧的时长是1*1024/44.1k, 单位为秒)

对采样率为44.1kHz的AAC音频进行解码时,一帧的解码时间须控制在23.22毫秒内。

MP3一帧可以解析出的音频时长

  1. mp3 每帧均为1152个字节 (样本), 则:
  2. frame_duration = 1152 * 1000000 / sample_rate
  3. 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。
    采样率是指每秒从连续信号中提取并组成离散信号的采样个数,用赫兹(Hz)来表示。
1、编码前比特率
  比特率是指经过 编码后 的音频数据每秒钟需要用多少个比特来表示,但是这里的编码需要注意不是指MP3,WMA等编码概念,是指 模拟信号到数字信号的编码即(PCM数据) ,与它们密切相关的是表示每个PCM样点的bit位数。比如8bit,16bit
  以网上的例子来说:
   以电话为例,每秒3000次取样,每个取样是7比特,那么电话的比特率是21000。而CD是每秒44100次取样,两个声道,每个取样是13位PCM编码,所以CD的比特率是44100*2*13=1146600,也就是说CD每秒的数据量大约是144KB,而一张CD的容量是74分等于4440秒,就是639360KB=640MB。
    
  通过上面的原理说明,就很容易解释,为什么有些音频文件采样率一样,但是比特率不一样,或者是比特率一样,采样率不一样的问题。当然,在实际的应用中,为了同一输出,可能会将解码后的PCM数据进行上采样或者下采样统一到48K,最后输出。由于这个限制,对于采样文件本身为96K的高保真文件就无法有效播放。需要更加高端的播放硬件。
2、编码后比特率
  比特率是指经过 编码后 的音频数据每秒钟需要用多少个比特来表示,但是这里的编码需要注意 是指 MP3,WMA等编码概念, 不是 模拟信号到数字信号的编码即(PCM数据) ,与它们密切相关的是表示每个PCM样点的bit位数。比如8bit,16bit
       编码的时候设置比特率(wav --->aac--->wav),例如为64Kbps,也就是说音乐播放时每秒读取的编码文件的大小是64KBytes,因此假如一个12m的音乐片段,它的文件大小应该是64*12 /8=96Kb,以上数据都是指AAC文件的大小。至于aac编码得到的文件wav大小,它与aac压缩说法的压缩比有关。
     aac--->wav的原理,aac 文件中需要包含信道个数信息,采样率信息,帧大小。解码的时候是一帧一帧的解码得到480或者是512PCM数据。做仿真时存放到wav文件中。如果是实时播放,则需要考虑DAC的采样率问题,一般它的采样率是一定的,我们的平台是按48K输出。即每秒钟48000个PCM数据输入到 DAC处处理。这里需要注意区分比特率概念。如果是做仿真保存到wav文件,则可以看到相应的信息.

 

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。实践中,我们可以选择:同步视频到音频、同步音频到视频、同步音频和视频到外部时钟。



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值