I am trying to convert mythtv recorded mpg (mpeg2) files into streamable mp4 files. Converting to an mp4 is simple, however, the entire file must be converted first before it is usable. Even using conversion tools that put the "mov atom" at the start of the file for quick streaming require that the entire mp4 be encoded before that happens.
I read on avconv docs that "The mov/mp4/ismv muxer supports fragmentation." which can put a "fake" mov atom at the start of the file and then puts a new one at each keyframe throughout the file so the video can be streamed while it is being transcoded or if the conversion is interrupted.
I believe I have followed the avconv instructions (http://libav.org/avconv.html#MOV_002fMP4_002fISMV) on how to convert a file, but continue to get errors that indicate the encoder does not understand the parameters. Below is my command, and the error output it generates. I have exhausted google and myself searching for answers and have come up blank so any help would be greatly appreciated.
System running ubuntu 12.04x64 with avconv version 0.8.1-4:0.8.1-0ubuntu1.
Command:
avconv -i 1081_20111227200000.mpg -f mp4 -movflags frag_keyframe+empty_moov -c:v libx264 -c:a copy output.mp4
Error:
[mp4 muxer @ 0x36772e0] [Eval @ 0x7fffeddb69b0] Undefined constant or missing '(' in 'frag_keyframe'
[mp4 muxer @ 0x36772e0] Unable to parse option value "frag_keyframe+empty_moov"
[mp4 muxer @ 0x36772e0] Error setting option movflags to value frag_keyframe+empty_moov.
Output #0, mp4, to 'output.mp4':
Stream #0.0: Video: libx264, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=-1--1, 90k tbn, 29.97 tbc
Stream #0.1(eng): Audio: ac3, 48000 Hz, 5.1, 384 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (mpeg2video -> libx264)
Stream #0:1 -> #0:1 (copy)
Could not write header for output file #0 (incorrect codec parameters ?)
I have tried different muxers (-f parameters like h264 etc) and had other errors like the movflag wasn't even supported (logical).
Am I missing a package, dependency, or just the point? Thanks in advance.
There is a bug filed with libav about this exact issue. Depressingly, is doesn't seem to be addressed. I think it's best to consider avconv a good encoding tool, but not a good encapsulating tool.
The best way to go about it is to use MP4Box from GPAC. It's a utility which seems to be primarily concerned with encapsulating media streams into mp4 files. It does not do en/de/transcoding, for instance. If you install GPAC on Ubuntu, you can say:
MP4Box by default makes the mp4 files streamable:
See here: it's an ffmpeg guide, but it applies equally well to avconv.
I don't know about creating files for streaming, but the error could be because you are missing out on a preset, and also possibly a quality setting (though I believe that avconv uses -crf 23 as the default, if no other quality setting is provided). Try:
The presets are: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower and veryslow. The faster presets will give you faster encodes, but larger files, while the slower ones have smaller files, but take longer to make. There is no quality difference between the different presets. There is also a 'placebo' preset, but that's a joke by the x264 developers, and should be ignored.
If that doesn't work, you could try using:
20 is completely arbitrary, choose whatever crf setting works best for you. Lower=better picture quality, but larger file size. According to that guide, you should probably use between 18-28.