Bilinmeyen süreye sahip bir video / ses klibi içeri / dışarı nasıl soldurulur?


19

Ben bazı video dosyalarını toplu dönüştürme ve her klibin baş ve kuyruk solmaya giriş / çıkış efektleri eklemek için ffmpeg kullanarak bir proje üzerinde çalışıyorum.

Bilinen süreleri olan kliplere solma / çıkış efekti eklemek için bu kod bitini kullanıyorum:

ffmpeg -i clip.mp4 -filter:v 'fade=in:0:30,fade=out:9650:30' -c:v libx264 -crf 22 -preset veryfast -c:a copy fadeInOut.mp4

İki sorum:

  1. Ses giriş / çıkışını aynı anda nasıl soldurabilirim?
  2. Ffmpeg klibin süresini otomatik olarak çözebilir ve sadece son 30 kareyi soldurabilir mi?

Teşekkürler!

Yanıtlar:


15

# 1 Ses giriş / çıkışını aynı anda hafifletmek için:

ffmpeg -i clip.mp4 -vf 'fade=in:0:30,fade=out:960:30'
                   -af 'afade=in:st=0:d=1,afade=out:st=32:d=1'
       -c:v libx264 -crf 22 -preset veryfast fadeInOut.mp4

Afade süreleri saniye cinsindendir .

# 2 Otomatik mi? Hayır. Ancak aşağıdaki geçici çözüme bakın

Süreyi almak için önce ffprobe komutunu çalıştırabilirsiniz.

ffprobe -i clip.mp4 -show_entries stream=codec_type,duration -of compact=p=0:nk=1

Bunun gibi bir şey elde edersiniz:

video|13.556000
audio|13.816000

Daha sonra soluklarınızı yerleştirmek için yukarıdakileri kullanabilirsiniz. Bu süreler saniyeler içinde.

Geçici çözüm

ffmpeg -i clip.mp4 -sseof -1 -copyts -i clip.mp4 -filter_complex
       "[1]fade=out:0:30[t];[0][t]overlay,fade=in:0:30[v];
        anullsrc,atrim=0:2[at];[0][at]acrossfade=d=1,afade=d=1[a]"
       -map "[v]" -map "[a]" -c:v libx264 -crf 22 -preset veryfast -shortest fadeInOut.mp4

FFmpeg, bir sseofkişinin sondan bir girdi aramasına izin veren bir seçeneğe sahiptir . Bunu hedefimize ulaşmak için kullanabiliriz. Bu yüzden girişi iki kez besliyoruz, 2. kez sadece son saniyeyi yutuyor. FFmpeg'e zaman damgalarını korumasını söyleriz, böylece ffmpeg bu kuyruk kısmının zamansal konumunu korur.

Bu kuyruğa bir solma uyguladık ve ardından sonucu tam girdiye bindiriyoruz. Aynı ortam dosyası olduklarından, ön plan arka planı tamamen kaplar ve copytsuygulandığından beri kaplama, arka plan girişinde karşılık gelen aynı çerçeve üzerinde olur.

Ses için, 2 saniyelik boş bir kukla ses yaratırız ve daha sonra ana sesten bu kukla sese bir ses crossfade uygularız. 2. ses boş olduğu için, bu aslında ana giriş için yavaşlamadır. -shortestBindirmeli meydana geldikten sonra taklit ses bölümlerini bırakmak ilave edilir.


Bu, "böyle bir filtre yok!" Hatasını verir. ses filtresi için.
17'de felwithe

1
Kullanılan 4 ses filtresi vardır. Hangisi? -reportEklendi komutunu çalıştırın ve raporu paylaşın.
Gyan

7

Bu korkunç bir hack'tir, ancak tüm yapmak istediğiniz ses solma giriş / çıkış ise, ancak klibin tam olarak ne kadar uzun olduğunu bilmiyorsanız bu işe yarayabilir:

ffmpeg -i input.mp4 -filter_complex "afade=d=0.5, areverse, afade=d=0.5, areverse" output.mp4

[değiştir 2019-07-24: İlk baytın yayınlanabilmesi için tüm parçanın işlenmesini gerektirdiğinden, bu çözümün akış çözümleri için iyi olmadığını unutmayın]

Başka bir seçenek ben acrossfadesessiz bir parça ile kullanmaktır :

