工具/软件:
您好、
我尝试使用 gstreamer 合成器混合多个视频、当我使用 gstreamer 组合 FullHD 视频时、CPU 利用率增加。 请建议、TDA4AH 具有任何用于 gstreamer 视频混合的硬件加速器。 O
我正在将“GST-launch-1.0"命令“命令与“compositor"结合“结合使用、以混合多个“appsrc"元素“元素。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:
您好、
我尝试使用 gstreamer 合成器混合多个视频、当我使用 gstreamer 组合 FullHD 视频时、CPU 利用率增加。 请建议、TDA4AH 具有任何用于 gstreamer 视频混合的硬件加速器。 O
我正在将“GST-launch-1.0"命令“命令与“compositor"结合“结合使用、以混合多个“appsrc"元素“元素。
您好 Suresh、
您可以使用 tiovxmosaic 插件将多个视频合并到一个流中。
https://github.com/TexasInstruments/edgeai-gst-plugins/wiki/tiovxmosaic
此致、
Jared
您好 Jared McArthur、
感谢您的答复。
我想组合多个 appsrc 视频、我按照 vision_apps/apps/basic_demos/app_multi_cam_codec 中提供的示例代码来保存使用 h264 编码器的视频。
此示例使用 gstreamer 包装器函数 appCodecInit ()、appCodecSrcInit ()、appCodecStart ()、appCodecDeqAppSrc ()、appCodecEnqAppSrc () 和 appCodecEnqEosAppSrc () 从 appsrc 源创建 h264 编码视频输出。
我想在 gstreamer 流水线中使用 gstreamer 合成器/tiovxmosaic 与 GStreamer 包装器功能、创建多个视频源的组合视频输出。
我用于将一个 appsrc 和 videotest 模式与 appCodecInit() 混合的命令如下所示。
appsrc name=myAppSrc0 format=3 is-live=true do-timestamp=true ! 视频转换! 视频/x-RAW、宽度=1920、高度=1080! 排队! mix.sink_0 videotestsrc pattern=SMPTE! 视频/x-RAW、宽度=640、高度=640! mix.sink_1 tiovxmosaic name=mix sink_0::xpos=0 sink_1::xpos=1920! 视频转换! v4l2h264enc extra-controls=“controls, frame_level_rate_control_enable=1、video_bitrate=10000000\“ ! h264parse! mp4mux! filesink location=output_video.mp4
此命令正在创建一个带有 0 字节的 mp4 文件。
当我以相同的流程使用以下命令时、我将获得一个包含 appsrc 相机图像的 mp4 文件。
appsrc name=myAppSrc0 format=3 is-live=true do-timestamp=true ! 视频转换! 视频/x-RAW、宽度=1920、高度=1080! 排队! 视频转换! v4l2h264enc extra-controls=“controls, frame_level_rate_control_enable=1、video_bitrate=10000000\“ ! h264parse! mp4mux! filesink location=output_video.mp4
您是否支持获取将 tiovxmosaic 与 appsrc 源元素结合使用的命令?
此致、
Suresh K
您好 Suresh、
video/x-raw、width=640、height=640
看起来您的 videotestsrc 的大小不正确。
您能否在 tiovxmosaic 之后添加 CAP 滤波器?
video/x-raw, format=NV12, width=3840, height=2160[报价 userid=“574088" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1544801/tda4vh-q1-gstreamer-compositor-hardware-accelerator/5947073
您是否可以测试输出到 kmssink 现在进行测试?
[/报价]您可以尝试一下吗? 如果您可以看到正在输出/显示的内容、它可能有助于调试。
此致、
Jared
谢谢 Jared McArthur,
我能够使用 tiovxmosaic 对视频流进行马赛克。
具体命令如下。
appsrc name=myAppSrc0 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! comp.sink_0 appsrc name=myAppSrc1 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! comp.sink_1 appsrc name=myAppSrc2 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! comp.sink_2 appsrc name=myAppSrc3 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! comp.sink_3 appsrc name=myAppSrc4 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! comp.sink_4 appsrc name=myAppSrc5 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! comp.sink_5 appsrc name=myAppSrc6 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! COMP.SINK_6 tiovxmosaic name=comp SINK_0::startx=“<0>" SINK_0“ SINK_0:::starty=“<0>" SINK_1“ SINK_1::startx=“<1280>" SINK_1“ SINK_1::starty=“<0>" SINK_2“ SINK_2::startx=“<starty>" SINK_2“ SINK_2:::::starty=“<starty="Sink:“:<starty=“720">:“:<starty=“4">:“:<starty_SINK_4>“ Sink:<starty>:<starty>:<starty>:<starty>:<starty>:<starty>:<starty> 视频转换! v4l2h264enc extra-controls=“controls, frame_level_rate_control_enable=1、video_bitrate=10000000“! h264parse! mp4mux! filesink location=output_file_1.mp4
所有 appsrc 输入都具有相同的分辨率 1280x720。 我想合并不同分辨率的视频,我在用不同的分辨率更改大写字母后尝试了,但它不会生成输出文件。
请建议、我是否可以使用 tiovxmosaic 组合具有不同分辨率的视频?
Regads、
Suresh K
您好 Jared McArthur、
感谢您的答复。 我想针对 appsrc 输入合并多个具有不同分辨率的视频、 并遵循 RTOS SDK 11_00_00_06 中提供的 gst_wrapper.c 文件。 在此中、仅为一个通道配置输入宽度和高度。 对于 appsrc 各个通道的不同分辨率、我更新了函数 appGstSrcInit 指定 gst_wrapper c 如下所示。 将 IN_HEIGHT 和 IN_WIDTH 更新为数组元素、以便为每个通道保存不同的值。

使用 GST 命令更新应用程序代码、如下所示。
appsrc name=myAppSrc0 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=1280、高度=720 ! comp.sink_0 appsrc name=myAppSrc1 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=640、高度=720 ! comp.sink_1 appsrc name=myAppSrc2 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=1280、高度=720 ! comp.sink_2 appsrc name=myAppSrc3 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=640、高度=720 ! comp.sink_3 appsrc name=myAppSrc4 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=1280、高度=720 ! comp.sink_4 appsrc name=myAppSrc5 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=1280、高度=720 ! comp.sink_5 appsrc name=myAppSrc6 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=1280、高度=720 ! COMP.SINK_6 tiovxmosaic name=comp SINK_0::startx=“<0>" SINK_0“ SINK_0:::starty=“<0>" SINK_1“ SINK_1::startx=“<1280>" SINK_1“ SINK_1::starty=“<0>" SINK_2“ SINK_2::startx=“<2560>" SINK_2“ SINK_2:::starty=“<0>" SINK_3“ SINK_3::startx=“<starty="Sink:“:<720“>:<starty>“Sink:<starty=“720":“:<starty_SINK_4>“ 视频转换! v4l2h264enc extra-controls=“controls, frame_level_rate_control_enable=1、video_bitrate=10000000“! h264parse! mp4mux! filesink location=output_file.mp4
当我将所有宽度和高度分别配置为 1280 和 720 时、上述命令在使数据 tr idx 值排队的第二次迭代中停止、但相同的命令可以正常工作并生成输出文件。
我是否需要更新 gst-wrapper.c 文件中的包装器函数以获取不同的分辨率输入?
此外、请建议如何检查 TDA4 中的 h264 编码器硬件负载。
此致、
Suresh K
您好 Suresh、
感谢您的回复。 我想针对 appsrc 输入合并多个具有不同分辨率的视频、 并遵循 RTOS SDK 11_00_00_06 中提供的 gst_wrapper.c 文件。 在此中、仅为一个通道配置输入宽度和高度。 对于 appsrc 各个通道的不同分辨率、我更新了函数 appGstSrcInit 指定 gst_wrapper c 如下所示。 将 IN_HEIGHT 和 IN_WIDTH 更新为数组元素、以便为每个通道保存不同的值。
您不必更改任何源代码即可使用具有不同分辨率输入的 tiovxmosaic。
当我将所有宽度和高度分别配置为 1280 和 720 时、上述命令在第二次数据导入 idx 值队列时停止、但相同的命令可以正常工作并生成输出文件。
您能否在马赛克后添加 GST 上限?
[报价 userid=“656787" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1544801/tda4vh-q1-gstreamer-compositor-hardware-accelerator/5967525此外、请建议如何检查 TDA4 中的 h264 编码器硬件负载。
[/报价]
请为此问题打开其他主题。
此致、
Jared
您好 Jared McArthur、
Gstremer 和 tiovxmosaic 支持不同的分辨率输入。
使用 GST_Wrapper 函数时、 它只有一个用于所有通道输入的输入分辨率参数。

在 gst_wrapper.c 文件中、 所有通道的平面大小按如下方式进行配置。


int32_t appGstSrcInit(void* data_ptr[CODEC_MAX_BUFFER_DEPTH][CODEC_MAX_NUM_CHANNELS][CODEC_MAX_NUM_PLANES])
{
int32_t status = 0;
GstCaps* caps = NULL;
app_gst_wrapper_obj_t* p_gst_pipe_obj = &g_app_gst_wrapper_obj;
uint32_t plane_size = p_gst_pipe_obj->params.in_width * p_gst_pipe_obj->params.in_height;
/* Setup AppSrc Elements */
for (uint8_t ch = 0; ch < p_gst_pipe_obj->params.in_num_channels; ch++)
{
p_gst_pipe_obj->m_srcElemArr[ch] = findElementByName(p_gst_pipe_obj->m_pipeline,
p_gst_pipe_obj->params.m_AppSrcNameArr[ch]);
if (p_gst_pipe_obj->m_srcElemArr[ch] == NULL)
{
printf("gst_wrapper: findElementByName() FAILED! %s not found\n", p_gst_pipe_obj->params.m_AppSrcNameArr[ch]);
status = -1;
}
else
{
p_gst_pipe_obj->isAppSrc = GST_IS_APP_SRC(p_gst_pipe_obj->m_srcElemArr[ch]);
if (p_gst_pipe_obj->isAppSrc)
{
caps = gst_caps_new_simple("video/x-raw",
"width", G_TYPE_INT, p_gst_pipe_obj->params.in_width,
"height", G_TYPE_INT, p_gst_pipe_obj->params.in_height,
"format", G_TYPE_STRING, p_gst_pipe_obj->params.in_format,
NULL);
if (caps == NULL)
{
printf("gst_wrapper: gst_caps_new_simple() FAILED!\n");
status = -1;
}
gst_app_src_set_caps (GST_APP_SRC(p_gst_pipe_obj->m_srcElemArr[ch]), caps);
gst_caps_unref (caps);
}
else
{
printf("gst_wrapper: %s not an AppSrc element\n", p_gst_pipe_obj->params.m_AppSrcNameArr[ch]);
status = -1;
}
}
}
/* Setup GstBuffers to push to AppSrc Elements using given data_ptrs */
if (status==0)
{
for (uint8_t idx = 0; idx < p_gst_pipe_obj->params.in_buffer_depth && status==0; idx++)
{
for (uint8_t ch = 0; ch < p_gst_pipe_obj->params.in_num_channels && status==0; ch++)
{
p_gst_pipe_obj->buff[idx][ch] = gst_buffer_new();
p_gst_pipe_obj->mem[idx][ch][0] = gst_memory_new_wrapped (0, data_ptr[idx][ch][0], plane_size, 0, plane_size, NULL, NULL);
p_gst_pipe_obj->mem[idx][ch][1] = gst_memory_new_wrapped (0, data_ptr[idx][ch][1], plane_size/2, 0, plane_size/2, NULL, NULL);
gst_buffer_append_memory (p_gst_pipe_obj->buff[idx][ch], p_gst_pipe_obj->mem[idx][ch][0]);
gst_buffer_append_memory (p_gst_pipe_obj->buff[idx][ch], p_gst_pipe_obj->mem[idx][ch][1]);
p_gst_pipe_obj->mem[idx][ch][0] = gst_buffer_get_memory (p_gst_pipe_obj->buff[idx][ch], 0);
p_gst_pipe_obj->mem[idx][ch][1] = gst_buffer_get_memory (p_gst_pipe_obj->buff[idx][ch], 1);
gst_memory_map(p_gst_pipe_obj->mem[idx][ch][0],&p_gst_pipe_obj->map_info[idx][ch][0], GST_MAP_WRITE);
gst_memory_map(p_gst_pipe_obj->mem[idx][ch][1],&p_gst_pipe_obj->map_info[idx][ch][1], GST_MAP_WRITE);
}
}
}
if (status==0) p_gst_pipe_obj->push_count = 0;
return status;
}
由于上述函数将支持 appsrc 的不同通道的单输入分辨率,请说明如果 appsrc 的每个通道的输入分辨率不同,如何继续进行。
我想 使用 GST_Wrapper 函数组合具有不同分辨率的 appsrc 输入。