2

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?

user3466413
  • 805
  • 1
  • 7
  • 16
  • I am not exactly certain of what you are asking. Could you clarify please? – Adam Zuckerman Mar 26 '14 at 23:26
  • My question is: how do I encode this file such that it's still variable framerate, web-playable as an MP4 in all browsers, _and_ the audio remains in sync with the video? The first two issues are already addressed, but the last isn't; the audio gets badly out of sync. – user3466413 Mar 26 '14 at 23:56

1 Answers1

1

I've been struggling with this too. What helped me was at:

http://forum.doom9.org/showthread.php?t=163290

A user posted:

ffmpeg -fflags +genpts+igndts -i -r:v 30 -vsync 2 -async 1 -map 0:v,0:a -map 0:a

So I used:

nice -n 7 ffmpeg -fflags +genpts+igndts -i inFile.mov -c:v libx264 -preset slow -level 30 -qmin 38 -qmax 55 -movflags faststart -r:v 10 -vsync 2 -async 1 -map 0:v,0:a -map 0:a outFile.mp4

JasonWilson
  • 136
  • 7