如何使用Gstreamer抵消.ts块中相对于音频点的视频数据包显示时间(pts)?
我用Gstreamer Bad Plugins 1.0“mpegtsmux”以编程方式编写单独的基本传输流(.ts)块。目标是以这样的方式编写这些块,它们将通过手动生成的.m3u8清单文件一起播放。
这可以通过“hlssink”插件正确实现,该插件生成包含多个.ts块和.m3u8清单文件的完整HLS流解决方案。所有块都具有正确的音频/视频数据包关系,并且任何块的视频重叠与下一个块的音频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。关于如何相对于彼此修改这些初始值的任何建议都值得赞赏。