Saya sudah terjebak dengan masalah ini selama berbulan-bulan. Saya memiliki lebih dari 50 kaset DV (dari dan camcorder Sony lama) untuk dikonversi ke format yang lebih modern dan bermanfaat (kemungkinan besar H264). Saya sudah mulai dengan menarik file ke PC saya (melalui firewire) menggunakan DVGRAB. Di sana saya memiliki dua opsi: menarik data RAW dari kaset dv, menghasilkan file yang di-mux atau mendemuksikannya dan menyimpannya ke file DVI.
Di situlah masalah dimulai. Menyimpannya ke file DVI mengakibatkan audio menjadi tidak sinkron. Saya pikir ini masalah dengan DVGRAB jadi saya menyimpan file RAW (yang disinkronkan dengan benar) dan ingin memprosesnya dengan ffmpeg.
Ternyata bagaimanapun saya demux, audionya selalu tidak sinkron. SEBELUM Anda mengatakan apa pun tentang frekuensi pengambilan sampel - perbedaan audionya sangat panjang acak. Rekaman satu jam dapat memiliki antara 0,1 dan 4 detik audio lag pada akhirnya.
Berikut ini contoh file yang telah saya bagi menjadi file audio dan video terpisah untuk memeriksa perbedaannya.
# 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
Yang satu ini berbeda dengan 1,448 detik. Seperti yang saya katakan perbedaannya sangat bervariasi.
Adapun solusinya. Saya hanya bisa meregangkan audio dan menggabungkannya dengan video (saya sudah mengujinya), tapi saya tidak bisa memastikan apakah audio akan disinkronkan di suatu tempat di tengah rekaman.
Saya pikir saya sudah menunjukkan sumber perilaku ini. Setiap kali saya menghidupkan atau mematikan kamera (untuk memulai dan berhenti merekam) video mulai sedikit lebih cepat daripada audio. Jadi semakin banyak "fragmen" yang ada di rekaman, semakin banyak perbedaan ini bertambah.
Bagaimana saya bisa memperbaikinya? Apakah ada cara untuk mendemosikan audio dan video dengan cap waktu, sehingga setelah konversi mereka akan bertambah dengan benar? Atau apakah ada cara untuk mengisi celah ini dalam audio, sehingga kedua aliran memiliki ukuran yang sama untuk memulai?
-af adelay=1000|1000
mana 1000 adalah keterlambatan dalam ms.Jawaban:
Berikut adalah tiga upaya wildcard untuk memecahkan masalah ini:
Metode 1a Gunakan waktu sistem sebagai cap waktu
Metode 1b Gunakan resampler dengan flag yang diatur untuk menyuntikkan keheningan ketika cap waktu audio input memiliki celah
Metode 2 Menggabungkan dengan audio boneka
Metode 3 dari 3: Kombinasi di atas
Anda dapat menguji masing-masing untuk jangka waktu pendek dengan memasukkan
-t N
mis-t 20
untuk tes 20 detik.Jika ada yang berfungsi, kita dapat melanjutkan untuk membungkus hasilnya sebagai MP4.
sumber
ffplay method1.ts
Saya akhirnya memecahkan masalah - ini adalah pembunuhan yang berlebihan, tetapi berhasil.
Saya menyadari bahwa jika saya menyalin .dv ke wadah lain, audio dan video jelas tidak sinkron. Lalu saya ingin memotong file itu ke segmen 1 menit mulai dari menit ke-51 (-ss 51:00 -t 60), itu jelas masih tidak sinkron.
Namun, ketika saya menggunakan potongan yang sama (-ss 51:00 -t 60) pada .dv yang asli, file itu sinkron! Jadi apa yang akhirnya saya lakukan adalah saya menulis sebuah skrip yang memotong file .dv menjadi segmen 1 detik setiap detik dan menyimpannya ke file yang terpisah (ya lebih dari 3.600 file per .dv). Tanpa pengodean, cukup streaming salinan ke wadah baru (avi). Lalu saya menggunakan -f concat, untuk meletakkan file-file kecil ke dalam satu file avi, yang sudah disinkronkan sekarang! Setiap celah tidak terdengar! Semua yang tersisa adalah pengkodean H264 dan AAC ke MP4.
Saya menjalankan skrip di server rumah saya yang sedang menggiling 50 file .dv selama beberapa hari, tetapi sekarang sudah selesai!
TERIMA KASIH SEMUA UNTUK ANDA BANTUAN! Saya telah belajar banyak tentang ffmpeg dan a / v secara umum.
sumber
Saya memiliki pengaturan serupa dengan audio yang sama dari masalah sinkronisasi. Saya juga berhasil mereproduksi klip dengan audio yang tidak sinkron. Jika ada yang mau sampel, silakan tanyakan.
Saya mungkin telah menemukan solusi untuk masalah ini. Kino sudah sangat tua dan tidak lagi menggunakan perangkat lunak yang memiliki kemampuan untuk memuat .dv dari dvgrab (mentah) dan mengekspor lagi sebagai file .dv atau dv1 / avi (atau dv2 / avi) dengan "sampel ulang" audio. . Nah, hasilnya adalah file yang diperbaiki yang akan disinkronkan dengan baik sebelum dan sesudah transcode 'ffmpeg'.
Ada beberapa kelemahan. Kino dapat berhenti bekerja atau bahkan tidak akan bekerja sama sekali karena ini sudah tua. Saya baru saja menginstalnya dari 'aur' (Arch linux) dan saya dapat menggunakannya secara langsung. Tidak ada antarmuka baris perintah. Saya tidak dapat menemukan cara untuk mengotomatisasi ini.
SUNTING:
Mungkin ada solusi lain. Saya pikir masalahnya adalah bit mulai dan berhenti aliran entah bagaimana rusak, dan kode waktu semakin buruk. Saya memiliki beberapa klip tampaknya memiliki tanggal dari tahun '2068'. Bagaimanapun, Anda dapat menggunakan 'dvgrab' lagi untuk memisahkan klip setiap kali ia berpikir ada aliran rekaman baru:
'-a' melakukan pemisahan otomatis, '-srt' dan '-t' membantu melacak file (membangun srt dengan tanggal dan menambahkan tanggal ke file, masing-masing). Ini akan membuat file baru untuk setiap aliran baru . Karena setiap awal aliran disinkronkan, Anda dapat 'ffmpeg' secara individual. Tampaknya setiap file berisi kode waktu dari "sesi" asli (seperti dvgrab menyebutnya) jadi, jika Anda menyatukan semua file langsung dengan ffmpeg Anda masih mendapatkan sinkronisasi yang sama.
sumber