Gstreamer:有没有办法将 h264 视频流从字节流转换为 avc 格式

Gstreamer: Is there way to convert h264 video-stream from byte-stream to avc format

我需要上述方法将具有流格式字节流的 h264 流转换为 avc(一种打包格式),以便将其馈送到 matroskamux

我已经使用 C 代码对我的管道进行编程,并且我尝试在提供给 matroskamux 之前使用 h264parse 元素,但它只是简单地解析它而不更改流格式。

结果如下

然而,当我尝试使用命令行界面来编写我用来模拟相同效果的静态管道时。奇迹般地,结果正是我所需要的,而且我几乎没有使用其他 h264parse 属性。我可以获得喂养 matroskamux

所需的东西

结果

我试图找出为 h264parse 设置的 属性 是什么,但其中的 none 似乎能够显式转换为另一种格式。还有什么可以将流字节打包成avc吗?还是我必须用力垫?

我在 ARM 平台上使用 vpuh264_enc,因此可用的插件选择有限,但我仍然很高兴听到我能做些什么来解决这个问题。

谢谢

============================================= =============

更多信息:

我是怎么得到splitmuxsink的视频板的

  1. 首先我拿到pad模板

    video_pad_template = gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (splitmuxsink), “视频”);

  2. 接下来我使用请求垫获取垫

    pad = tee_pad = gst_element_request_pad (splitmuxsink,
                                    video_pad_template,
                                    NULL,
                                    NULL);
    
  3. 之后我正常加入

    'if (gst_pad_link (src_pad, 垫) != GST_PAD_LINK_OK ) { g_printerr ("无法链接。\n"); gst_object_unref(管道); return-1; }'

============================================= ===============

CLI 命令(我使用的)

  gst-launch-1.0 \
    v4l2src \
        ! video/x-raw,width=640,height=480,framerate=30/1,is-live=true \
        ! videorate \
        ! video/x-raw,framerate=25/1 \
        ! tee name=tv  \
       tv. \
        ! queue \
        ! vpuenc_h264 \
        ! tee name=tv2 \
       tv2. \
        ! queue \
        ! h264parse \
        ! queue \
        ! m.video  \
       tv2. \
        ! queue \
        ! rtph264pay pt=96 \
        ! udpsink host="192.168.50.3" port=2534 \
     pulsesrc  \
        ! audioconvert \
        ! audioresample \
        ! audio/x-raw,rate=8000,channels=1,depth=8,format=S16LE \
        ! tee name=ta  \
        ! queue \
        ! mulawenc \
        ! tee name=ta2  \
       ta2. \
        ! queue \
        ! rtppcmupay pt=97 \
        ! udpsink host="192.168.50.3" port=2536 \
       ta2. \
        ! queue \
        ! m.audio_0  splitmuxsink location=log%02d.mkv muxer=matroskamux max-size-time=60000000000 name=m 

完整的源代码或最小的可重现示例将有助于更好地帮助您。似乎在上限协商期间未考虑 matroskamux,因此未强制进行 AVC 转换。

理想情况下,您想弄清楚为什么会这样。但是您可以通过在 h264parse 之后放置一个 capsfilter 元素并相应地配置其上限 属性 来简单地强制从 byte-stream 转换为 AVC。例如:

... ! h264parse ! capsfilter caps="video/x-h264,stream-format=avc,alignment=au ! splitmuxsink

h264parse 的输出格式是通过大写字母而不是属性来控制的。