write video in OpenCV FOURCC codec

2.7k Views Asked by At

I am trying to save the results of YOLO to .avi file. Having already seen this post... (I even asked the question there) I could NOT find any solution. Here is the code in which I am trying to save the .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);
}

Trying plenty of codecs ( changing CV_FOURCC('D', 'I', 'V', 'X') ) I get errors below:

**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

Here is my setup

-ubuntu 16.04

-opencv 3.3.0

-ffmpeg version 2.8.14

In my opinion, the problem is very likely to be about codecs. Because people solved the same problem by using different codecs. Even though I tried many codecs and have ffmepeg installed correctly I could NOT find any solution. So what should I do? Looking forward to your replies...

1

There are 1 best solutions below

9
On

You are not using ffmpeg to create the video, you should first check, as @zindarod points out, if OpenCV was built with ffmpeg. For that, you can run the following code in C++:

#include <opencv2/opencv.hpp>

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

One other thing DO NOT USE C API unless it is necessary. It is deprecated and should not be used, specially if your code is in C++ as the tag of your question suggest.

In the C++ API you can actually select a different backend. Take a look to the documentation of VideoWriter.

cv::VideoWriter::VideoWriter ( const String & filename, int apiPreference, int fourcc, double fps, Size frameSize, bool isColor = true )

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. The apiPreference parameter allows to specify API backends to use. Can be used to enforce a specific reader implementation if multiple are available: e.g. cv::CAP_FFMPEG or cv::CAP_GSTREAMER.

This mean, if both are installed and OpenCV was built with the support from both you can switch it to your liking :)

GStreamer is not a bad backend to use, I actually use it, but I use it more to open videos rather than creating ones, but you need to have the plugins installed to make it work with more codecs... The gstreamer webpage recommends to install it like this:

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

The 1.0 may change depending on the version you are using already.

I hope this solves your problem, if not just leave a comment.