Çeşitli sürelerle FFMPEG görüntü dizisi


16

Diyelim ki 1 dakikalık bir mp3 dosyam var. Ve 20 png resmim var. Bu görüntüleri ve sesi bir video dosyasına birleştirmek istiyorum, ancak her görüntünün ekranda 3 saniye sürmesini istemiyorum, bazı görüntülerin 5 saniye, diğerleri 1 saniye vb.

Düşünebilmemin tek yolu sadece daha uzun sürmesi gereken görüntüleri kopyalamak, örneğin image1, image2, image3'ün tamamen aynı olması, bana videoda 3 kat daha fazla zaman kazandırmak.

Ancak bu çok zaman ve yer kaplıyor. Ffmpeg'de bunu yapmama izin veren herhangi bir anahtar / parametre var mı?


Bildiğiniz gibi ffmpeg her görüntüyü aynı uzunlukta göstermelidir. Uzunluğu değiştirmek isterseniz, görüntüleri önceden çoğaltmanız veya istediğiniz her bir süreye ait ayrı videolar oluşturmanız ve ardından birleştirmeniz gerekir. Belki diğer kullanıcıların daha iyi fikirleri vardır, ancak bu tür bir görev Kdenlive, vb. Gibi bir editörle daha kolay olabilir
llogan

Ben php komut dosyasından yapıyorum, bu yüzden editör aradığım şey değil.
Flot2011

Yanıtlar:


21

Ffmpeg 2.0 kullanarak bunu yapmanın birkaç yolu vardır:

  1. Bir yöntem dosya değiştirme sürelerini kullanmaktır. İlk olarak, görüntü dosyalarının değişiklik zamanını , her bir görüntü dosyasının ondan önceki bir değişiklik süresinden daha uzun olmasını sağlayacak şekilde ayarlayın; zaman farkı önceki görüntünün süresidir (1 saniyelik çözünürlükle). Ardından image2 demuxer seçeneğini kullanın -ts_from_file 1. Örneğin:

    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. Başka bir yöntem de birleştirilecek dosyaların listesini alan concatdemuxer'ı isteğe bağlı sürelerle kullanmaktır. Öncelikle resimlerinizi ve sürelerinizi şöyle gösteren bir dosya oluşturun:

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

    Sonra bu dosyayı ffmpeg'e girdi olarak sağlayın. Örneğin:

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

Son süreden sonra son dosyayı çoğaltmanız gerekebilir. -c:a copymp3 sesini olduğu gibi kopyalar; başka bir ses codec bileşenine dönüştürmek istiyorsanız bunun yerine bunu belirtebilirsiniz copy. Ayrıca farklı bir video codec belirtmek isteyebilirsiniz -c:vveya farklı bir piksel biçimi -pix_fmtgibi -c:v libx264 -pix_fmt yuv420p. -vf fps=25çıkış kare hızını 25 fps yapar. Sesiniz daha uzunsa ve görüntülerden sonra kesilmesini istiyorsanız, -shortestseçeneği kullanın.


Bunun neden işe yaramadığına dair herhangi bir fikir (yani, mektubun ikinci (ve ilkini denemeye çalıştım) seçeneğini izledim, ancak sadece resim olmayan siyah bir video çıktı veya resimler sadece bir kare için değil, birkaç kare için yanıp sönüyor saniye ffconcat dosyasında belirtildiği gibi.
sup

@sup: Bu hala benim için çalışıyor. Video siyahsa, oynatıcınız kullandığınız video biçimini desteklemeyebilir; -c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4out.avi yerine deneyin veya mpv veya ffplay gibi farklı bir oynatıcı deneyin. Ayrıca geçerli bir FFmpeg sürümü kullandığınızdan emin olun ve son görüntü dosya adını son süreden sonra çoğaltın.
mark4o

Hm, tuhaf, U, ffmpeg.org'dan indirilen mpv ve ffmpeg statik yapısını kullanır ve süreleri yok sayar. Her neyse, bunun nasıl yapılacağını başka bir yol buldum, bu yüzden önemli değil: ffmpeg.org/pipermail/ffmpeg-user/2015-July/027702.html
sup

1

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

(2018: in.ffconcat dosya içeriği) - bu işe yarar:

ffconcat sürüm 1.0
dosya text.png
süresi 30.0
dosya text.png

bu değil

ffconcat sürüm 1.0
dosya text.png
süresi 30.0

yani ikinci durumda

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

[BİÇİM]
süresi = 0.040000
[/BİÇİM]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.