Ffmpeg генерирует аудио-видеофайл вне синхронизации

Я пытаюсь преобразовать видео flv в mp4 с помощью a264, но в результате видео имеет не синхронизированный звук/видео. Звук выглядит нормально, но видео кажется медленным и, следовательно, не синхронизируется с аудио.

Вот команда, которую я запускаю:

/opt/local/bin/ffmpeg -i complaint.flv -f mp4 -vcodec libx264 -acodec aac -copyts -strict experimental -fpre /opt/local/share/ffmpeg/libx264-lossless_slow.ffpreset -ab 44k -threads 0 -crf 23 complaint.mp4

И вывод:

Desktop  /opt/local/bin/ffmpeg -i complaint.flv -f mp4 -vcodec libx264 -acodec aac -copyts -strict experimental -fpre /opt/local/share/ffmpeg/libx264-lossless_slow.ffpreset -ab 44k -threads 0 -crf 23 complaint.mp4
ffmpeg version 0.7.8, Copyright (c) 2000-2011 the FFmpeg developers
  built on Jan 12 2012 21:12:26 with gcc 4.2.1 (Apple Inc. build 5666) (dot 3)
  configuration: --prefix=/opt/local --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libdirac --enable-libschroedinger --enable-libopenjpeg --enable-libxvid --enable-libx264 --enable-libvpx --enable-libspeex --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/gcc-4.2 --arch=x86_64 --enable-yasm
  libavutil    50. 43. 0 / 50. 43. 0
  libavcodec   52.123. 0 / 52.123. 0
  libavformat  52.111. 0 / 52.111. 0
  libavdevice  52.  5. 0 / 52.  5. 0
  libavfilter   1. 80. 0 /  1. 80. 0
  libswscale    0. 14. 1 /  0. 14. 1
  libpostproc  51.  2. 0 / 51.  2. 0
[flv @ 0x7fe57a04ac00] Estimating duration from bitrate, this may be inaccurate
Input #0, flv, from 'complaint.flv':
  Metadata:
    duration        : 7
    creationdate    : Thu Jan 12 23:47:24
    description     : Recorded using VideoRecording example.
  Duration: 00:00:06.61, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: flv, yuv420p, 288x288, 1k tbr, 1k tbn, 1k tbc
    Stream #0.1: Audio: nellymoser, 11025 Hz, mono, s16
File 'complaint.mp4' already exists. Overwrite ? [y/N] y
[buffer @ 0x7fe579c32cc0] w:288 h:288 pixfmt:yuv420p tb:1/1000000 sar:0/1 sws_param:
[libx264 @ 0x7fe57a044600] using cpu capabilities: none!
[libx264 @ 0x7fe57a044600] profile High, level 4.2
[libx264 @ 0x7fe57a044600] 264 - core 118 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=2 deblock=1:0:0 analyse=0x3:0x33 me=umh subme=6 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.41 aq=1:1.00
Output #0, mp4, to 'complaint.mp4':
  Metadata:
    duration        : 7
    creationdate    : Thu Jan 12 23:47:24
    description     : Recorded using VideoRecording example.
    encoder         : Lavf52.111.0
    Stream #0.0: Video: libx264, yuv420p, 288x288, q=0-69, 200 kb/s, 1k tbn, 1k tbc
    Stream #0.1: Audio: aac, 11025 Hz, mono, s16, 44 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press [q] to stop, [?] for help
frame= 6557 fps=106 q=-1.0 Lsize=     685kB time=00:00:03.62 bitrate=1549.1kbits/s dup=6367 drop=0    
video:615kB audio:17kB global headers:0kB muxing overhead 8.361360%
frame I:27    Avg QP:19.98  size:  8242
[libx264 @ 0x7fe57a044600] frame P:6530  Avg QP:30.71  size:    62
[libx264 @ 0x7fe57a044600] mb I  I16..4: 11.1% 79.3%  9.6%
[libx264 @ 0x7fe57a044600] mb P  I16..4:  0.1%  0.2%  0.0%  P16..4:  1.2%  0.2%  0.3%  0.0%  0.0%    skip:98.0%
[libx264 @ 0x7fe57a044600] 8x8 transform intra:77.8% inter:64.9%
[libx264 @ 0x7fe57a044600] coded y,uvDC,uvAC intra: 75.3% 81.3% 33.3% inter: 0.5% 0.7% 0.1%
[libx264 @ 0x7fe57a044600] i16 v,h,dc,p: 78%  9% 10%  3%
[libx264 @ 0x7fe57a044600] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 35% 11% 32%  3%  4%  5%  2%  5%  4%
[libx264 @ 0x7fe57a044600] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 56%  7%  9%  3%  4%  7%  3%  7%  3%
[libx264 @ 0x7fe57a044600] i8c dc,h,v,p: 45% 15% 34%  6%
[libx264 @ 0x7fe57a044600] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x7fe57a044600] ref P L0: 80.5%  9.5% 10.0%
[libx264 @ 0x7fe57a044600] kb/s:767.20

Есть ли что-то, что мне не хватает, чтобы убедиться, что видео и аудио идеально подходят?

Ответ 1

Для тех, кто может это попробовать, мне было лучше записать флеш-память в h264 сразу, вместо использования yuv420p для аудиокодека. Это работало как шарм. Добавление флага -async 1 также помогло.

Обновление: проверьте этот бит в документации ffmpeg (http://ffmpeg.org/ffmpeg.html):

-async: метод аудиосинхронизации. "Растягивает/сжимает" аудиопоток в соответствии с отметками времени, параметр - это максимальные сэмплы в секунду, с помощью которых звук изменяется. -async 1 - это особый случай, когда исправляется только начало аудиопотока без какой-либо последующей коррекции. Этот параметр устарел. Вместо этого используйте звуковой фильтр aresample.

Здесь вы можете прочитать про фильтр aresample: http://ffmpeg.org/trac/ffmpeg/wiki/FilteringGuide