Gstreamer基本传输流(.ts)块音频/视频偏移

时间:2018-06-11 01:23:29

标签: gstreamer hls gstreamer-1.0

如何使用Gstreamer抵消.ts块中相对于音频点的视频数据包显示时间(pts)?

我用Gstreamer Bad Plugins 1.0“mpegtsmux”以编程方式编写单独的基本传输流(.ts)块。目标是以这样的方式编写这些块,它们将通过手动生成的.m3u8清单文件一起播放。

这可以通过“hlssink”插件正确实现,该插件生成包含多个.ts块和.m3u8清单文件的完整HLS流解决方案。所有块都具有正确的音频/视频数据包关系,并且任何块的视频重叠与下一个块的音频underlap 完全匹配。

说明:

  • 视频重叠 - 对于每个.ts块,音频将始终在视频之前结束。从最后一个音频数据包开始的时间量 结束直到最后一个视频帧结束是我们所谓的“重叠”
  • audio underlap - 对于每个.ts块,第一个音频数据包的pts总是先于或等于第一个视频数据包的pts。这个值就是我们所说的“underlap”。

HLS流的规则之一是,一个.ts块的重叠必须始终与下一个块的重叠相匹配,以便它们可以在各种播放器中无缝地一起播放。

我正在寻求帮助,了解如何设置生成的视频文件的音频重叠值。

注意:有几种方法可以查询任何视频文件的音频重叠。一种方法是使用命令行ffprobe应用程序和-show_frames选项。

例如:

ffprobe -show_frames -print_format json /test_media/segment.ts
# or...
ffprobe -show_frames -print_format json /test_media/segment.ts | grep -i -A 4 media_type | more

我查看了位于here的hlssink.c的代码,但我不明白如何抵消视频帧的显示时间。

以下是可用于生成.ts媒体文件的工作文本管道示例(程序化管道将相同的GstElements链接在一起):

gst-launch-1.0 -v filesrc location=/test_media/gopro.mp4 ! decodebin name=decbin ! videoconvert ! videorate ! videoscale ! video/x-raw,format=I420,framerate=30/1,width=1280,height=720 ! x264enc ! mpegtsmux name=muxer ! filesink location=segment.ts decbin. ! queue ! audioconvert ! avenc_aac ! muxer.

我正在使用gst_element_seek()设置GstSegment开始和结束时间。在上面的示例中,第一个音频和视频数据包始终具有相同的精确呈现时间(pts),始终为“3600”FWIW。关于如何相对于彼此修改这些初始值的任何建议都值得赞赏。

0 个答案:

没有答案