【问题标题】:write video in OpenCV FOURCC codec在 OpenCV FOURCC 编解码器中编写视频
【发布时间】:2019-01-02 00:22:01
【问题描述】:

我正在尝试将YOLO 的结果保存到.avi 文件中。已经看过this post...(我什至在那里问了这个问题)我找不到任何解决方案。这是我试图保存.avi的代码。

{
    CvSize size;
    size.width = disp->width;
    size.height = disp->height;

    static CvVideoWriter* output_video = NULL;    // cv::VideoWriter output_video;
    if (output_video == NULL)
    {
        printf("\n SRC output_video = %p \n", output_video);
        const char* output_name = "test_dnn_out.avi";
        output_video = cvCreateVideoWriter(output_name, CV_FOURCC('D', 'I', 'V', 'X'), 25, size, 1);
        printf("\n cvCreateVideoWriter, DST output_video = %p  \n", output_video);
    }
    cvWriteFrame(output_video, disp);
}

尝试大量编解码器(更改 CV_FOURCC('D', 'I', 'V', 'X'))我收到以下错误:

**CODEC :-1**

**ERROR**

SRC output_video = (nil)  OpenCV: FFMPEG: tag 0xffffffff/'����' is not
found (format 'avi / AVI (Audio Video Interleaved)')' OpenCV Error:
Unsupported format or combination of formats (Gstreamer Opencv backend
does not support this codec.) in CvVideoWriter_GStreamer::open, file
/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp, line
1522 VIDEOIO(cvCreateVideoWriter_GStreamer (filename, fourcc, fps,
frameSize, is_color)): raised OpenCV exception:

/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp:1522:
error: (-210) Gstreamer Opencv backend does not support this codec. in
function CvVideoWriter_GStreamer::open


**CODEC: CV_FOURCC('M', 'J', 'P', 'G')**

**ERROR**

SRC output_video = (nil)  OpenCV Error: Unspecified error (GStreamer:
cannot put pipeline to play ) in CvVideoWriter_GStreamer::open, file
/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp, line
1690 VIDEOIO(cvCreateVideoWriter_GStreamer (filename, fourcc, fps,
frameSize, is_color)): raised OpenCV exception:

/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp:1690:
error: (-2) GStreamer: cannot put pipeline to play  in function
CvVideoWriter_GStreamer::open


**CODEC: CV_FOURCC('P','I','M','1')** SRC output_video = (nil) 

**ERROR**

** (Demo:6801): CRITICAL **: gst_ffmpeg_cfg_set_property: assertion 'qdata- 
size == sizeof (gint64)' failed OpenCV Error: Unspecified
error (GStreamer: cannot put pipeline to play ) in
CvVideoWriter_GStreamer::open, file
/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp, line
1690 VIDEOIO(cvCreateVideoWriter_GStreamer (filename, fourcc, fps,
frameSize, is_color)): raised OpenCV exception:

/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp:1690:
error: (-2) GStreamer: cannot put pipeline to play  in function
CvVideoWriter_GStreamer::open



**CODEC:CV_FOURCC('M', 'P', '4', '2')**

**ERROR**

SRC output_video = (nil) 

** (Demo:7437): CRITICAL **: gst_ffmpeg_cfg_set_property: assertion 'qdata- 
size == sizeof (gint64)' failed OpenCV Error: Unspecified
error (GStreamer: cannot put pipeline to play ) in
CvVideoWriter_GStreamer::open, file
/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp, line
1690 VIDEOIO(cvCreateVideoWriter_GStreamer (filename, fourcc, fps,
frameSize, is_color)): raised OpenCV exception:

/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp:1690:
error: (-2) GStreamer: cannot put pipeline to play  in function
CvVideoWriter_GStreamer::open


**CODEC::CV_FOURCC('D', 'I', 'V', '3')**

**ERROR** 

SRC output_video = (nil)  OpenCV Error: Unspecified error (GStreamer:
cannot put pipeline to play ) in CvVideoWriter_GStreamer::open, file
/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp, line
1690 VIDEOIO(cvCreateVideoWriter_GStreamer (filename, fourcc, fps,
frameSize, is_color)): raised OpenCV exception:

