Ffmpeg аудио из синхронизации при транскодировании (демуксировании) из DV

Я застрял с этой проблемой в течение нескольких месяцев. У меня есть более 50 DV-лент (от и старой видеокамеры Sony) для преобразования в более современный, удобный формат (скорее всего, H264). Я начал с извлечения файлов на свой компьютер (через firewire) с помощью DVGRAB. Там у меня было два варианта: вытягивание необработанных данных с ленты dv, в результате чего получился muxed-файл или демуксирование его и сохранение в DVI-файл.

вот где начались проблемы. Сохранение его в файл DVI привело к аудио из синхронизация. Я думал, что это проблема с DVGRAB, поэтому я сохранил RAW-файлы (которые синхронизированы правильно) и хотел обработать их с помощью ffmpeg.

оказывается, что независимо от того, как я demux его звук всегда из синхронизации. Прежде чем вы скажете что-нибудь о частоте дискретизации - звуковые различия имеют абсолютно случайную длину. Часовая лента может иметь от 0,1 до 4 секунд задержки звука в конце.

вот пример файла, который я разделил на отдельные аудио и видео файлы для проверки различий.

# ffprobe -i ./video_conversion/13.dv 
ffprobe version 2.8.4 Copyright (c) 2007-2015 the FFmpeg developers
  built with gcc 5.3.0 (GCC)
  configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libdcadec --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-shared --enable-version3 --enable-x11grab
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
[dv @ 0x864f2a0] Detected timecode is invalid
[dv @ 0x864f2a0] Estimating duration from bitrate, this may be inaccurate
Input #0, dv, from './video_conversion/13.dv':
  Duration: 01:00:45.80, start: 0.000000, bitrate: 28800 kb/s
    Stream #0:0: Video: dvvideo, yuv420p, 720x576 [SAR 16:15 DAR 4:3], 28800 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc
    Stream #0:1: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s

# ffprobe -i ./video_conversion/tmp/13.mp4
ffprobe version 2.8.4 Copyright (c) 2007-2015 the FFmpeg developers
  built with gcc 5.3.0 (GCC)
  configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libdcadec --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-shared --enable-version3 --enable-x11grab
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './video_conversion/tmp/13.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.40.101
  Duration: 01:00:45.80, start: 0.000000, bitrate: 5685 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 720x576 [SAR 16:15 DAR 4:3], 5683 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler

# ffprobe -i ./video_conversion/tmp/13.mp3
ffprobe version 2.8.4 Copyright (c) 2007-2015 the FFmpeg developers
  built with gcc 5.3.0 (GCC)
  configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libdcadec --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-shared --enable-version3 --enable-x11grab
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
[mp3 @ 0x954c2a0] Skipping 0 bytes of junk at 237.
Input #0, mp3, from './video_conversion/tmp/13.mp3':
  Metadata:
    encoder         : Lavf56.40.101
  Duration: 01:00:44.35, start: 0.023021, bitrate: 128 kb/s
    Stream #0:0: Audio: mp3, 48000 Hz, stereo, s16p, 128 kb/s
    Metadata:
      encoder         : Lavc56.60

этот отличается 1.448 секунд. Как я уже сказал, различия сильно различаются.

а для решения. Я мог бы просто растянуть звук и объединить его с видео (я проверил это), но я не могу быть уверен, что звук будет синхронизирован где-то в середине записи.

Я думаю, что я точно определил источник такого поведения. Всякий раз, когда я включаю или выключаю камеру (как начать и остановить запись) видео начинается немного быстрее, чем звук. Так что чем больше "фрагментов" на ленте, тем больше эти различия складываются.

Как я могу это исправить? Есть ли способ, чтобы извлекать аудио и видео с временными метками, так что после преобразования они будут суммироваться правильно? Или есть в любом случае, чтобы заполнить эти пробелы в аудио, так что оба потока одинакового размера, чтобы начать с?

29
задан Wojciech
12.04.2023 16:07 Количество просмотров материала 2654
Распечатать страницу

3 ответа

вот три подстановки попытки решить эту проблему:

метод 1a использовать время системы, как метки

ffmpeg -use_wallclock_as_timestamps 1 -i input.dv \
       -c:v libx264 -b:v 4000k -c:a aac -b:a 128k -fflags +genpts method1.ts

метод 1b использовать resampler с флагом, установленным для введения тишины, когда входные аудио метки имеют пробелы

