采用 vlc 播放录制的ts文件,显示时长为负值,如下图:
但是用 ffplay 及 windows media player 可以播放,用 elecard stream analyzer 分析如下:
发现前面全是音频帧,13个音频帧之后才是视频 IDR,出现vlc 获取视频时长为负值及播放不了的原因就在这,把ts文件里面视频及音频 dts 重新排序解决问题。
解决方法:
把AAC音频帧第一个 dts 赋值等于第一个视频帧的dts,后续AAC 音频帧的 dts 递增值保持增加原始2个连续音频帧 dts 差值即可。
总结:
1、ts文件中按照dts的顺序写入数据(包括视频 dts 和音频 dts,上图中前面13帧均为音频是因为音频帧 dts的值都小于视频dts所致)。
2、视频和音频 AAC交替写入,一般2、3个视频帧后写入一个音频帧。