/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp:1690:
error: (-2) GStreamer: cannot put pipeline to play  in function
CvVideoWriter_GStreamer::open


**CODEC:CV_FOURCC('D', 'I', 'V', 'X')**

**ERROR** 

SRC output_video = (nil)  OpenCV Error: Unspecified error (GStreamer:
cannot put pipeline to play ) in CvVideoWriter_GStreamer::open, file
/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp, line
1690 VIDEOIO(cvCreateVideoWriter_GStreamer (filename, fourcc, fps,
frameSize, is_color)): raised OpenCV exception:

/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp:1690:
error: (-2) GStreamer: cannot put pipeline to play  in function
CvVideoWriter_GStreamer::open



**CODEC:CV_FOURCC('U', '2', '6', '3')**

**ERROR** 

OpenCV Error: Unspecified error (GStreamer: cannot put pipeline to
play ) in CvVideoWriter_GStreamer::open, file
/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp, line
1690 VIDEOIO(cvCreateVideoWriter_GStreamer (filename, fourcc, fps,
frameSize, is_color)): raised OpenCV exception:

/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp:1690:
error: (-2) GStreamer: cannot put pipeline to play  in function
CvVideoWriter_GStreamer::open


cvCreateVideoWriter, DST output_video = (nil)  

SRC output_video = (nil)  Could not open codec 'h263': Unspecified
error

** (Demo:8342): CRITICAL **: gst_ffmpeg_cfg_set_property: assertion 'qdata- 
size == sizeof (gint64)' failed



**CODEC:CV_FOURCC('I', '2', '6', '3')**

**ERROR** 

SRC output_video = (nil)  Could not find encoder for codec id 21:
Encoder not found OpenCV Error: Unspecified error (GStreamer: cannot
link elements ) in CvVideoWriter_GStreamer::open, file
/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp, line
1626 VIDEOIO(cvCreateVideoWriter_GStreamer (filename, fourcc, fps,
frameSize, is_color)): raised OpenCV exception:

/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp:1626:
error: (-2) GStreamer: cannot link elements  in function
CvVideoWriter_GStreamer::open


cvCreateVideoWriter, DST output_video = (nil)  


**CODEC:CV_FOURCC('F', 'L', 'V', '1')**

**ERROR** 

SRC output_video = (nil)  OpenCV Error: Unspecified error (GStreamer:
cannot link elements ) in CvVideoWriter_GStreamer::open, file
/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp, line
1626 VIDEOIO(cvCreateVideoWriter_GStreamer (filename, fourcc, fps,
frameSize, is_color)): raised OpenCV exception:

/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp:1626:
error: (-2) GStreamer: cannot link elements  in function
CvVideoWriter_GStreamer::open


cvCreateVideoWriter, DST output_video = (nil)


**CODEC:CV_FOURCC('i','Y', 'U', 'V')**

**ERROR** 

SRC output_video = (nil)  OpenCV: FFMPEG: tag 0x56555969/'iYUV' is not
supported with codec id 14 and format 'avi / AVI (Audio Video
Interleaved)' OpenCV Error: Unsupported format or combination of
formats (Gstreamer Opencv backend does not support this codec.) in
CvVideoWriter_GStreamer::open, file
/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp, line
1522 VIDEOIO(cvCreateVideoWriter_GStreamer (filename, fourcc, fps,
frameSize, is_color)): raised OpenCV exception:

/home/akde/opencv-3.3.0/modules/videoio/src/cap_gstreamer.cpp:1522:
error: (-210) Gstreamer Opencv backend does not support this codec. in
function CvVideoWriter_GStreamer::open

这是我的设置

-ubuntu 16.04

-opencv 3.3.0

-ffmpeg version 2.8.14

在我看来,问题很可能与编解码器有关。因为人们通过使用不同的编解码器解决了同样的问题。即使我尝试了许多编解码器并正确安装了ffmepeg,我也找不到任何解决方案。所以我该怎么做?期待您的回复...

