Saya hanya ingin mengulang video mp4 dengan ffmpeg dan menyimpan pengaturan dan codec saat ini.
Sebagai contoh jika input.mp4 panjangnya 0:10, dan saya ingin memutarnya 4 kali jadi output.mp4 adalah 0:40 panjang, bagaimana saya bisa mengubah baris perintah berikut untuk melakukan itu?
ffmpeg -i input.mp4 -c copy output.mp4
Saya mencoba...
ffmpeg -loop 4 -i input.mp4 -c copy output.mp4
... tapi saya mendapatkan kesalahan "Opsi loop tidak ditemukan."
Jawaban:
Demuxer perhatian
Ini memungkinkan Anda untuk mengulangi input tanpa perlu menyandi ulang.
Buat file teks. Isi dari file teks contoh untuk mengulangi 4 kali.
Kemudian jalankan
ffmpeg
:Untuk pengguna Linux
Contoh ini sama seperti di atas tetapi Anda tidak harus membuat secara manual
list.txt
:Dengan shell modern yang paling umum digunakan, Anda bahkan dapat menghindari pembuatan
list.txt
file sepenuhnya. Misalnya, dengan bash:Lihat juga:
filter loop
Contoh menggunakan loop filter untuk loop 4 kali, setiap loop adalah 75 frame, setiap loop melewatkan 25 frame pertama dari input:
loop=3:75:25
loop=3
will loop 4 kali.-1
.ffmpeg -h filter=loop
.filter film
The Filter film memiliki opsi lingkaran. Lihat jawaban di bawah oleh Monah Tuk. Penyaringan membutuhkan pengodean ulang. Untuk audio gunakan filter amovie.
-stream_loop
pilihanLihat jawaban di bawah ini oleh Thingy dan jawaban oleh Gyan.
Perhatikan bahwa opsi ini buggy (lihat laporan bug # 5719 , # 6121 , dan # 7043 ) jadi mungkin tidak berfungsi untuk build lama (apa pun yang lebih tua dari 2018 06-27 termasuk cabang rilis FFmpeg 4.0.x). Untuk pengguna bangunan lama, seperti yang disebutkan oleh mulvya di tiket # 6121, satu solusi adalah pertama-tama mux-re-mux ke MKV atau TS kemudian gunakan
-stream_loop
di perintah berikutnya.-loop
pilihanThe
-loop
pilihan adalah khusus untuk file gambar demuxer dan gif muxer , sehingga tidak dapat digunakan untuk file video yang khas, tetapi dapat digunakan untuk loop tak terhingga serangkaian gambar masukan. Contoh ini akan berulang berulang tetapi-t 30
akan membatasi durasi output hingga 30 detik:Atau untuk mengulang keluaran GIF:
sumber
> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
ffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
-stream_loop
bagian ini menunjuk ke tiket yang sama dengan tiket pertama ...Setidaknya pada FFmpeg 2.8.x (tetapi oldie juga berfungsi) Anda dapat menggunakan
lavfi
format input dan grafik filter yang kompleks menggunakanmovie
dansetpts
memfilter sebagai argumen untuk-i
opsi.Perintah selanjutnya melakukan pekerjaan ini untuk Anda:
loop=
Argumen nol berarti infinity loop. Nilai nol lebih besar set jumlah pengulangan.setpts
filter diperlukan untuk PTS yang menyesuaikan untuk pengulangan kedua dan kemudian, jika tidak, sebagian besar muxer keluaran akan gagal dengan PTS non-monotonik meningkat: loop tidak recalc PTS.Perhatikan, bahwa menggunakan filter dengan asumsi bahwa bypass frame tanpa decoding / encoding tidak mungkin: by design filter hanya berurusan dengan frame yang didekodekan.
Pada FFmpeg 2.8.2 opsi input baru
-stream_loop
diperkenalkan. Saya pertama kali melihatnya bekerja lebih sederhana dan memungkinkan menyalin konten tanpa transcoding:Tapi itu tidak menghitung ulang PTS dan file output salah. Jika Anda menambahkan filter untuk memperbaiki PTS (lihat
setpts
), Anda juga harus menghapusnya-c copy
. Hanya filter bitstream yang dapat menangani paket yang disandikan, tetapi tidak ada filter bitstream untuk memperbaiki PTS (lihat: https://ffmpeg.org/ffmpeg-bitstream-filters.html )Bagaimanapun ffmpeg pada pass kedua gagal dengan kesalahan:
Diketahui bekerja di sekitar untuk saya : gunakan wadah untuk file masukan tanpa batas PTS (wadah streaming) Salah satunya, kenal saya, adalah MPEG-TS. Jadi, Anda dapat dengan mudah mengkonversi file MP4 Anda ke MPEG-TS:
Dan gunakan perintah berikutnya untuk membuat file infinity:
(filter bitstream harus digunakan hanya jika diperlukan, pada sampel saya diperlukan)
FFmpeg> = 2.8.2 diperlukan dalam kasus ini.
sumber
-c copy
. Jawaban sudah diperbaiki.Dengan ffmpeg 2.8.4, perintah berikut ini membuat output.mp4 yang merupakan salinan input.mp4 berulang hingga proses ffmpeg dihentikan:
Perintah ini tidak akan berhenti dengan sendirinya, dan file output akan tumbuh tanpa batas.
sumber
T: "... bagaimana saya bisa mengubah baris perintah berikut untuk melakukan itu? Ffmpeg -i input.mp4 -c copy output.mp4"?
A: Metode sederhana yang menghindari masalah dimana Perintah bekerja dengan versi mana yang merupakan 'solusi sepele':
ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -c copy output.mp4
Lihat juga: https://trac.ffmpeg.org/wiki/Concatenate untuk banyak contoh.
sumber