ffmpeg menambahkan audio tetapi menjaga panjang video tetap sama (tidak -pendek)

12

Saya menambahkan audio ke file video menggunakan ffmpeg seperti itu

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

Namun ini memperpanjang file video output menjadi panjang file audio jika lebih panjang dari video. Menggunakan -shortest memotong file video pendek jika file audio lebih pendek dari video. Jadi, apakah ada flag untuk memberitahu ffmpeg untuk memotong panjang dari video output ke panjang video input?

siluman
sumber
Silakan pilih jawaban yang benar. Satu-satunya yang benar benar adalah satu oleh @Zurechtweiser.
Roel Van de Paar

Jawaban:

13

Saya percaya Anda dapat mencapai tujuan yang Anda inginkan dengan menggunakan opsi -filter_complex dan opsi filter apad untuk mengisi audio Anda dengan diam di akhir jika video lebih panjang. Perintah Anda adalah:

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

Ini mengasumsikan audio yang Anda inginkan ada di aliran pertama audiofile.wav, sintaks [A: B] mengatakan untuk mengambil aliran B'th dari input A'th (keduanya dimulai dengan 0, jadi [1: 0] adalah aliran pertama dari input ke-2, atau audiofile.wav di atas).

Detail di: https://www.ffmpeg.org/ffmpeg-filters.html#Examples-68

deadcode
sumber
Anda harus menyebutkan, bahwa -filter_complexopsi memaksa reencoding - misalnya dimungkinkan untuk menjalankan ffmpeg -i videofile.mp4 -i audiofile.wav -c:v copy output.mp4tetapi tidakffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -c:v copy -shortest output.mp4
Eugen Rieck
Ini adalah jawaban kebalikan dari apa yang diminta. OP meminta untuk mengakhiri video saat audio berakhir, jawaban yang diberikan adalah menambahkan keheningan audio jika audio lebih pendek dari video. Jawaban ini salah.
Roel Van de Paar
Ini bukan "kebalikan" dari apa yang diminta OP. OP ingin video output menjadi panjang video input, terlepas dari panjang trek audio. Jawaban saya membahas keadaan di mana video input lebih panjang dari file audio. OP sudah memiliki solusi ketika input video lebih pendek dari file audio, yaitu menggunakan -shortest.
deadcode
12
  • Jika panjang video lebih pendek dari panjang audio, -shortestitulah yang Anda inginkan.
  • Jika panjang video lebih panjang dari panjang audio, tidak ada bendera sama sekali yang Anda inginkan.

Tidak ada bendera untuk mengotomatiskan keputusan ini.

EDIT

Terinspirasi oleh jawaban deadcode, saya perlu menjelaskan, bahwa "tidak ada flag untuk diotomatisasi" tentu saja tidak benar, jika Anda bersedia memasukkan ulang : Dalam hal ini, ikuti apadseperti yang disarankan oleh @deadcode.

Namun jika Anda ingin menghindari pengodean ulang (yaitu -c:v copy) jawabannya berdiri.

Ada solusi menggunakan ffconcatdemuxer, tetapi perlu sedikit kerja:

  • buat file yang mengandung keheningan dalam format yang persis sama dengan audiofile Anda ("silence.wav")
  • buat file concat "audio.ffconcat" (dengan sebanyak mungkin baris senyap yang Anda perlukan untuk memastikan audio Anda cukup panjang):

.

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

Ini akan mensintesis apadfilter tanpa grafik filter, sehingga memungkinkan mux tanpa reencoding.

Eugen Rieck
sumber
@RoelVandePaar Seperti yang saya katakan: Jika panjang video lebih pendek dari panjang penggunaan audio -shortest, gunakan solusi ini jika Anda ingin menambahkan keheningan tanpa memasukkan ulang.
Eugen Rieck
Benar, tidak terjawab saat ditinjau. Input yang dihapus. Merasa bebas untuk melakukan hal yang sama.
Roel Van de Paar
5

Jika Anda tahu panjang file video Anda, Anda bisa mencapainya dengan menggunakan

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

Di mana 43 adalah panjang file video Anda dalam hitungan detik.

Zurechtweiser
sumber
pertanyaan penulis ingin mengulang file audio saat video belum selesai. Apakah ini berhasil?
Rafael Sanches
@ RafaelSanches Tidak, dia tidak.
Zurechtweiser
Penulis tidak ingin mengulang audio. Jawaban ini juga satu-satunya yang benar yang melakukan apa yang diminta OP; akhiri video saat video input berakhir.
Roel Van de Paar