ffmpeg -i input.dv -c:v libx264 -b:v 4000k \
       -af "aresample=async=1:first_pts=0" -c:a aac -b:a 128k -fflags +genpts method1.ts

Способ 2 объединить с фиктивным аудио

ffmpeg -i input.dv -f lavfi -i "aevalsrc=0:c=2:s=48000" \
       -filter_complex "[0:a][1:a]amerge[a]" -map 0:v -map "[a]" -c:v libx264 -b:v 4000k -c:a aac -b:a 128k -ac 2 -shortest method2.ts

Способ 3 сочетание из вышеуказанное

ffmpeg -use_wallclock_as_timestamps 1 -i input.dv -f lavfi -use_wallclock_as_timestamps 1 -i "aevalsrc=0:c=2:s=48000" \
       -filter_complex "[0:a][1:a]amerge[a]" -map 0:v -map "[a]"  -c:v libx264 -b:v 4000k -c:a aac -b:a 128k -ac 2 -shortest method3.ts

вы можете испытать каждое из их для краткости длительность путем вставки -t N например -t 20 для 20-секундного теста.

если любой из них работает, мы можем перейти к обертыванию вывода в формате MP4.

6
отвечен Gyan 2023-04-13 23:55

Я наконец - то решил вопрос-это перебор, но он работает.

Я понял, что если я копирую .ДВ к любому другому контейнеру, аудио и видео очевидно из синхронизации. Затем я хотел сократить этот файл до 1-минутного сегмента, начинающегося на 51-й минуте (- ss 51:00-t 60), очевидно, он все еще не синхронизирован.

однако, когда я использовал тот же разрез (- ss 51: 00-t 60) на оригинале .dv это было синхронно! Так что в итоге я написал сценарий. что резать .файл ДВ в 1 второй этап каждую секунду и сохраненный этому в отдельные файлы (да над 3600 файлами в .дифференциальный клапан.) Нет кодировки, просто поток скопировать в новый контейнер (avi). Затем я использовал-F concat, чтобы поместить крошечные файлы в один файл avi, который был синхронизирован сейчас! Любые пробелы неслышимы! Осталось только закодировать H264 и AAC в MP4.

Я запустил скрипт на моем домашнем сервере, который шлифовал 50 .dv файлы в течение нескольких дней, но теперь это сделано!

СПАСИБО ВСЕ ДЛЯ ВАС, ПОМОГИТЕ! Я много узнал о ffmpeg и A / v в целом.

0
отвечен Wojciech 2023-04-14 02:12

У меня есть аналогичная настройка с той же проблемой синхронизации звука. Мне также удалось воспроизвести клип с аудио синхронизации. Если кто-то хочет образцы, пожалуйста, спросите.

Я, возможно, нашел решение этой проблемы. Kino очень старое и больше не поддерживаемое програмное обеспечение которое имеет возможность для того чтобы нагрузить a .ДВ от dvgrab (сырье) и снова экспорт .dv или dv1/avi (или dv2/avi) файл с" повторной выборкой " аудио. Ну, выход a исправлено файл, который будет хорошо синхронизирован до и после транскодирования 'ffmpeg'.

есть некоторые минусы. Кино может прекратить работу или даже не будет работать вообще, так как это старое. Я просто установил его из' aur ' (Arch linux), и я смог использовать его просто. Отсутствует интерфейс командной строки. Я не мог найти способ автоматизировать это.

EDIT:

там может быть другое решение. Я думаю, проблема в том, что стартовые и стоповые биты потока каким-то образом ломаются, и временной код становится хуже. У меня есть несколько клипов, которые имеют дату с 2068 года. Во всяком случае, вы можете использовать' dvgrab ' снова для разделения клипов каждый раз, когда он думает, что есть новый поток записи:

dvgrab -I input -size 0 -a -format=raw -showstatus -srt -t output

' - a ' выполняет автоматическое разделение,'- srt 'и'- t ' помогают отслеживать файлы (создает srt с датами и добавляет дату к файлам соответственно). Это создаст новый файл для каждого нового поток. Поскольку начало каждого потока синхронизировано, вы можете 'ffmpeg' их индивидуально. Кажется, что каждый файл содержит временной код исходного "сеанса" (как называет его dvgrab), поэтому, если вы объединяете все файлы непосредственно с ffmpeg, вы все равно получаете то же самое из синхронизации.

0
отвечен Noeljunior 2023-04-14 04:29

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх