Dalam ffmpeg, bagaimana cara menunda hanya audio dari video .mp4 tanpa mengubah audio?

44

Dalam file .mp4 saya, penundaan audio -3840 ms. Saya menyinkronkannya dalam KMplayer, dan saya tidak ingin menggunakan MKVGUI untuk membuat file .mkv. Saya hanya perlu menunda audio sebesar -3840 ms, yang lainnya utuh.
Apa yang akan menjadi perintah yang tepat untuk mencapai ini menggunakan ffmpeg?
Saya sangat menghargai bantuan Anda.

Alireza
sumber

Jawaban:

72

Jika Anda perlu menunda video hingga 3,84 detik, gunakan perintah seperti ini:

ffmpeg.exe -i "movie.mp4" -itsoffset 3.84 -i "movie.mp4" -map 1:v -map 0:a -c copy "movie-video-delayed.mp4"

Jika Anda perlu menunda audio hingga 3,84 detik, gunakan perintah seperti ini:

ffmpeg.exe -i "movie.mp4" -itsoffset 3.84 -i "movie.mp4" -map 0:v -map 1:a -c copy "movie-audio-delayed.mp4"

Pastikan, bahwa ffmpeg build Anda tidak terlalu lama, lebih baru dari 2012 sudah cukup.


Penjelasan

-itsoffset 3.84 -i "movie.mp4"

Mengimbangi stempel waktu semua aliran dengan 3,84 detik dalam file input yang mengikuti opsi (movie.mp4).

-map 1:v -map 0:a

Membawa aliran video dari input kedua (tertunda) dan streaming audio dari input pertama - tentu saja kedua input mungkin file yang sama.

Penjelasan lebih lanjut dapat ditemukan di sini:
http://alien.slackbook.org/blog/fixing-audio-sync-with-ffmpeg/

Penenun
sumber
2
Bagaimana Anda memilih satu trek audio tertentu daripada menunda semua trek audio?
Freedo
1
Menggunakan kemampuan opsi peta . Pertama-tama Anda perlu menemukan indeks aliran audio yang diinginkan dalam file input menggunakan salah satu dari perintah ini: ffprobe.exe "input_file.mp4"atau ffmpeg.exe -i "input_file.mp4" Anggaplah indeks aliran audio yang akan ditunda adalah 2 (yaitu aliran ketiga) dan bahwa input yang tertunda adalah yang kedua (seperti dalam contoh saya). Untuk hanya menunda aliran ketiga, ambil semua aliran lain dari input pertama dan hanya streaming audio dari input kedua (tertunda):-map 0:0 -map 0:1 -map 1:2
Weaver
bukan itu yang saya maksud. Dalam hal ini saya masih harus memanggil ffmpeg dan mem-parsing hasil untuk menemukan indeks. Apakah ada yang setara dengan mengatakan -map eng
Freedo
Nah, @Freedo, seperti yang telah Anda anjurkan di superuser.com/questions/639402/... , apa yang Anda sarankan sebenarnya dimungkinkan dengan menetapkan stream menggunakan nilai metadata, mis .: -map 1:m:language:eng Namun, ingatlah, bahwa ia akan memilih semua stream memenuhi kriteria, mungkin termasuk beberapa audio dan / atau subtitle stream. Anda dapat menemukan informasi lebih lanjut di stackoverflow.com/questions/46769419/…
Weaver
1
AFAIK -c copydapat digunakan sebagai pengganti -vcodec copy -acodec copy, dan itsoffsethanya mempengaruhi video, jadi mungkin ini akan bekerja sama ?: ffmpeg -i "movie.mp4" -itsoffset 3.84 -c copy "movie-video-delayed.mp4"dan untuk menunda audio bukan hanya menambahkan tanda negatif untuk durasi: -3.84.
miyalys
0

Jadikan audio hening pertama kali:

ffmpeg -f lavfi -i anullsrc=channel_layout=5.1:sample_rate=48000 -t 3 silence_3_sec.mp3

Kemudian file concat:

ffmpeg -i "concat:silence_3_sec.mp3|input.mp3" -acodec copy out.mp3
Ivan Malyshev
sumber