我正在开发一个媒体播放器应用程序:播放ISDB-T音频和视频。我正在使用GStreamer进行解码&呈现。
为了AV Sync工作完美,我应该调节文件读取:这样数据就不会被推送到Gstreamer,既不会太快也不会太慢。
If I know the duration of TS file before hand, then I can regulate my reads. But how to calculate the TS file duration ?
因为,我需要用多个TS文件验证应用程序,不能使用一些实用程序计算持续时间并不断更改文件读取-这如何在程序中实现?
谢谢,
Kranti
如果您对传输流中的编码和PES层有足够的了解,那么您可以读取TS中的时间戳并自己计算它。它要求查找到文件的末尾,查找最后一个时间戳,然后减去文件开头同一程序的第一个时间戳。
EDIT:除了上述方法之外,您还需要包括最后一帧持续时间。((last_pts - first_pts) + frame_duration) / pts_resolution
假设你有一个30帧/秒的片段,持续时间为6.06秒((1081080 - 543543) + 3003) / 90000 = 6.006
在大多数情况下,每个PES报头包含一个PTS和/或DTS,其测量频率为90kHz。所以步骤可能包括:
- 找到您需要从MPEG TS中删除的程序。
- 查找流的PID
- 找到第一个有PID的TS包,并且payload_start_indicator设置为1;这将是一个PES帧的开始,它将包含一个PES报头。
- 解析PES报头以查找流的起始PTS。
- 从end向后解析文件,找到具有相同PID和payload_start_indicator集的数据包,其中将包含最后的PTS。找出它们的差异,除以90000将得到持续时间(秒)