Karmaşık filtre kullanarak ffmpeg re encode komutundan kaçının


2

Sonradan kırpılarak birleştirilecek ve mp4'te kodlayacak ts dosyalarının bir listesi var.

Hepsi işe yarıyor ... ancak şu andaki sorun dosya yeniden kodlanmış ... ve istediğim bu değil, çünkü ts zaten h264 ve mp3, çünkü mp4 paketinde çalışıyor tamam. Aslında, bu çalışır:

ffmpeg -i file.ts -c copy file.mp4

Ancak bu değil:

ffmpeg -i videohls-1935m-index.ts -y -filter_complex \
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0]; \
[0:v]trim=30:90,setpts=PTS-STARTPTS[v1]; \
[0:a]atrim=30:90,asetpts=PTS-STARTPTS[a1]; \
[0:v]trim=100:200,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=100:200,asetpts=PTS-STARTPTS[a2]; \
[0:v]trim=250:350,setpts=PTS-STARTPTS[v3]; \
[0:a]atrim=250:350,asetpts=PTS-STARTPTS[a3]; \
[v0][a0][v1][a1][v2][a2][v3][a3]concat=n=4:v=1:a=1[out] \
-map [out] \
-c copy \
videohls-1935m-index.mp4

Açıkçası bu kodekleri "kopyalamayacak" çünkü çıktı [çıkış] ile eşleştirilen sanal bir çıkıştan geliyor (ya da bunun gibi bir şey… dürüst olmak gerekirse tam olarak nasıl çalıştığını bilmiyorum, ama bunun böyle olduğunu biliyorum) , yani söyleneni "codec" yok ... bu yüzden kopyalayamıyor.

Bunun anlamı 2 sorunum var:

  1. Dosya küçük, hiç de fena değil, ama ...
  2. Dosya yeniden kodlandı ... yani kalite de daha azdı.

Bu videonun kalitesini korumak için nasıl önleyebilirim?


Video filtreleri, ham sıkıştırılmamış çerçevelerde çalışır, yani bir filtre tarafından işlenmeden önce kodlarının çözülmesi ve daha sonra kodlanması gerekir. "Copy" codec bileşenini kullanmak aslında bu akış için filtreleri devre dışı bırakır, bkz. Ffmpeg.org/ffmpeg-all.html#Stream-copy .
SirDarius

Hızlı cevabınız için çok teşekkürler ... Soru: O zaman bunu daha hızlı yapmamın bir yolu yok mu? Basit ve hızlı tutmak istiyorum. Bu yüzden belki önce dosyaları oluşturarak ve sonra bunları birleştirerek yapabilirim. Bundan daha iyi olacağını mı düşünüyorsun?
AbrahamSustaita

2
Sadece bir ek ffmpegmüşteri kullanım sorunuz varsa, bunun yerine Süper Kullanıcı'da sorulması gerektiğini hatırlatırız . Yığın Taşması özellikle yalnızca soruları programlamak içindir. Bu sorunun taşınması en iyisi olur.
llogan

Nasıl geçirebilirim?
AbrahamSustaita

2
Sanırım bayrak bağlantısını tıklayabilir ve moderatör dikkatini isteyebilirsin.
llogan

Yanıtlar:


2

Filtreleme yeniden kodlama gerektirir , ancak başka bir seçeneğiniz var:

1. Her segmenti yapın

Bunun yerine ve kullanarak veya ile veya kullanarak her segmentin akışını kopyalayabilirsiniz .-ss-t-to-c copy

  • İlk 10 saniye atlama ve 20 saniye çıkış yapma örneği:

    ffmpeg -ss 10 -i input -t 20 -c copy output
    
  • İlk 10 saniyeyi atlamak ve 30 saniyede durmak için örnek, 20 saniyelik bir çıktıyla sonuçlanır:

    ffmpeg -i input -ss 10 -to 30 -c copy output
    

2. Birleştirmek

  1. İlk önce, concat demuxer belgelerini okuyun .

  2. Ardından bir liste dosyası yapın:

    $ cat inputs.txt
    file '/path/to/segment00.mp4'
    file '/path/to/segment01.mp4'
    file '/path/to/segment02.mp4'
    file '/path/to/segment03.mp4'
    
  3. Son olarak, birleştirebilirsiniz:

    ffmpeg -f concat -i inputs.txt -c copy output
    

Ayrıca bakınız


Ayrıca kullanabilirsiniz muxer segmentleri oluşturmak için. segment
slhck

Cevap olarak ekler misiniz?
AbrahamSustaita
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.