【问题讨论】:

  • 你的 OpenCV 没有构建 FFmpeg 支持。在cv2.getBuildInformation()的输出中检查FFmpeg的值。

标签: c++ opencv video ffmpeg fourcc


【解决方案1】:

您没有使用 ffmpeg 创建视频,您应该首先检查,正如@zindarod 指出的那样,OpenCV 是否是使用 ffmpeg 构建的。为此,您可以在 C++ 中运行以下代码:

#include <opencv2/opencv.hpp>

int main(void)
{
  std::cout << cv::getBuildInformation() << std::endl;
}

另一件事除非必要,否则不要使用 C API。它已被弃用且不应使用,特别是如果您的代码是 C++ 中的代码,正如您问题的标签所建议的那样。

在 C++ API 中,您实际上可以选择不同的后端。看看documentation of VideoWriter

cv::VideoWriter::VideoWriter ( const String & 文件名, int apiPreference, int Fourcc, double fps, Size frameSize, bool isColor = true )

这是一个重载的成员函数,是为了方便而提供的。它 与上述函数的不同之处仅在于它接受的参数。 apiPreference 参数允许指定要使用的 API 后端。能 如果有多个,则用于强制执行特定的读取器实现 可用:例如cv::CAP_FFMPEG 或 cv::CAP_GSTREAMER。

这意味着,如果两者都已安装并且 OpenCV 是在两者的支持下构建的,您可以根据自己的喜好切换它:)

GStreamer 不是一个不好用的后端,我实际上使用它,但我更多地使用它来打开视频而不是创建视频,但你需要安装插件以使其与更多编解码器一起使用......@ 987654322@建议这样安装:

apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools

1.0 可能会根据您已经使用的版本而改变。

我希望这能解决您的问题,如果不只是发表评论的话。

【讨论】:

  • 当我尝试执行您在 vs 代码中编写的代码时,出现以下错误:/tmp/ccMqUUra.o: In function cv::String::~String()': /usr/local/include/opencv2/core/cvstd.hpp:647: undefined reference to cv::String::deallocate()' / tmp/ccMqUUra.o:在函数 cv::String::operator=(cv::String const&amp;)': /usr/local/include/opencv2/core/cvstd.hpp:655: undefined reference to cv::String::deallocate()' collect2:错误:ld 返回 1 退出状态终端进程以退出代码终止:1 正在尝试修复该问题。如果您有任何意见,我们非常欢迎。
  • @burakakdemir 看起来像一个链接问题,请确保您正在链接 opencv 库(或 opencv_world,如果您已编译)。如果我没记错的话,这个应该是 opencv_core
  • 我只是运行您使用以下给出的代码:g++ -std=c++11 Hello.cpp pkg-config --libs --cflags opencv -o HelloWorld,这是结果的相关部分:FFMPEG :是的| avcodec:是(版本 56.60.100)| avformat:是(版本 56.40.101)| avutil:是(版本 54.31.100)| swscale:是(版本 3.1.101)| avresample:是(版本 2.1.0)| GStreamer:|基础:是(版本 1.8.3)|视频:是(版本 1.8.3)|应用程序:是(版本 1.8.3)|即兴演奏:是(版本 1.8.3)| pbutils: YES (ver 1.8.3) 那么这是否意味着 gstreamer 可以? PS:我已经用你给的命令安装了gstreamer
  • @burakakdemir 基本上它告诉您可以使用 FFMPEG 或 GS​​treamer。如果您安装了插件,您问题中的代码是否会出现相同的错误?尽管如此,我还是建议避免使用 C 接口,而使用 C++ 接口,您可以在其中选择 GStreamer 或 FFMPEG
  • 感谢您的回复。如何检查插件是否已安装。关于 c 接口,我正在尝试实现暗网论坛和 git bcs 中建议的方法,我在 linux 中没有扎实的背景。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 2020-03-15
  • 2018-03-18
  • 1970-01-01
  • 2022-01-11
  • 2011-06-16
  • 1970-01-01
相关资源
最近更新 更多