Urutan gambar FFMPEG dengan berbagai durasi


16

Katakanlah saya memiliki file mp3 berdurasi 1 menit. Dan saya punya 20 gambar png. Saya ingin menggabungkan gambar-gambar ini dan audio menjadi file video, tetapi saya tidak ingin setiap gambar bertahan 3 detik di layar, saya ingin beberapa gambar bertahan 5 detik, yang lain 1 detik dll.

Satu-satunya cara yang dapat saya pikirkan adalah hanya menyalin gambar yang seharusnya bertahan lebih lama, misalnya memiliki image1, image2, image3 persis sama, ini memberi saya 3x lebih banyak waktu dalam video.

Namun ini sangat memakan waktu dan ruang. Apakah ada saklar / parameter dalam ffmpeg yang memungkinkan saya melakukan itu?


Ketika Anda menemukan ffmpeg harus menampilkan setiap gambar dengan panjang yang sama. Jika Anda ingin memvariasikan panjangnya, Anda harus menduplikasi gambar sebelumnya atau membuat video terpisah dari setiap durasi yang diinginkan dan kemudian menggabungkannya. Mungkin beberapa pengguna lain memiliki ide yang lebih baik, tetapi jenis tugas ini mungkin lebih mudah dengan editor seperti Kdenlive, dll.
llogan

Saya melakukannya dari skrip php, jadi editor bukan yang saya cari.
Flot2011

Jawaban:


21

Menggunakan ffmpeg 2.0 ada beberapa cara untuk melakukan ini:

  1. Salah satu metode adalah menggunakan waktu modifikasi file. Pertama atur waktu modifikasi dari file gambar sehingga setiap file gambar memiliki waktu modifikasi yang lebih besar daripada yang sebelumnya; perbedaan waktu adalah durasi gambar sebelumnya (dengan resolusi 1 detik). Kemudian gunakan opsi image2 demuxer -ts_from_file 1. Sebagai contoh:

    touch -t 01010000.00 image01.png
    touch -t 01010000.03 image02.png
    touch -t 01010000.08 image03.png
    ...
    ffmpeg -ts_from_file 1 -i image%2d.png -i audio.mp3 -c:a copy -vf fps=25 out.avi
    
  2. Metode lain adalah dengan menggunakan concatdemuxer , yang mengambil daftar file untuk digabungkan, dengan durasi opsional. Pertama buat file yang mencantumkan gambar dan durasi Anda yang terlihat seperti ini:

    ffconcat version 1.0
    file image01.png
    duration 3
    file image02.png
    duration 5
    file image03.png
    

    Kemudian berikan file ini sebagai input ke ffmpeg. Sebagai contoh:

    ffmpeg -i in.ffconcat -i audio.mp3 -c:a copy -vf fps=25 out.avi
    

Anda mungkin perlu menduplikasi file terakhir setelah durasi akhir. -c:a copymenyalin audio mp3 apa adanya; jika Anda ingin mengonversinya ke audio codec lain maka Anda dapat menentukan itu alih-alih copy. Anda mungkin juga ingin menentukan codec video dengan -c:vatau format piksel berbeda dengan -pix_fmt, seperti -c:v libx264 -pix_fmt yuv420p. -vf fps=25akan membuat frame rate 25 fps. Jika audio Anda lebih panjang dan Anda ingin memotongnya setelah gambar, gunakan -shortestopsi.


Tahu mengapa hal ini sepertinya tidak berhasil (maksud saya, saya mengikuti pilihan kedua (dan mencoba untuk pertama) surat itu tetapi hanya menampilkan video hitam tanpa gambar atau gambar hanya berkedip untuk satu frame, bukan beberapa detik sebagaimana ditentukan dalam file ffconcat
sup

@sup: Ini masih berfungsi untuk saya. Jika video berwarna hitam maka pemutar Anda mungkin tidak mendukung format video yang Anda gunakan; coba -c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4alih-alih out.avi, atau coba pemain lain seperti mpv atau ffplay. Pastikan juga Anda menggunakan versi FFmpeg saat ini, dan duplikat nama file gambar terakhir setelah durasi akhir.
mark4o

Hm, aneh, Anda menggunakan mpv dan build statis ffmpeg yang diunduh dari ffmpeg.org, dan itu hanya mengabaikan durasinya. Lagi pula, saya menemukan cara lain bagaimana melakukan ini, jadi tidak begitu penting: ffmpeg.org/pipermail/ffmpeg-user/2015-July/027702.html
sup

1

Asumsi ffmpeg -i in.ffconcat -vf fps=25 out.avi

(2018: konten file in.ffconcat) - ini berfungsi:

ffconcat versi 1.0
file text.png
durasi 30.0
file text.png

sementara ini tidak

ffconcat versi 1.0
file text.png
durasi 30.0

yaitu dalam kasus kedua

ffprobe out.avi -show_entries format=duration -v 0

[FORMAT]
Durasi = 0,040000
[/FORMAT]
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.