ffmpeg dodaj dźwięk, ale zachowaj tę samą długość wideo (nie najkrótsze)

12

Dodam dźwięk do pliku wideo przy użyciu ffmpeg

ffmpeg -i videofile.mp4 -i audiofile.wav output.mp4

Jednak wydłuża to wyjściowy plik wideo o długość pliku audio, jeśli jest on dłuższy niż wideo. Użycie -shortest skraca plik wideo, jeśli plik audio jest krótszy niż wideo. Czy jest więc flaga informująca ffmpeg, aby skrócić długość wyjściowego wideo do długości wejściowego wideo?

stealthcopter
źródło
Wybierz poprawną odpowiedź. Jedynym poprawnym jest ten autorstwa @Zurechtweiser.
Roel Van de Paar

Odpowiedzi:

13

Wierzę, że możesz osiągnąć pożądany cel, używając opcji -filter_complex i filtru apad, aby wyciszyć dźwięk z ciszą na końcu, jeśli wideo jest dłuższe. Twoje polecenie będzie:

ffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -shortest output.mp4

Zakłada się, że żądany dźwięk znajduje się w pierwszym strumieniu pliku audiofile.wav, a składnia [A: B] mówi, że pobiera strumień B-ty z wejścia A-tego (oba rozpoczynają się od 0, więc [1: 0] jest 1. strumień z 2. wejścia lub audiofile.wav powyżej).

Szczegóły na: https://www.ffmpeg.org/ffmpeg-filters.html#Examples-68

deadcode
źródło
Należy wspomnieć, że -filter_complexopcja wymusza ponowne kodowanie - można np. Uruchomić, ffmpeg -i videofile.mp4 -i audiofile.wav -c:v copy output.mp4ale nieffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -c:v copy -shortest output.mp4
Eugen Rieck,
To jest odwrotna odpowiedź na to, co jest wymagane. OP prosi o zakończenie wideo po zakończeniu audio, odpowiedzią jest dodanie ciszy dźwiękowej, jeśli dźwięk jest krótszy niż wideo. Ta odpowiedź jest niepoprawna.
Roel Van de Paar
Nie jest to „przeciwieństwo” tego, o co prosił PO. Operatorzy PO chcą, aby wyjściowe wideo było długością wejściowego wideo, niezależnie od długości ścieżki audio. Moja odpowiedź dotyczy okoliczności, w których wejściowe wideo jest dłuższe niż plik audio. OP ma już rozwiązanie na wypadek, gdy wejściowe wideo jest krótsze niż plik audio, który ma użyć -shortest.
deadcode
12
  • Jeśli długość wideo jest krótsza niż długość dźwięku, -shortestto jest to, czego chcesz.
  • Jeśli długość wideo jest dłuższa niż długość dźwięku, żadna flaga nie będzie w ogóle taka, jakiej chcesz.

Nie ma flagi do automatyzacji tej decyzji.

EDYTOWAĆ

Zainspirowany odpowiedzią @ deadcode, muszę wyjaśnić, że „żadna flaga do zautomatyzowania” nie jest oczywiście prawdą, jeśli chcesz ponownie kodować : W tym przypadku apadpostępuj zgodnie z sugestią @deadcode.

Jeśli jednak chcesz uniknąć ponownego kodowania (tj. -c:v copy), Odpowiedź jest ważna.

Istnieje sposób obejścia problemu przy użyciu ffconcatdemuxera, ale wymaga on trochę pracy:

  • utwórz plik zawierający ciszę w dokładnie tym samym formacie co plik audio („silence.wav”)
  • utwórz plik konkat „audio.ffconcat” (z tyloma liniami ciszy, ile potrzebujesz, aby mieć pewność, że dźwięk jest wystarczająco długi):

.

file 'audiofile.wav'
file 'silence.wav'
file 'silence.wav'
...
file 'silence.wav'
  • biegać ffmpeg -i videofile.mp4 -f concat -i audio.ffconcat -c:v copy output.mp4

Spowoduje to syntezę apadfiltra bez wykresu filtra, umożliwiając w ten sposób multiplekserowi bez ponownego kodowania.

Eugen Rieck
źródło
@RoelVandePaar Jak już powiedziałem: Jeśli długość wideo jest krótsza niż długość audio -shortest, użyj tego obejścia, jeśli chcesz dodać ciszę bez ponownego kodowania .
Eugen Rieck
Prawidłowo, przegapiłem to podczas przeglądu. Usunięto wejście. Zrób to samo.
Roel Van de Paar,
6

Jeśli znasz długość swojego pliku wideo, możesz to zrobić za pomocą

ffmpeg -i videofile.mp4 -i audiofile.wav -t 43 output.mp4

Gdzie 43 to długość twojego pliku wideo w sekundach.

Zurechtweiser
źródło
pytanie autora chce zapętlić plik audio, dopóki wideo się nie zakończy. Czy to działa?
Rafael Sanches,
@RafaelSanches Nie, nie robi.
Zurechtweiser
Autor nie chce zapętlać dźwięku. Ta odpowiedź jest również jedyną prawidłową, która robi to, o co prosił PO; zakończ wideo po zakończeniu wejściowego wideo.
Roel Van de Paar