同一个aac文件,在不同的播放器显示的时间长度不一样

why

计算播放时间:播放时间 = 文件大小(字节)8/(码率1000)(bps)

许多播放器通过码率计算(预估)出来的。 不同播放器获取的码率不一致,或者播放器其它实现方式获取文件时长, 导致这个问题。

aac文件 :

 一般是1024个采样点一帧去编码的,但是每个aac帧的大小本来就不一定是一样的; aac裸流本来就不带时长信息。 

举个例子:
不同版本的ffmepg 显示同一个文件的Duration不一致。 因为不同版本的ffmepg 的bit_rate不一样。

码率不一致

  1. 仅考虑最初的采样、不考虑二次处理,那么 :
    音频码率=采样率位深声道数目**。(说明一下,这个是使用最广泛的PCM编码的公式)

  2. 在实际应用中,不可能直接采用PCM编码出来的音频文件,因为太大了。以压缩为目的的二次处理是一定会有的。

因此,最终媒体文件的比特率与最初的采样率就没有必然联系了,码率完全取决于压缩算法和参数选择。

举个例子:正常来讲汽车的排量跟汽车的功率是成正比的,但实际情况不尽然,有的2.0L发动机调教到180匹的,也有2.0L发动机双涡轮增压到380匹的。

码率

码率就是音频文件或者音频流中1秒中的数据量,如2.44Mbps,就是1秒钟内的数据量达2.44Mbits。

采样率

采样率, 是指把音频信号数字化(AD采样)后一个通道1秒钟有多少个样本,对应而来的就是原始的数据。

如48kHz的采样率,就是指1个通道1秒钟有48k个数据点。 每个数据点,可以是16位,也可以是24或者其他,这就是采样精度。

ffmepg 常用

DTS(Decoding Time Stamp), 解码的时间.
PTS(Presentation Time Stamp), 显示的时间。

key_frame:是否是关键帧
pkt_pts:帧的pts数值
pkt_pts_time:通过 time_base 计算出来的显示时间。

ffmpeg存在多个时间基准(time_base),对应不同的阶段(结构体),每个 time_base 具体的值不一样,ffmpeg提供函数在各个time_base中进行切换。

ffprobe -show_packets : 看一下packets 信息
ffprobe -show_frames : 看一下帧信息

如何让文件时长准确呢 ?

不录制aac的裸流, 改成有包头时长信息的数据格式, 例如:flv或者mp3。

根据MPEG规范的说法,MPEG-4中的AAC(Advanced audio coding)将是MP3格式的下一代。

mp3的音频编码不是aac的,达不到aac那么高的压缩效率; mp4也可以acc编码单独封装音频。

你可能感兴趣的:(同一个aac文件,在不同的播放器显示的时间长度不一样)