10
votes

I am using OpenCV with ffmpeg on a mac to write video. I've been able to successfully write .avi files using the codec/fourcc code, FMP4. I would like to write .mp4 files, however. When I try to write an .mp4 file using fourcc FMP4 I get this error:

[mp4 @ 0x100b4ec00] Tag FMP4/0x34504d46 incompatible with output codec id '13' ( [0][0][0])

When I use AVC1 I get the following error:

[libx264 @ 0x104003000] broken ffmpeg default settings detected
[libx264 @ 0x104003000] use an encoding preset (e.g. -vpre medium)
[libx264 @ 0x104003000] preset usage: -vpre <speed> -vpre <profile>
[libx264 @ 0x104003000] speed presets are listed in x264 --help
[libx264 @ 0x104003000] profile is optional; x264 defaults to high
Could not open codec 'libx264': Unspecified error

Does anyone here know the right codec to use with OpenCV and ffmpeg to write to an MP4 container on the Mac?

If AVC1 is the right codec, how do I install ffmpeg + OpenCV correctly? I did

brew install gpac
brew install ffmpeg
brew install opencv

The call I am using to open the videowriter:

fourcc = cv2.cv.CV_FOURCC('A', 'V', 'C', '1')   
video_out = cv2.VideoWriter(
    filename=output_filename,
    fourcc=fourcc,
    fps=video_fps,
    frameSize=(video_width,video_height),
    isColor=1)

When I run x264 --help I get

% x264 --help
x264 core:125
Syntax: x264 [options] -o outfile infile

Infile can be raw (in which case resolution is required),
  or YUV4MPEG (*.y4m),
  or Avisynth if compiled with support (no).
  or libav* formats if compiled with lavf support (no) or ffms support (no).
Outfile type is selected by filename:
 .264 -> Raw bytestream
 .mkv -> Matroska
 .flv -> Flash Video
 .mp4 -> MP4 if compiled with GPAC support (no)
Output bit depth: 8 (configured at compile time)

Options:

  -h, --help                  List basic options
      --longhelp              List more options
      --fullhelp              List all options

Example usage:

      Constant quality mode:
            x264 --crf 24 -o <output> <input>

      Two-pass with a bitrate of 1000kbps:
            x264 --pass 1 --bitrate 1000 -o <output> <input>
            x264 --pass 2 --bitrate 1000 -o <output> <input>

      Lossless:
            x264 --qp 0 -o <output> <input>

      Maximum PSNR at the cost of speed and visual quality:
            x264 --preset placebo --tune psnr -o <output> <input>

      Constant bitrate at 1000kbps with a 2 second-buffer:
            x264 --vbv-bufsize 2000 --bitrate 1000 -o <output> <input>

Presets:

      --profile <string>      Force the limits of an H.264 profile
                                  Overrides all settings.
                                  - baseline,main,high,high10,high422,high444
      --preset <string>       Use a preset to select encoding settings [medium]
                                  Overridden by user settings.
                                  - ultrafast,superfast,veryfast,faster,fast
                                  - medium,slow,slower,veryslow,placebo
      --tune <string>         Tune the settings for a particular type of source
                              or situation
                                  Overridden by user settings.
                                  Multiple tunings are separated by commas.
                                  Only one psy tuning can be used at a time.
                                  - psy tunings: film,animation,grain,
                                                 stillimage,psnr,ssim
                                  - other tunings: fastdecode,zerolatency

Frame-type options:

  -I, --keyint <integer or "infinite"> Maximum GOP size [250]
      --tff                   Enable interlaced mode (top field first)
      --bff                   Enable interlaced mode (bottom field first)
      --pulldown <string>     Use soft pulldown to change frame rate
                                  - none, 22, 32, 64, double, triple, euro (requires cfr input)

Ratecontrol:

  -B, --bitrate <integer>     Set bitrate (kbit/s)
      --crf <float>           Quality-based VBR (0-51) [23.0]
      --vbv-maxrate <integer> Max local bitrate (kbit/s) [0]
      --vbv-bufsize <integer> Set size of the VBV buffer (kbit) [0]
  -p, --pass <integer>        Enable multipass ratecontrol
                                  - 1: First pass, creates stats file
                                  - 2: Last pass, does not overwrite stats file

Input/Output:

  -o, --output <string>       Specify output file
      --sar width:height      Specify Sample Aspect Ratio
      --fps <float|rational>  Specify framerate
      --seek <integer>        First frame to encode
      --frames <integer>      Maximum number of frames to encode
      --level <string>        Specify level (as defined by Annex A)
      --quiet                 Quiet Mode

Filtering:

      --vf, --video-filter <filter0>/<filter1>/... Apply video filtering to the input file

      Filter options may be specified in <filter>:<option>=<value> format.

      Available filters:
      crop:left,top,right,bottom
      select_every:step,offset1[,...]

Thanks, -s

3
Containers don't have FOURCCs – only codecs and pixel formats to. FMP4 is MPEG-4 (Part 2) video. What video codec are you using? H.264 / MPEG-4 AVC would be AVC1 or others (see fourcc.org/codecs.php)slhck
Hi, @slhck, that's my question. What video codec should I use when writing to an MP4 container. I've updated the question to be more clear on that point. Thanks.Sameer Parekh
Please provide the full uncut command line you're using, including the complete output. Have you made sure you installed x264 as well? (brew install x264; brew uninstall ffmpeg; brew install ffmpeg)slhck
You might be interested in taking a look at my answer. It's written in python, but it was tested on a Mac OS X. The key is CV_FOURCC('F', 'M', 'P', '4')karlphillip
Any updated on this issue, @Sameer?karlphillip

3 Answers

7
votes

This seems an old question but I will answer it for the benefit of those who stumble upon it. You cannot get ffmpeg working with x264 unless you install ffmpeg from source. So binary installations from package managers will not enable x264 packages. You can binary install x264 (but probably you want to use source to control which version of x264 you want to be compatible with the right version of ffmpeg).

So to answer this question: Your installation needs to install x264 first and then compile ffmpeg with --enable-libx264.

Now there are plenty of guides on how to compile ffmpeg from source. A quick google search threw up this: http://www.martinlos.com/?p=41 for mac and https://ffmpeg.org/trac/ffmpeg/wiki/UbuntuCompilationGuide for ubuntu. I regularly compile from source on ubuntu and know those instructions work and the mac ones seem fine as well.

0
votes

To install ffmpeg, try this one that worked for me:

brew install --build-from-source ffmpeg

-1
votes

It's much easier and just as flexible to install ffmpeg and all its dependencies using Homebrew on Mac:

http://www.renevolution.com/how-to-install-ffmpeg-on-mac-os-x/