使用GStreamer的appsrc和appink修改视频

2022-08-11 00:00:00 gstreamer c++

我正在用GStreamer构建我的第一个应用程序,我的任务是从互联网上获取一个流,使用CUDA对其进行修改(更改像素)以并行计算帧,并输出修改后的流。

为简单起见,目前我使用MP4视频在磁盘上读写,不使用CUDA。

我在这个网站上找到了一个例子:

https://fossies.org/linux/gst-plugins-base/tests/examples/app/appsink-src.c

来布置结构。作为gst_parse_Launch()的参数的源和接收器管道:

"filesrc location="%s" ! appsink name=testsink", input_filename
"appsrc name=testsource ! filesink location="%s"", output_filename

当未对框架进行任何更改时,该程序即可运行。但当我尝试设置GstMapInfo.data中的值时,我无法再打开视频:

Windows Media Player无法播放该文件。播放机可能不支持该文件类型,或者可能不支持用于压缩文件的编解码器。

给了我一个使用解码的提示,我找到了一个decdebin元素,并将其添加到源管道中,而不修改接收器:

"filesrc location="%s" ! decodebin ! appsink name=testsink", input_filename

之后,程序运行时间更长,崩溃并出现错误:

(CudaGStreamer.exe:8428):Glib-Error**:gMem.c:100:分配3110507字节失败

我已经在谷歌上搜索了这个问题,但还没有找到解决方案,所以我想也许你能告诉我我做错了什么。

版本:

  • Windows 8.1 x64

  • Visual Studio 2015

  • gStreamer-1.0-devel-x86-1.12.3.msi

  • gStreamer-1.0-x86-1.12.3.msi

    两者均从https://gstreamer.freedesktop.org

    加载
  • GTK+3.6.4(已修补)

  • Glib 2.34.3

    GTK+捆绑包加载自http://www.tarnyko.net/repo/gtk3_build_system/gtk+-bundle_3.6.4-20130513_win32.zip

编码:https://pastebin.com/GTSiaFXd


解决方案

经过进一步挖掘,我解决了。

首先,我取消了以下行的注释,以查看会发生什么情况,并"神奇地"使我的程序从分配错误中停止:

/* uncomment the next line to block when appsrc has buffered enough */
g_object_set (testsource, "block", TRUE, NULL);

然后我注意到输出的视频仍然无法播放,决定第二个流水线上的流需要编码(因为在第一个流水线解码)才能写入实际的MP4视频。

我接受以下命令:

How to convert I420 frames to BGRA format with gst-launch-1.0?

Gstreamer-1.0: mux raw video in a mp4 container

获取接收器管道:

"appsrc name=testsource ! "
"videoparse width=560 height=320 format=i420 framerate=24/1 ! "
"autovideoconvert ! x264enc ! h264parse ! mp4mux ! "
"filesink location="%s"",
output_filename

剩下的就是从源视频获取宽度和高度。

以下是一个工作示例(仍需调整):https://pastebin.com/J6pPcTjN

编辑:

我处理了更多的代码,获得了30MB的视频,但再次出现分配错误。内存泄漏?每当我试图释放或取消引用一个未被释放或取消引用的指针时,我都会收到各种错误,也许应该用另一种方式来完成?我搞糊涂了。

相关文章