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的视频板的
首先我拿到pad模板
video_pad_template = gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (splitmuxsink),
“视频”);
接下来我使用请求垫获取垫
pad = tee_pad = gst_element_request_pad (splitmuxsink,
video_pad_template,
NULL,
NULL);
之后我正常加入
'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 的输出格式是通过大写字母而不是属性来控制的。
我需要上述方法将具有流格式字节流的 h264 流转换为 avc(一种打包格式),以便将其馈送到 matroskamux
我已经使用 C 代码对我的管道进行编程,并且我尝试在提供给 matroskamux 之前使用 h264parse 元素,但它只是简单地解析它而不更改流格式。
结果如下
然而,当我尝试使用命令行界面来编写我用来模拟相同效果的静态管道时。奇迹般地,结果正是我所需要的,而且我几乎没有使用其他 h264parse 属性。我可以获得喂养 matroskamux
所需的东西结果
我试图找出为 h264parse 设置的 属性 是什么,但其中的 none 似乎能够显式转换为另一种格式。还有什么可以将流字节打包成avc吗?还是我必须用力垫?
我在 ARM 平台上使用 vpuh264_enc,因此可用的插件选择有限,但我仍然很高兴听到我能做些什么来解决这个问题。
谢谢
============================================= =============
更多信息:
我是怎么得到splitmuxsink的视频板的
首先我拿到pad模板
video_pad_template = gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (splitmuxsink), “视频”);
接下来我使用请求垫获取垫
pad = tee_pad = gst_element_request_pad (splitmuxsink, video_pad_template, NULL, NULL);
之后我正常加入
'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 的输出格式是通过大写字母而不是属性来控制的。