FFMpeg Конвертировать AVI в MP4 - аудио / видео из синхронизации - PullRequest
1 голос
/ 06 марта 2011

У меня есть приложение, которое позволяет пользователям записывать видео со своих веб-камер. Пользователи записывают 3 клипа, которые затем объединяются в одно видео для воспроизведения.

У меня проблемы с аудио и видео на третьем клипе, которые иногда не синхронизируются после преобразования в MP4.

Вот как этот процесс работает сейчас -

Объедините видеофайлы AVI и вставьте видео переходов между ними, используя Mencoder для объединения AVI-файлов.

mencoder.exe -oac copy -ovc copy -idx -o test.avi c:\temp\*.avi 

Я получаю эту ошибку:

Muxer frame buffer cannot allocate memory!

1 duplicate frame(s)! 
1 duplicate frame(s)! 
1 duplicate frame(s)!
1 duplicate frame(s)! 
1 duplicate frame(s)! 
1 duplicate frame(s)!

Однако видео комбинируется с avi, и этот AVI воспроизводится без каких-либо проблем с синхронизацией звука.

Переиндексация с использованием mencoder

mencoder.exe -idx TEST.AVI 

На этом этапе видео по-прежнему воспроизводится как AVI.

Преобразование AVI в MP4 с использованием пакетного файла ffmpeg:

set FFMPEG_DATADIR=c:\Presets
ffmpeg.exe -i "test.avi" -s 640x480 -y -strict experimental -acodec aac \
   -ab 128k -ac 2 -ar 48000 -vcodec libx264 -vpre medium -vpre ipod640 -r 24 \
   -g 48 -b 520000 -threads 64 "out.mp4"

Все это должно быть сделано программно (без программного обеспечения для редактирования видео) с использованием инструментов командной строки в Windows.

Вот примеры файлов avi и mp4. Синхронизация аудио / видео происходит около отметки 1:03. AVI не выходит из синхронизации, в то время как MP4 делает.

http://trtemp.s3.amazonaws.com/new.avi

http://trtemp.s3.amazonaws.com/new.mp4

У кого-нибудь есть предложения, чтобы это исправить?

1 Ответ

3 голосов
/ 07 марта 2011

Пара вещей:

  • Я не нахожу исходную композитную синхронизацию звука совершенно точной.Было бы интересно также увидеть оригинальные три исходных клипа.Общее правило - всегда начинать с максимально возможного качества источника.
  • Можем ли мы предположить, что три клипа источника также имеют 16-битный стереозвук 48 кГц?Если там происходит преобразование, то, возможно, это проблема.
  • Внутренний кодек FACmpeg aac является экспериментальным, и поэтому у вас должен быть этот переключатель -strict experimental.Поскольку у вас возникают проблемы с синхронизацией звука, это очевидная проблемная область.Попробуйте использовать libfaac , если доступно.(Возможно, вам придется создать свой собственный компилятор FFmpeg.)
  • Использование -threads 64 не приведет к ускорению работы независимо от того, сколько у вас ядер.Следуйте общепринятому соглашению о # core * 3 / 2. Итак, если у вас 4 ядра, мачта будет 4 * 3 / 2 = 6.Мои собственные эксперименты с -threads показывают уменьшение доходности с каждым потоком более 4-6, что обнуляет ( нет преимущество вообще) по сравнению с 12-16 потоками.В лучшем случае 64 потока не будут иметь никакого влияния.В худшем случае он будет медленнее или ухудшать качество вашего результата.
  • Поэкспериментируйте с опцией -copyts. «Копировать метки времени со входа на выход.»
  • Поэкспериментируйте с переключателем -async.

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

...