我一直在使用gst-launch实用程序对GStreamer进行一些实验。但是,最终目标是使用GStreamer库在我自己的应用程序上实现相同的功能。
问题是,最终很难(至少对于那些不习惯使用GStreamer API的人来说)将我在命令行上测试的内容“移植”到C / C ++代码。
我可能需要移植的命令示例是:
gst-launch filesrc location="CLIP8.mp4" ! decodebin2 ! jpegenc ! multifilesink location="test%d.jpg"
采用这种命令并在我自己的应用程序中用C语言编写它的最“直截了当”的方式/方法是什么。
另外,作为一个附带问题,我怎么能用在内存上做这项工作的可能性替换multifilesink(我正在使用OpenCV对应该从视频中提取的给定图像执行一些计算)。是否可以直接解码到内存并立即使用它而无需先保存到文件系统?它可以(也应该)是顺序的,我的意思是在我完成处理当前帧之后只会继续下一帧,这样我就不必在内存中保留数千帧。
你说什么?
答案 0 :(得分:13)
我找到了解决方案。 GStreamer内置了一个函数,可以解析gst-launch参数并返回一个管道。该函数名为gst_parse_launch,在此处记录:http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstParse.html
我还没有测试过它,但它可能是最快的解决方案,可以将在命令行上测试的内容转换为C / C ++代码。
答案 1 :(得分:3)
您可以随时弹出the source of gst-launch
并抓取解析命令行的位并将其转换为GStreamer管道。
这样你只需将“命令行”作为字符串传递,该函数将为你返回一个完整的管道。
答案 2 :(得分:1)
顺便说一下,有一个有趣的GStreamer元素,它提供了一种将处理管道集成到(C / C ++)应用程序中的好方法:appsink
使用这个,您基本上可以从大型C数组中的管道中检索帧,并随心所欲地执行任何操作。您设置了一个回调函数,每次从管道线程中获得新帧时都会激活该函数...