GStreamer 与 FFmpeg

Posted

技术标签:

【中文标题】GStreamer 与 FFmpeg【英文标题】:GStreamer vs FFmpeg 【发布时间】:2012-02-02 04:26:58 【问题描述】:

我尝试使用 OpenCV 框架录制视频,并希望将其与一些额外的数据流一起保存到 Matroska(mkv) 容器中。

首先我认为使用 FFmpeg 就是这样。 但是在查看 OpenCV 源代码并在网上搜索时,我发现了 GStreamer。

因为 GStreamer 中的文档比 FFmpeg 文档要好得多,所以我更喜欢使用这个框架。

据我了解,GStreamer 主要用于流式传输,但也可以对视频数据进行 rncode 和复用。

使用 GStreamer 代替 FFmpeg 有什么缺点吗?

提前致谢 霍斯特

【问题讨论】:

【参考方案1】:

我尝试使用 OpenCV 框架录制视频并希望将其保存到 Matroska(mkv) 中

我不认为 OpenCV 可以将视频存储为 MKV,

连同一些额外的数据流。

OpenCV 不提供此操作的功能。

简单的解决方法是简单地调用 ffmpeg 或 gstreamer 的命令行应用程序为您进行转换。

GStreamer 确实有一个不错的文档,它也可以完成这项工作。明显的缺点是,如果您知道如何使用 FFmpeg,则更改为 GStreamer 将需要一些额外的时间来了解它的工作原理,因为两者都有完全不同的 API:GStreamer 架构的灵感来自 DirectShow 和 Quicktime。

优势是 GStreamer(除了跨平台之外)被用于多个大型项目,了解 GStreamer 肯定会为您的编程库增加一项很棒的技能强>。

【讨论】:

OpenCV 将其数据输出存储在代理的概念和模式上。您可以使用 Ffmpeg 代理、Gstreamer 代理,甚至是 图像代理,这是一种适用于(可能包括其他)JPEG 图像的零代理。看看this paste 的the cvCreateVideoWriter function。例如,我用来配置一个普通的 OpenCV,没有大量的代理配置,只处理图像并在外部调用 Ffmpeg 进行视频复用和解复用。【参考方案2】:

我认为使用 gstreamer 没有任何缺点。事实上,我认为 gstreamer 是一个框架,而不仅仅是一个工具或单一用途的库。您可以使用它来开发自己的插件,这些插件可以无缝地挂接到 gstreamer 管道中。

【讨论】:

【参考方案3】:

您可以通过 ffmpeg 或 gstreamer 后端使用 OpenCv VideoWriter 并进行比较。例如(您可以适应您的平台插件和视频模式):

# Using ffmpeg backend
cv::VideoWriter ffmpeg_h264_writer ("test-ffmpeg-h264-writer.mkv",
   cv::CAP_FFMPEG,
   cv::VideoWriter::fourcc ('X', '2', '6', '4'),
   fps,
   cv::Size (width, height));

# Using gstreamer backend:
cv::VideoWriter gst_omxh264_writer ("appsrc ! queue ! videoconvert ! video/x-raw,format=I420 ! queue ! omxh264enc ! video/x-h264,format=byte-stream ! matroskamux ! filesink location=test-gstreamer-omxh264-writer.mkv ",
   cv::CAP_GSTREAMER,
   0,
   fps, 
   cv::Size (width, height));

其中宽度和高度是整数值,fps 是浮点值。

【讨论】:

以上是关于GStreamer 与 FFmpeg的主要内容,如果未能解决你的问题,请参考以下文章

Gstreamer开发环境安装与测试

GStreamer基础教程03 - 媒体类型与Pad

gstreamer 与 x264enc 的复用

如何将 Opencv VideoWriter 与 GStreamer 一起使用?

Gstreamer中的视频处理与硬件加速

使用 ANativeWindow_lock 返回错误 -22 与 android Gstreamer SDK