I'm having a nightmare of a time transcoding output from GoToMeeting, recorded using the latest OS X version, to something web-playable. No matter what settings I use, I end up with time syncing problems, at least with this particular recording.
The .mov
file looks like this. Note that it's variable framerate, and because it's mostly just a screencast of a PowerPoint presentation with occasional mouse movement, the output should be VFR too to produce a small file yet still preserve occasional motion.
$ ffmpeg -i original.mov
ffmpeg version N-58273-g18df75f Copyright (c) 2000-2013 the FFmpeg developers
built on Nov 19 2013 10:34:42 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libass --enable-libcelt --enable-libfaac --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-openssl --enable-libopus --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvo-aacenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --prefix=/usr/local
libavutil 52. 53.100 / 52. 53.100
libavcodec 55. 43.101 / 55. 43.101
libavformat 55. 21.100 / 55. 21.100
libavdevice 55. 5.100 / 55. 5.100
libavfilter 3. 91.100 / 3. 91.100
libswscale 2. 5.101 / 2. 5.101
libswresample 0. 17.104 / 0. 17.104
libpostproc 52. 3.100 / 52. 3.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f822980a000] decoding for stream 0 failed
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'original.mov':
Metadata:
major_brand : qt
minor_version : 537199360
compatible_brands: qt
creation_time : 2014-03-20 02:09:22
Duration: 03:08:26.72, start: 0.000000, bitrate: 75 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv), 1368x728 [SAR 1:1 DAR 171:91], 20 kb/s, 0.60 fps, 600 tbr, 600 tbn, 1200 tbc (default)
Metadata:
creation_time : 2014-03-20 02:09:22
handler_name : Apple Alias Data Handler
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 16000 Hz, mono, fltp, 47 kb/s (default)
Metadata:
creation_time : 2014-03-20 02:09:22
handler_name : Apple Alias Data Handler
Stream #0:2(eng): Data: none (rtp / 0x20707472), 6 kb/s
Metadata:
creation_time : 2014-03-20 02:09:22
handler_name : Apple Alias Data Handler
Stream #0:3(und): Data: none (rtp / 0x20707472), 0 kb/s
Metadata:
creation_time : 2014-03-20 02:09:22
handler_name : Apple Alias Data Handler
The .mov
file (which I unfortunately cannot publicly post) plays back properly in any application I use: VLC, Media Player Classic, and QuickTime. However, playing the transcoded output always exhibits the following symptoms:
- Audio out of sync with what the video is showing, sometimes to the order of minutes off towards the end of this three hour recording
- In the case of Media Player Classic, clicking a spot on the timeline actually moves the playhead to a spot on the timeline near where I clicked, but not directly on it.
There are the arguments I'm using for a .mp4
encoding that is playable in all browsers that support H.264. Note that this is on Windows but Linux exhibits the same problems.
ffmpeg.exe -y -i original.mov -i watermark.png -filter_complex "[0:v] crop=1184:720:178:6,scale=1184:720,setsar=1/1; [0:v][1:v] overlay=1242:648 [0:v]" -vcodec libx264 -acodec libvo_aacenc -q:a 80 -crf 30 -ac 1 -ar 16000 -strict -2 -profile:v baseline -level 3 outout.mkv
The arguments, other than those that are self-explanatory or trivial:
-filter_complex
: Crop excess letterboxing/pillarboxing from the video and set the aspect ratio to 1:1 for square pixels (something Safari needed), then overlay a watermark from a PNG and resize the output to 720p-crf 30
: encode the video at constant quality, variable bitrate-ac 1 -ar 16000
: encode with mono audio at 16 KHz-strict -2 -profile:v baseline -level 3
: encode using FFmpeg's "experimental" H.264 encoder using the Baseline level 3 profile for web compatibility
Note that yes, this goes to an MKV container initially because, for some reason, encoding directly to a .mp4
container hangs FFmpeg. I then use -acodec copy -vcodec copy
to copy the audio and video streams directly into a .mp4
container. Finally I pass the output through MP4Box to interleave it so it can be progressively downloaded.
When transcoding, FFmpeg does drop frames, which I suspect is related to the problem, with output like this:
FFmpeg: frame= 232 fps= 26 q=24.0 size= 5983kB time=00:32:44.57 bitrate= 24.9kbits/s dup=0 drop=1487
When I then later attempt to mux it into the .mp4
container from this temporary .mkv
container, I get a flood of warnings like this:
[mp4 @ 0297cd00] Non-monotonous DTS in output stream 0:0; previous: 6341306, current: 6007024; changing to 6341307. This may result in incorrect timestamps in the output file.
Now I wouldn't be surprised if there is indeed some problem with the source file. However, if so, I need to definitively prove just how it's broken.
Any thoughts?