【问题标题】:Merge two appsrc pipelines into 1 MPEG-TS Stream将两个 apprc 管道合并为 1 个 MPEG-TS 流
【发布时间】:2021-03-07 00:59:08
【问题描述】:

我正在尝试将一些自定义 KLV 元数据混合到我的实时视频流中。我最近了解到,理想情况下,您有一个元数据流和一个视频流,然后将它们混合到一个传输流中。

这是我的视频流管道的启动字符串:

self.video_launch_string = 'appsrc name=source is-live=true format=GST_FORMAT_TIME caps=video/x-raw,format=BGR,width={},height={},framerate={}/1 ! videoconvert ! x264enc pass={} quantizer={} speed-preset={} tune={} byte-stream=true ! mpegtsmux ! udpsink host={} port={} sync=true' 

这是我的 klv 流的启动字符串:

self.meta_launch_string = 'appsrc name=klvstream is-live=true format=GST_FORMAT_TIME caps=meta/x-klv,parsed=true ! mpegtsmux ! udpsink host={} port={} sync=true' 

我将如何从这两个 appsrc 管道创建一个 MPEG-TS 流?

我从单独运行这两个中看到的当前行为是视频将其发送到客户端,似乎没有数据。我认为这是因为它们实际上并没有混合在一起。

感谢您的帮助。

【问题讨论】:

    标签: python c++ c gstreamer pygobject


    【解决方案1】:

    我建立了一个管道,将我的视频和元数据合并到一个 MPEG-TS 流中。

    mpegtsmux name=mux alignment=7 ! udpsink host={} port={} sync=false
    appsrc name=source is-live=true format=GST_FORMAT_TIME caps=video/x-raw,format=BGR,width={},height={},framerate={}/1 ! videoconvert ! x264enc pass={} quantizer={} speed-preset={} tune={} byte-stream=true ! mux.
    appsrc name=klvstream is-live=true format=GST_FORMAT_TIME caps=meta/x-klv,parsed=true ! mux.
    

    需要注意的两点:

    • sync=false 是必须的。 (编辑:事实证明这不是必须的,但流似乎更高效)
    • 对于输出的视频帧,还必须有一个元数据缓冲区输出。视频缓冲区和元数据缓冲区时间戳、持续时间、pts、dts 和偏移量应该相等。 (不确定这是否是必须的,但如果元数据包不相等,我的视频播放器会经常抱怨丢失的元数据包)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多