使用 gstreamer 的应用程序和应用程序修改视频
Modify video with gstreamer's appsrc and appsink
我正在用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无法播放该文件。播放机可能不支持文件类型,或者可能不支持用于压缩文件的编解码器。
我得到了使用解码的提示,我找到了一个decodebin元素,并在不修改接收器的情况下将其添加到源管道:
"filesrc location="%s" ! decodebin ! appsink name=testsink", input_filename
之后,该程序工作时间更长,并因错误而崩溃:
(CudaGStreamer.exe:8428):GLib错误**:gmem.c:100:未能分配3110507字节
我在谷歌上搜索了这个问题,但还没有找到解决方案,所以我想知道你是否可以告诉我我做错了什么。
版本:
Windows 8.1 x64
Visual Studio 2015
gstreamer-1.0-devel-x86-.12.3.msi
gstreamer-1.0-x6-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
- 当您在不使用decodbin的情况下修改数据时,它不起作用,因为您正在损坏压缩的二进制数据。媒体播放器无法播放流,因为您已损坏它
- 您之所以会出现gst-mem错误,主要是因为您没有对appsink中的一个缓冲区执行unref()操作,这会导致内存泄漏
经过更多的挖掘,我解决了它。
首先,我取消了对以下行的注释,看看会发生什么,它"神奇地"阻止了我的程序从分配错误中跌落:
/* uncomment the next line to block when appsrc has buffered enough */
g_object_set (testsource, "block", TRUE, NULL);
然后我注意到输出视频仍然不可播放,并决定第二个管道上的流需要编码(因为在第一个管道中完成了解码)来编写实际的MP4视频。
我接受了来自的命令
如何使用gst-launch-1.0将I420帧转换为BGRA格式?
和
Gstreamer-1.0:mp4容器中的mux原始视频
获取接收器管道:
"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的视频,再次出现分配错误。内存泄漏?每当我试图释放或取消释放未释放或未释放的指针时,我都会遇到各种错误,也许应该用另一种方式来完成?我很困惑。
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- 修改多线程应用程序中的对象
- 当该应用程序中加速文件的最后一个修改时间发生更改时,如何重新启动应用程序
- 如何从功能(C UWP应用程序)中修改按钮内容
- 使用 gstreamer 的应用程序和应用程序修改视频
- 在任务管理器中修改应用程序图标,而不是在系统托盘中
- 修改OBJ文件链接到的源文件会破坏应用程序吗
- 在 Windows 中修改文件夹时通知我的应用程序
- win32 DialogBox() 和 MAKEINTRESOURCE():如何修改应用程序的 UI?
- 检查文件是否在应用程序外部被修改
- 如何检测桌面应用程序是否被修改
- 对 c++ 应用程序进行更新和修改
- 如何在CGI应用程序中解析HTML文件并修改其内容?C++
- 图像大小调整:我应该做哪些修改?(windows应用程序,vc++)
- 在Xcode中修改大量代码,而不会破坏已经运行的应用程序