I'm having trouble writing h264 video with OpenCV 3 via FFmpeg ("'X','2','6','4'" FOURCC). I've seen all the related posts so far on SO, but nothing helps. Code:
cv::VideoWriter writer(output_path.string(), CV_FOURCC('X','2','6','4'), 60, frame_size);
Output:
OpenCV: FFMPEG: tag 0x34363258/'X264' is not supported with codec id 28 and format 'mp4 / MP4 (MPEG-4 Part 14)' OpenCV: FFMPEG: fallback to use tag 0x00000021/'!???'
The resulting video is extremely small (byte-wise) and unreadable. Setting the four_cc to -1 results in "unknown tag" from FFmpeg, I don't get any prompt to choose codec as others suggested.
The OpenCV 3 doc states:
FFMPEG backend with MP4 container natively uses other values as fourcc code: see ObjectType, so you may receive a warning message from OpenCV about fourcc code conversion.
That page they refrence doesn't have h264 / x264 listed, and I'm not sure how to interpret that statement, since earlier SO posts seem to all list X.2.6.4 as the appropriate code. Using H.2.6.4 actually gives identical output.
Any suggestions / workarounds?
P.S. the ffmpeg is most up-to-date from Ubuntu maintainers, it lists that it was configured with --enable-libx264
EDIT: I tried to use the mkv container instead of mp4. The warning about tag not being supported went away, but the resulting video is still unreadable.
I think your finding here is key:
The mp4 tag values implemented for
ffmpeg
confirm this, and are in theff_mp4_obj_type[]
, inisom.c
. The code in OpenCV'scap_ffmpeg_impl.hpp
likely needs to be updated to support this. I poked around for an hour or two, realized it was non-trivial, and bailed.One work-around is to output to an
.avi
file. There are numerous examples of people having trouble with OpenCV and mp4, and being told to use.mov
or.avi
. (Here's one.)@Greg Kramida: setting
isColor = false
did not help for me: the message remained, and my output file became only ~48 bytes. According to the documentation it is a Windows flag -- whatever it is doing for me on Linux, it isn't good.Did you confirm that you could generate x264 with ffmpeg, by itself?
After confirming that libx264 has value 0x21 when I invoke this on the command line:
I decided to use
0x21
directly intoVideoWriter.open()
. That generates a valid and interpretable video file.For reference, my software is ffmpeg 3.0:
And OpenCV 3.1.0 configured with:
x264 is the
libx264-142:amd64
release for Debian Jessie.The problem had nothing to do with the displayed warning. I was trying to write single-channel images, while the VideoWriter was expecting a 3-channel color image (default value of isColor, the 5-th argument to VideoWriter's constructor, is "true"). The solution was setting isColor to false.
The problem on OpenCV which message is:
It is produced by definitions of CV_FOURCC('H','2','6','4') this value do not corresponds with the value defined on isom.c
Then defining fourcc as 0x21 cv::VideoWriter works smooth,
as Jameson comments above,