流媒体基本要点简述:如何在AAC数据中获取PTS?

流媒体基本要点简述:如何在AAC数据中获取PTS?

序:

只大概说明要点。更具体的方法恕不祥叙。
我的开源工程和很多开源项目都有详细完整的实现代码。
这些要点都是我自己学习的总结,无责任保证正确性。仅做参考。
如发现有问题请丢砖头,跪求各方高人指正错误。Orz

内容:

AAC的原始数据有好几种格式,常见的有ADTS(Low Overhead Audio Transport Multiplex)和LOAS(Low Overhead Audio Stream)。

注意:LATM(Low Overhead Audio Transport Multiplex)是用于传输的封装,并不会见到可以存储的文件形式。表搞混淆。

AAC编码后的数据,有个貌似视频FRAME的概念,编码后的数据是按照FRAME进行存放输出的。解码也是一个FRAME一个FRAME的解码。

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(纳秒)。

另:
可以通过ffmpeg的打开一个输入AVFormatContext解析读取到各种音频类型的帧,或者直接用av_parser_parse2直接解析内存数据进行组帧,所以具体各种音频格式封包类型的组帧解析没必要自己做。以上公式其实也适用于所有类型的音频流。

posted @ 2021-09-13 10:59  裤子多多  阅读(269)  评论(0编辑  收藏  举报