Video dosyalarını komut satırından doğru şekilde kesin


22

Bir video dosyasını (tercihen avi, mkv ve mp4) alabilen ve hassas zaman hassasiyetiyle çok kısa klipleri (2-6 saniye) kesebilen bir cli uygulaması bulmakta sorun yaşıyorum. Ben denedim ffmpeg , mencoder , avidemux ve MP4Box ama 6 + saniyelik klipler oluşturur kareler üzerinde hepsi kesik. Giriş dosyasını yeniden kodlayan ve doğru süreyi azaltan veya yanlış şekilde kesen, yeniden kodlayan ve daha sonra kesin olarak kesecek bir araç var mı?


Doğru bir şekilde elde etmek için kesmeden önce yeniden kodlamanız gerekecek. Öncelikle çevre anahtar kareleri keserek ve sadece parçacıkları yeniden kodlayarak şeyleri hızlandırabilirsiniz.
Nifle

4
Tam olarak hangi FFmpeg komutunu denediniz? Eğer (koyun yani önce videoyu deşifre eğer inanıyorum -ssparametreyi sonra -i ), daha doğru olmalıdır.
slhck

1
FFmpeg numarası işe yaradı! Siparişin çok önemli olduğunu anlamadım. Bu, diğer araçların herhangi biri için aynı mıdır?
Ağustos'ta curmil

Yanıtlar:


23

İle video kesme ffmpeg

Sen edebilirsiniz doğru FFmpeg'den videoları kesti. 2.5 sürümünden bu yana çok kolay. Bu, örneğin 0 dakika, 3 saniye ve 123 milisaniyeden başlayarak 10 saniye keser.

ffmpeg -ss 00:00:03.123 -i input.mp4 -t 10 -c:v libx264 -c:a copy out.mp4

Konum ve zaman saniye veya hh:mm:ss[.xxx]formda olabilir.

Bu örneklerde, x264 kodlayıcı kullanılarak videonun yeniden kodlanacağını unutmayın ; ses kopyalandı.

Sürenin -toyerine -tbitiş noktasını belirlemek için de kullanabilirsiniz . Bununla birlikte, bu durumda, ffmpeg'in önüne koyarak o noktaya bakacak ve daha sonra çıktı vermeye başlayacağı -toiçin eşdeğerdir .-t-ss-i

Ayrıca bkz. Arama wiki girişi.


Eski ffmpegversiyonlar için doğru kesim

Eğer Ffmpeg eski bir sürümü varsa, o zaman doğru arayışlar, sen yerleştirmeniz gerekir -ssSONRA -itüm video ilk deşifre gerektiğinden, biraz daha yavaş kodlama işlemi yapar:

ffmpeg -i input.mp4 -ss 00:00:03.123 -t 10 -c:v libx264 -c:a copy out.mp4

Burada -tove -tfarklı davran. -t 10on saniye uzunluğunda bir klip, oysa -to 10yedi saniye uzunluğunda bir klip oluşturacaktı.


Yerine -c:v libx264 -c:a libfaacben kullanabilirsiniz düşünmek -acodec copy -vcodec copysadece algılamak ve orijinal dosya ile aynı codec kullanmak ffmpeg söyler hangi. Birisi onaylayabilir mi?
Baodad

2
@Baodad Yapabilirsiniz, ancak bu doğru şekilde kesilmez. Video / ses bit akışlarını kopyalarken, ffmpeg'in sadece bir saniyede veya daha da başka bir yere yerleştirilebilecek bir ana kareden başlaması gerekir.
Ocak'ta

"Bilinmeyen kodlayıcı 'libfaac'" hatasının nasıl aşılır?
Doug,

@Doug Farklı bir kodlayıcı seçin, örneğin -c:a aac -strict experimental. Bu en basit çözüm.
slhck

1

Şu ana kadar bulduğum, tam kareyi kesebilen (veya kare doğruluğuna sahip) tek Linux komut satırı aracı melt( sudo apt-get install melt).

