Ulangi / putar Video Input dengan ffmpeg?


52

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."


Gunakan quicktime 7 pro dan wadah mov. Jadi Anda tidak akan mendapatkan ukuran file yang lebih besar, daripada dengan yang open source.
Дмитрий Мышков

Jawaban:


69

Demuxer perhatian

Ini memungkinkan Anda untuk mengulangi input tanpa perlu menyandi ulang.

  1. Buat file teks. Isi dari file teks contoh untuk mengulangi 4 kali.

    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    
  2. Kemudian jalankan ffmpeg:

    ffmpeg -f concat -i list.txt -c copy output.mp4
    

Untuk pengguna Linux

Contoh ini sama seperti di atas tetapi Anda tidak harus membuat secara manual list.txt:

for i in {1..4}; do printf "file '%s'\n" input.mp4 >> list.txt; done
ffmpeg -f concat -i list.txt -c copy output.mp4

Dengan shell modern yang paling umum digunakan, Anda bahkan dapat menghindari pembuatan list.txtfile sepenuhnya. Misalnya, dengan bash:

ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -c copy output.mp4

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:

ffmpeg -i input -filter_complex loop=loop=3:size=75:start=25 output
  • Atau gunakan singkatan: loop=3:75:25
  • Penyaringan membutuhkan pengodean ulang.
  • Filter ini menempatkan semua frame ke dalam memori .
  • Menggunakan loop=3will loop 4 kali.
  • Untuk loop menggunakan tanpa batas -1.
  • Anda harus mencantumkan jumlah bingkai yang akan diulang (ditampilkan sebagai 75 pada contoh di atas). Nilai maksimum adalah 32767.
  • Lihat juga 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 pilihan

Lihat 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_loopdi perintah berikutnya.


-loop pilihan

The -looppilihan 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 30akan membatasi durasi output hingga 30 detik:

ffmpeg -loop 1 -i %03d.png -t 30 output.mkv

Atau untuk mengulang keluaran GIF:

ffmpeg -i input -loop 3 output.gif

Apakah ini berfungsi baik dengan file mp4?
Thomas King

3
Saya mendapatkan kesalahan ini> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
JZ11

1
@jamesfzhang - Saya pikir itu karena Anda memerlukan path absolut ke file (seperti yang dijelaskan di sini: trac.ffmpeg.org/wiki/Concatenate ). Untuk memenuhi itu, Anda dapat menulis: ffmpeg -safe 0 -f concat -i <(untuk i di {1..4}; lakukan printf "file '$ PWD' / '% s' \ n" input.mp4; selesai ) -c copy output.mp4
Plenus Franckly

1
Bagi saya ini berfungsi untuk mengulang video penuh waktu tanpa melewatkan ketenaran untuk 4 kaliffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
Vlad

Masalah ini berusia 4 tahun dan tidak seorang pun memperhatikan bahwa tautan ke edisi kedua di -stream_loopbagian ini menunjuk ke tiket yang sama dengan tiket pertama ...
Leonid Usov

15

Setidaknya pada FFmpeg 2.8.x (tetapi oldie juga berfungsi) Anda dapat menggunakan lavfiformat input dan grafik filter yang kompleks menggunakan moviedan setptsmemfilter sebagai argumen untuk -iopsi.

Perintah selanjutnya melakukan pekerjaan ini untuk Anda:

ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4

loop=Argumen nol berarti infinity loop. Nilai nol lebih besar set jumlah pengulangan. setptsfilter 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_loopdiperkenalkan. Saya pertama kali melihatnya bekerja lebih sederhana dan memungkinkan menyalin konten tanpa transcoding:

ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4

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:

input.mp4: Resource temporarily unavailable

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:

ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts

Dan gunakan perintah berikutnya untuk membuat file infinity:

ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4

(filter bitstream harus digunakan hanya jika diperlukan, pada sampel saya diperlukan)

FFmpeg> = 2.8.2 diperlukan dalam kasus ini.


1
Menjalankan perintah itu memberi saya kesalahan: "[mp4 @ 00000000053fa1a0] Tidak dapat menemukan tag untuk codec rawvideo dalam streaming # 0, codec saat ini tidak didukung dalam wadah". Jika saya menambahkan -vcodec h264 sebelum input, kesalahan itu hilang, tetapi encoder tidak keluar. Memasok hitungan loop non-nol menghasilkan banyak kesalahan tetapi tidak keluar. File ini bukan keluaran yang valid.
Gyan

1
Dokumentasi untuk stream_loop mengatakan "Loop 0 berarti tidak ada loop, loop -1 berarti loop tak terbatas."
Gyan

Tampaknya file input salah. Bisakah Anda meminta untuk membagikannya? "Loop 0 berarti tidak ada loop, loop -1 berarti loop tak terbatas." - Sepertinya saya melihat dokumen lama :-)
Monah Tuk

1
Saya lupa: filter dengan asumsi transcoding (decode / encode). Dengan desain. Jadi, Anda harus menghapus -c copy. Jawaban sudah diperbaiki.
Monah Tuk

1
Senang mengetahui, tetapi itu adalah batasan yang signifikan jika Anda memiliki loop besar untuk menghasilkan.
Gyan

14

Dengan ffmpeg 2.8.4, perintah berikut ini membuat output.mp4 yang merupakan salinan input.mp4 berulang hingga proses ffmpeg dihentikan:

ffmpeg -stream_loop -1 -i input.mp4 -c copy output.mp4

Perintah ini tidak akan berhenti dengan sendirinya, dan file output akan tumbuh tanpa batas.


2
Tampaknya menjadi metode tercepat
josef

2
Metode tercepat adalah pernyataan yang meremehkan, metode ini merambat ke video multi-jam dalam hitungan detik.
SleighBoy

Ini adalah metode yang sangat nyaman, karena tidak perlu membuat file dengan baris berulang.
Markus Zeller

-1

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.


2
Ini tidak melakukan apa pun Rangkaian. Setidaknya salah satu metode concat harus digunakan: protokol, filter atau demuxer. Dalam perintah ini, pemetaan otomatis ffmpeg akan memilih satu video, satu audio dan satu aliran subtitle dari antara input. Karena mereka identik, itu setara dengan perintah pertama OP.
Gyan

Terima kasih telah menguji Mulvya itu, karena berbeda dari perilaku yang dijelaskan dalam Dokumen: ffmpeg.org/ffmpeg.html#Description - Jika ada kesamaan dalam nama File menggunakan "-i -i /tmp/test%d.mp4" ( et. al) juga memungkinkan.
Rob
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.