使用FFmpeg转码GoToMeeting输出时出现问题

时间:2014-03-26 23:08:04

标签: video ffmpeg transcoding

我有一个噩梦,将使用最新OS X版本录制的GoToMeeting输出转码为可播放的网页。无论我使用什么设置,我最终会遇到时间同步问题,至少在这个特定的录音中。

.mov文件如下所示。请注意它的可变帧速率,并且因为它主要只是PowerPoint演示文稿的屏幕录像,偶尔会有鼠标移动,输出也应该是VFR,以生成一个小文件,但仍然保留偶尔的运动。

$ 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

.mov文件(我遗憾地无法公开发布)在我使用的任何应用程序中正常播放:VLC,Media Player Classic和QuickTime。但是,播放转码后的输出始终会出现以下症状:

  • 音频与视频显示的内容不同步,有时会在此三小时录制结束时关闭几分钟
  • 对于Media Player Classic,点击时间线上的某个位置实际上会将播放头移动到我点击的附近附近的某个位置,但不会直接在其上。

我可以使用.mp4编码的参数,可以在支持H.264的所有浏览器中播放。请注意,这是在Windows上,但Linux表现出同样的问题。

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

除了那些不言自明或微不足道的论点之外的论点:

  • -filter_complex:从视频裁剪多余的letterboxing /邮箱,并将宽高比设置为1:1(方形像素)(Safari需要的东西),然后覆盖PNG的水印并将输出调整为720p
  • -crf 30:以恒定质量,可变比特率编码视频
  • -ac 1 -ar 16000:使用16 KHz的单声道音频进行编码
  • -strict -2 -profile:v baseline -level 3:使用FFmpeg"实验"编码使用Baseline level 3配置文件实现Web兼容性的H.264编码器

请注意,是的,这最初会转到MKV容器,因为由于某种原因,直接编码到.mp4容器会挂起FFmpeg。然后,我使用-acodec copy -vcodec copy将音频和视频流直接复制到.mp4容器中。最后,我将输出通过MP4Box进行交错,以便逐步下载。

转码时,FFmpeg确实会丢帧,我怀疑这与问题有关,输出如下:

FFmpeg: frame=  232 fps= 26 q=24.0 size=    5983kB time=00:32:44.57 bitrate=  24.9kbits/s dup=0 drop=1487

当我稍后尝试将其从此临时.mp4容器中复制到.mkv容器中时,我收到大量警告:

[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.

如果源文件确实存在问题,我现在不会感到惊讶。但是,如果是这样,我需要明确证明 它是如何被破坏的。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我也一直在努力解决这个问题。帮助我的是:

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

用户发布了:

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

所以我用过:

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:outFile.mp4