【问题标题】:Modify video with gstreamer's appsrc and appsink使用 gstreamer 的 appsrc 和 appsink 修改视频
【发布时间】:2018-05-02 02:05:19
【问题描述】:

我正在使用 GStreamer 构建我的第一个应用程序,我的任务是从 Internet 获取流,使用 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 无法播放该文件。播放器可能不支持文件类型或可能不支持用于压缩文件的编解码器。

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

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

之后该程序运行时间更长并因错误而崩溃:

(CudaGStreamer.exe:8428): GLib-ERROR **: gmem.c:100: 分配 3110507 字节失败

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

版本:

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

【问题讨论】:

    标签: c++ gstreamer


    【解决方案1】:
    1. 当您修改数据而不使用 decodebin 时它不起作用,因为您损坏了压缩的二进制数据。媒体播放器无法播放流,因为您已损坏它。
    2. 您收到 gst mem 错误主要是因为您没有对您的应用程序接收器中的一个缓冲区执行 unref(),这会导致内存泄漏

    【讨论】:

    • 我尝试了 gst_object_unref() 或 gst_buffer_unref() 其中之一,得到断言失败错误(G_IS_OBJECT 或 GS​​T_IS_BUFFER)
    【解决方案2】:

    经过更多的挖掘,我解决了它。

    首先,我取消了以下行的注释以查看会发生什么,并且“神奇地”阻止了我的程序从分配错误中掉下来:

    /* 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

    编辑:

    我使用了更多代码,获得了 30 MB 的视频,但又遇到了分配错误。内存泄漏?每当我尝试释放或取消引用未释放或未引用的指针时,我都会收到各种错误,也许应该以另一种方式完成?我很困惑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-14
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多