音频打包TS
AAC-LC的音频如何打包成TS流?---有没有参考的代码
PTS DTS 怎么计算哦?
我看网上说 AAC编码ADTS就是TS流格式 这个就是188的一个个的TS包吗?
[解决办法]
这真不是三言两语说得清楚的,就看楼主到底了解多少了。还是建议楼主找开源的代码来得快。
1. TS格式比较复杂,自己看文档,起码要包含PAT,PMT和音频TS包。
2. 关于时间戳的计算,先看看纯音频时间戳的打法。AAC一帧解码出来是每声道1024个sample,也就是说一帧的时长为1024/sample_rate秒。所以每一帧时间戳依次0,1024/sample_rate,...,1024*n/sample_rate秒。
3. 首先将AAC填上ADTS头,如果AAC本身带有ADTS头就跳过这一步(.aac音频文件就是带ADTS头的AAC数据)。AAC要打包成MPEG或TS,需要添加ADTS头(7或9字节),这是由于MPEG的文件格式决定的,便于分割查找,因为MPEG的包一般都是固定大小,所以每一个包中的数据都只是数据流的任意一部分,需要将每一个包的数据接起来才能解码。(我们称这一步完成的数据为ES流)
4. 再将这ES流打包成PS流,PS流格式要看MPEG文档。一个PS包包含头部分和ES数据流部分。PS头包含PTS和长度等。以0x00 0x00 0x01 (ID) 开头的。AAC的ID从0xC0开始,一个数据流一个ID。最好每个PS包包含若干个完整的帧,长度自定。MPEG文件一般是2048左右,TS文件可以适当大一些。
5. 音频数据只需要打PTS。PTS的打法是:如果该包包含若干帧的帧头的第一个字节(AAC就是ADTS的第一个字节),该PS包的PTS就是这些帧中第一个帧的时间戳,如果没有包含任何帧的帧头的第一个字节,这个PS包就不打PTS。MPEG中PTS都是整数,90000=1秒,自己转化一下。
6. 再将PS流打包成TS流。如果打包成188个字节的TS流,除去头4字节,后面的184个字节就是放PS数据了。一个PS头最好是重新起一个TS包。前面不够的TS可以用padding补充。