Diyelim ki inputvid.mp4- ilk önce kodlama ayarlarını kontrol edin ffmpeg(burada, sadece tekrar kodlamak istediğimi söylüyorum -f mp4, ancak dosya /dev/nullçıktı olarak atılır; stderr'i yönlendiririm, böylece onu elimden alabilirim) , komut istemde bulunur ve yENTER ile cevap vermelisiniz , bu nedenle işlem yararlı bilgiyi iler ve çıkarır; bu, Ubuntu 14'teki ffmpeg 3.3.3'tür):

ffmpeg -i inputvid.mp4 -f mp4 /dev/null 2>&1 | grep 'Stream\|encoder'
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt709), 640x360 [SAR 1:1 DAR 16:9], 389 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 95 kb/s (default)
y
File '/dev/null' already exists. Overwrite ? [y/N] Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
    encoder         : Lavf57.71.100
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p(progressive), 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
      encoder         : Lavc57.89.100 libx264
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 128 kb/s (default)
      encoder         : Lavc57.89.100 aac

Tamam, bu video için ffmpegseçimleri libx264ve aackodlayıcıları görebiliyoruz ; o zaman şunu girebiliriz melt:

melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac vcodec=libx264

.... ve melt7235 ile 7349 arasındaki kareler ile parça yeni bir dosyaya kesilecek cut.mp4,. Ardından cut.mp4doğru döngüler olup olmadığını kontrol etmek meltiçin iki kez çalmak için tekrar kullanın - ve bir SDL penceresine oynatın:

melt cut.mp4 cut.mp4 -consumer sdl

... ve işte ffmpegbu dosya için görünen şey :

ffmpeg -i cut.mp4 -f mp4 /dev/null 2>&1 | grep 'Stream\|encoder'    encoder         : Lavf54.20.4
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 526 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 182 kb/s (default)
y
File '/dev/null' already exists. Overwrite ? [y/N] Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
    encoder         : Lavf57.71.100
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
      encoder         : Lavc57.89.100 libx264
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 128 kb/s (default)
      encoder         : Lavc57.89.100 aac

Bunun için video kodlama ayarları , 389 kb / sn'den 526 kb / sn'ye değiştirilen video bit hızının haricinde olduğu cut.mp4gibi görünmektedir inputvid.mp4ve ayrıca ses kodlama ayarları, örnekleme hızı 44100'den 48000 Hz'ye değiştirilenlerin haricinde hemen hemen aynıdır; Bununla birlikte düzenlenebilir:

melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac ar=44100 ab=95k vcodec=libx264 vb=389k

... Bununla birlikte, bununla bile, benim için son video bit hızı 337 kb / s. Yine de, bir döngüde çalındığında kesimler iyi işliyor (ve bu ses içeriyor), bu yüzden bu gerçekten kare-doğru ...


1
meltvideoyu yeniden kodluyor ve altındaki FFmpeg kütüphanelerini kullanıyor. Yeniden kodlamaya izin verirseniz, ffmpeg aynı çıktıyı üretebilir.
Gyan

Thanks @Gyan - bunun farkında değildi (özellikle meltFFmpeg kütüphanelerini kullanıyor), bilmek güzel!
sdaau

eriyik kullanımı ffmpeg'den daha kolay görünür, tek ihtiyacımız olan süreyi, özellikle saat, dakika, saniye veya saat, saat, dakika, saniye, bunları doğru çerçeveye dönüştüren süreleri belirtmenin bir yoludur.
barlop

0

Baodad'ın yorumlarda dediği gibi (hızlı bir şekilde okuyup okumadığınızı bulmak kolay olmadığından gönderiyorum), daha iyi yaklaşım ses / video kodlayıcılarını ffmpeg tarafından otomatik olarak algılamaktır.

ffmpeg -ss 00:05:17.18 -i in.mp4 -t 00:06:29.10 -acodec copy -vcodec copy out.mp4 
  • 00: 05: 17.18 'de başlar
  • giriş = in.mp4
  • 00: 06: 29.10
  • çıkış = çıkış.mp4

2
Bu yeniden kodlamaz ve çerçeve doğruluğu sağlamaz.
Andrea Lazzarotto
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.