slideshow ffmpeg dengan crossfade

3

Saya baru tahu cara membuat slideshow dengan crossfade. Ini adalah proses dua langkah. Langkah pertama membaca gambar dengan framerate 0,5 (yang berarti 2 detik untuk setiap gambar), dan menghasilkan video perantara dengan framerate 2. Itu berarti setiap gambar diulang 4 kali. Langkah kedua berlaku filter framerate. Hasilnya adalah bahwa setiap gambar ditampilkan selama 1,5 detik, diikuti oleh silang 0,5 detik.

ffmpeg -framerate 0.5 -i IMG_% 3d.jpg -r 2 -codec: v mpeg4 temp.mp4

ffmpeg -i temp.mp4 -vf "framerate = fps = 25" -codec: v mpeg4 out.mp4

Proses dua langkah ini berfungsi dengan baik, tetapi saya memiliki dua pertanyaan:

  1. Apakah mungkin untuk mendapatkan hasil yang sama dalam satu langkah, tanpa file video perantara?
  2. Jika jawaban untuk pertanyaan pertama adalah tidak, bisakah seseorang tolong tunjukkan saya bagaimana perintah di atas harus dimodifikasi untuk file perantara lossless, misalnya RAWVIDEO?

Terima kasih, Michael

Michael
sumber
Adakah alasan yang Anda butuhkan mpeg4sebagai codec? Menggunakan encoder tertentu tanpa menetapkan bitrate target atau tingkat kualitas akan menghasilkan kualitas output yang buruk. Saya lebih suka menggunakan H.264 kecuali jika Anda secara khusus perlu menargetkan perangkat yang tidak mendukungnya.
slhck
Saya menghilangkan pengaturan bitrate dan level kualitas pada contoh di atas, karena saya ingin membuatnya sesingkat mungkin.
Michael

Jawaban:

2

Anda dapat mengembalikan bingkai sebelum menerapkan filter:

ffmpeg -i IMG_%3d.jpg  -vf "setpts=N/0.5/TB,framerate=fps=25" -codec:v mpeg4 out.mp4

Pembaruan : Filter framerate tampaknya terikat ke framerate input yang dicerna, jadi metode alt menggunakan pipa

ffmpeg -framerate 0.5 -i IMG_%3d.jpg -vf fps=2 -f nut - | ffmpeg -f nut -i - -vf framerate=25 -c:v mpeg4 out.mp4

Solusi satu baris:

ffmpeg -i IMG_%3d.jpg -vf zoompan=z=1:d=4:s=WxH:fps=2,framerate=25 -c:v mpeg4 out.mp4

di mana W dan H diganti dengan dimensi input.

Gyan
sumber
Tetapi ini tidak melakukan hal yang sama. Ini menghasilkan video di mana durasi crossfade adalah 2 detik, dan ketika satu crossfade berakhir, crossfade berikutnya dimulai segera.
Michael
Penanganan masalah ditambahkan
Gyan
ok, saya mengerti maksud anda. Pertama, terapkan filter fps dan kemudian filter framerate. Tapi saya menelepon ffmpeg dari file batch Windows. Saya pikir dalam hal ini saya harus menulis perintah dalam dua baris dan menggunakan file perantara.
Michael
Mengapa? Anda bisa menerapkan solusinya dalam file batch.
Gyan
Itu tidak bekerja. Ketika saya memulai file batch, jendela cmd.exe membuka dan menutup segera. Ini adalah isi dari file batch saya: c: / ffmpeg / ffmpeg -framerate 0,5 -i IMG _ %% 3d.jpg -vf fps = 2 -f nut - | c: / ffmpeg / ffmpeg -f nut -i - -vf framerate = 25 -c: v mpeg4 out.mp4 jeda
Michael
3

Saya ingin merangkum solusinya:

ffmpeg -i IMG_%3d.jpg -vf zoompan=d=(A+B)/B:s=WxH:fps=1/B,framerate=25:interp_start=0:interp_end=255:scene=100 -c:v mpeg4 -maxrate 5M -q:v 2 out.mp4

di mana A adalah durasi dalam detik berapa lama setiap gambar ditampilkan (tanpa durasi crossfade), B adalah durasi crossfade dalam detik, dan WxH adalah ukuran video output.

Michael
sumber
-b:v 5Mdan -q:v 0saling eksklusif; Anda ingin bitrate tertentu (tapi kemudian dua-pass encoding akan lebih baik), atau Anda menentukan tingkat kualitas target (´-q: v 0` akan menghasilkan file yang sangat besar).
slhck
Tidakkah bitrate yang ditentukan hanya berfungsi sebagai maksimum dalam kasus ini? Saya pikir ketika kedua parameter ditentukan, itu berarti menggunakan kualitas yang ditentukan, tetapi jangan melebihi bitrate yang ditentukan.
Michael
Tidak, itu -maxrateparameternya. Jika Anda benar-benar membutuhkan mpeg4, gunakan -q:v 2 -maxrate 5Muntuk video 1080p, misalnya, untuk mencapai aliran VBR dengan laju terbatas.
slhck