ffmpeg -i input.mp4 -filter_complex "aevalsrc=0:d=0.6 [a_silence]; [0:a:0] [a_silence] acrossfade=d=0.6" output.mp4

3
Bu aslında oldukça zarif :-)
bk138 30:30 '

bu harika çalışıyor. nasıl çalıştığını açıklayabilir misiniz? belgeleri
anlamayı deniyor

1
@oberhamsi: Seçenek 1: İlk filtre, parçanın başına bir solma ekler. Daha sonra sesi tersine çevirir ve başlangıçta başka bir solma ekler (aslında sondur). Sonunda parça tekrar ters çevrilir. Seçenek 2, 0.6 saniyelik sessiz bir iz oluşturur ve orijinal iz ile aynı süre boyunca geçiş yapar. Tüm filtreler ve kullanımları burada belgelenmiştir: ffmpeg.org/ffmpeg-filters.html (biraz şifreli olduğunu kabul etmeme rağmen)
marekventur

3

Soru 2'nin cevabı kocaman bir EVET! Aynı işlevselliği arıyordum ve saniyeler içinde solma süresini soran ve solma için ilk kareyi hesaplayan bir bash betiği yazmayı bitirdim:

#!/bin/bash

f="$*" # all args
p="${f##*/}" # file
fn="${p%.*}" # name only
e="${p##*.}" # extension

echo
echo $f
echo $p
echo $fn
echo $e
echo

read -e -p "Number of seconds of fade-out: " -i 1 sec # prompt for fade duration in seconds

r=$(ffprobe -show_streams "$f" 2> /dev/null | grep r_frame_rate | head -1 | cut -d \= -f 2) # frame rate
let "frames = $r * $sec" # duration of fade as number of frames
echo $r
echo $sec
echo $frames
lf=$(ffprobe -show_streams "$f" 2> /dev/null | grep nb_frames | head -1 | cut -d \= -f 2) # total number of frames
let "lf = $lf - $frames" # initial frame to start fade at

ffmpeg -loglevel quiet -i "$f" -vf fade=out:$lf:$frames -r $r -vcodec libx264 -preset slow -crf 12 -bf 2 -flags +cgop -pix_fmt yuv420p -acodec copy "$fn $sec sec fade-out.$e"
open "$fn $sec sec fade-out.$e"

Soldurmalar yeniden kodlamayı gerektirir, bu nedenle düşük bir crfdeğer kullanılması libx264yüksek kalitede yeniden kodlama sağlar. Yorumlar her şeyi açıklamalıdır.


Soru 2'nin cevabı kocaman bir EVET! -> hala Hayır. Q ffmpeg süresi otomatik olarak çözebilir mi ... ama bunu yapmak için birden fazla ff * komutu çalıştıran bir komut dosyası yazdınız. Yine de * nix sistemleri için kullanışlıdır.
Gyan

Anlıyorum, yani cevabınızın hala doğru olduğunu mu ısrar ediyorsunuz? Senaryomu izlerseniz, gerçekten olmadığını göreceksiniz automatically figure out the durationkullanarak ffprobeile yüklü olduğu, ffmpeg. Komut sayısındaki herhangi bir kısıtlama hakkında kim söyledi *nix? OP'nin UNIX sürümünü kullanıyor gibi görünüyor. Hiçbir .exeiçinde ffmpegkomuta. Ben kendi OS Xüzerine inşa edilmiş olan UNIXama olmayan kullanıyorum UNIX.
hmj6jmh

1
* Senaryomu takip ederseniz, gerçekten otomatik olarak anladığını göreceksiniz * -> senaryonuz yapar, ffmpeg değil.
Gyan

Ancak dağıtımın ffprobeayrılmaz bir parçasıdır ffmpeg. Yüz IMO'sunu kurtarmak için nit seçiyorsunuz.
hmj6jmh

Bir bash komut dosyası tarafından yapılıyor o şey katılmak zorundayım olduğu değil otomatik Ffmpeg tarafından yapılmaktadır şey. Ancak bu işe yararsa, bu soruna geçici bir çözüm bulmak için bir yoldur. Dolayısıyla "geçici çözüm" terimi. İşe yarayıp yaramadığını söyleyemem çünkü çoğu insan gibi bash ya da unix sistemim yok. Zaten çaba için +1.
ashleedawg
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.