我一直在使用gst-launch实用程序对GStreamer进行一些实验。然而,最终的目标是在我自己的应用程序上使用GStreamer库实现相同的功能。
问题是,最终很难(至少对于不习惯GStreamer API的人)将我在命令行上测试的内容"移植"到C/c++代码中。
我可能需要移植的命令的一个例子是:gst-launch filesrc location="CLIP8.mp4" ! decodebin2 ! jpegenc ! multifilesink location="test%d.jpg"
把这样的命令用C语言写在我自己的应用程序上,最"直接"的方法是什么?
另外,作为一个侧面问题,我怎么能用在内存上做这项工作的可能性来取代多文件链接(我使用OpenCV对应该从视频中提取的给定图像执行一些计算)。是否有可能直接解码到内存并立即使用它而不首先保存到文件系统?它可以(也应该)是顺序的,我的意思是,它只会在处理完当前帧后移动到下一帧,这样我就不必在内存中保留数千帧。
你说呢?
我找到了解决方案。GStreamer中内置了一个函数,它解析gst-launch参数并返回一个管道。该函数名为gst_parse_launch,文档如下:http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstParse.html
我还没有测试过,但它可能是最快的解决方案,转换什么已经在命令行测试到C/c++代码。
您总是可以弹出gst-launch
的源代码并抓取解析命令行并将其转换为GStreamer管道的位。
这样你就可以把"命令行"作为一个字符串传入,函数将为你返回一个完整的管道。
顺便说一下,有一个有趣的GStreamer元素,它提供了一种将处理管道集成到(C/c++)应用程序中的好方法:appsink
http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-appsink.html 有了这个,你基本上可以在一个大的C数组中从管道中检索帧,并对它们做任何你想做的事情。您设置了一个回调函数,它将在每次从管道线程中获得可用的新帧时被激活…