Ffmpeg'de, bir .mp4 videonun yalnızca sesini dönüştürmeden nasıl geciktirilir?


44

Benim .mp4 dosyamda ses gecikmesi -3840 ms'dir. KMplayer'da senkronize ettim ve bir .mkv dosyası oluşturmak için MKVGUI kullanmak istemiyorum. Sesi -3840 ms geciktirmeliyim, her şey bozulmamış.
Ffmpeg kullanarak bunu başarmak için doğru komut ne olurdu?
Yardımın için minnettar olurum.

Yanıtlar:


72

Videoyu 3,84 saniye geciktirmeniz gerekirse , bunun gibi bir komut kullanın:

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

Sesi 3.84 saniye geciktirmeniz gerekirse , bunun gibi bir komut kullanın:

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

Ffmpeg derlemenizin çok eski olmadığından, 2012'den daha yeni olduğundan emin olun.


açıklama

-itsoffset 3.84 -i "movie.mp4"

Seçeneği izleyen giriş dosyasındaki tüm akışların zaman damgalarını 3.84 saniye ofset eder (movie.mp4).

-map 1:v -map 0:a

İkinci (gecikmeli) girişten gelen video akışını ve ilk girişten gelen ses akışını alır - her iki giriş de elbette aynı dosya olabilir.

Daha ayrıntılı bir açıklama burada bulunabilir:
http://alien.slackbook.org/blog/fixing-audio-sync-with-ffmpeg/


2
Tüm ses parçalarını geciktirmek yerine belirli bir ses parçasını nasıl seçersiniz?
Freedo

1
Harita seçeneğinin yeteneklerini kullanma . Öncelikle bu komutlardan herhangi birini kullanarak giriş dosyasında istenen ses akışının indeksini bulmanız gerekir: ffprobe.exe "input_file.mp4"veya ffmpeg.exe -i "input_file.mp4" Gecikmeli ses akışının endeksinin 2 (örneğin üçüncü akış) olduğunu ve gecikmeli girişin ikincisi (benim örneğimdeki gibi). Yalnızca üçüncü akışı geciktirmek için, ilk girişten tüm diğer akışları ve ikinci (gecikmeli) girişten yalnızca bir ses akışını al:-map 0:0 -map 0:1 -map 1:2
Weaver,

Kastettiğim bu değil. Bu durumda hala ffmpeg çağırmalı ve indeksleri bulmak için sonuçları ayrıştırmalıyım. -Map eng
Freedo

Peki, @ Frereedo, superuser.com/questions/639402/… adresinde önerildiği gibi , önerdiğiniz şey, meta veri değerlerini kullanarak akışları belirleyerek aslında mümkün olduğunu belirtmek , örneğin: -map 1:m:language:eng Ancak, tüm akışları seçeceğini unutmayın Muhtemelen çoklu ses ve / veya altyazı akışları dahil olmak üzere kriterleri tatmin etmek. Daha fazla bilgiyi stackoverflow.com/questions/46769419/…
Weaver

1
AFAIK -c copyyerine kullanılabilir -vcodec copy -acodec copyve itsoffsetböylece belki bu aynı çalışırdı ?:, sadece videoyu etkiler ffmpeg -i "movie.mp4" -itsoffset 3.84 -c copy "movie-video-delayed.mp4"ve sadece süresine eksi işareti eklemek yerine ses geciktirmek için: -3.84.
miyalys

0

İlk sessizlik sesini yap:

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

Ardından concat dosyaları:

ffmpeg -i "concat:silence_3_sec.mp3|input.mp3" -acodec copy out.mp3
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.