Videoyu kesmek için ffmpeg kullanma


333

Bu gibi büyük bir dosyanın bir bölümünü kesmek için ffmpeg kullanıyorum:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

-ssBölüm çalışıyor ama -tgöz ardı edilir. Belirtilen ilk saniye ile doğru olarak kaldırır -ssancak daha sonra kopya ile girişin sonuna kadar devam eder.

Bir videonun kodunu yeniden kodlamadan kesmek için ffmpeg kullanmanın bir yolu var mı?


1
bu sözdizimi doğru.
jiggunjer

Yanıtlar:


393

Sen kullanabilirsiniz -ssbir başlangıç zaman damgası ve belirtme seçeneği -tkodlama süresini belirtmek için seçenek. Zaman damgalarının HH:MM:SS.xxxbiçiminde veya saniye cinsinden ( s.msec) olması gerekir.

Aşağıdakiler ilk 30 saniyeyi kesecek ve ondan 10 saniye sonra her şeyi kesecektir:

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

Bunun -tbir çıktı seçeneği olduğunu ve her zaman sonra belirtilmesi gerektiğini unutmayın -i.

Bazı ipuçları:

  • Daha eski ffmpeg sürümleri için, daha -sssonra kullanırsanız -i, daha yavaş bir yürütme pahasına tamamen arama yapmak daha doğru olur. Ayrıca bakınız: FFmpeg ile arama
  • Kesmek istediğiniz zaman damgasını belirtmek -toyerine kullanabilirsiniz -t. Yani, -i <input> -ss 30 -t 10senin yerine -i <input> -ss 30 -to 40aynı şeyi başarmak için de yapabilirsin .

  • Eğer ffmpeg'iniz desteklemiyorsa -c, ya -toda muhtemelen çok güncel değil. Yeni bir sürümü kendiniz derleyin ya da ana sayfasından statik bir yapı indirin . Gerçekten karmaşık değil.


1
@Mondain Aslında, -ss komutunu koyarak daha fazla doğruluk elde edersiniz. Ve slhck burada bahsetti blog.superuser.com/2012/02/24/… ayrıca ffmpeg belgelerinde -ss için önce ya da sonra koymak arasında bir fark olduğunu belirtiyor.
barlop

5
+1 Buraya ilk 35 saniyeden sonra her şeyi nasıl görmezden ffmpeg -i input.wmv -c copy -t 35 output.wmv
geleceğimi bulmak için geldim

2
Bu benim için çalışmıyor (mp4). Sadece 5 saniyelik bir siyah ekran üretiyor:frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s
saatçi,

2
Bu video klibin başında 3-4 s siyah ekran üretti. Chris'in ihmal edilmesiyle yapılan değişiklik -c copyilk siyah ekranı kaldırdı, ayrıntılar için cevabına bakınız.
joelostblom

4
"Aşağıdaki ilk 30 saniyeyi kesecek ve ardından 10 saniye sonra her şeyi kesecekti:" <- Bu ne anlama geliyor? Klip ile demek istiyorsun? Çünkü klip, klibin kırpması anlamına gelebilir. Demek istediğin varsayalım. 30 saniyeden başlamak ve oradan sadece 10 saniye eklemek mi istiyorsun? Eğer öyleyse o zaman şunu daha iyi anlatacağını yazmanı öneririm.
barlop

94

Diğer insanların da belirttiği gibi, -ssdaha önce (çok daha hızlı) veya sonra (daha doğru) koyarak -ibüyük fark yaratır. Ffmpeg seek sayfasındaki "Hızlı ve Doğru Arama" bölümü, ikisini de nasıl elde edeceğinizi anlatıyor ve ben onu kullandım ve bu büyük bir fark yaratıyor. Temel olarak, -ssönce VE sonra koyduğunuzda -i, başka bir anahtar çerçeveye sahip olmak için kesmeye başlamak istediğinizden önce yeterli zaman ayırdığınızdan emin olun. Örnek: Video.mp4'te 9 dakika0 saniye ile 10 dakika 0 saniye arasında 1 dakikalık bir klip yapmak istiyorsanız, aşağıdakileri kullanarak hem hızlı hem de doğru bir şekilde yapabilirsiniz:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

Birincisi -ss(yaklaşık olarak) 8min0sn hıza, daha sonra ikincisi ise 9min0sn'ye hızlı bir şekilde -ssbakıyor ve -t 00:01:00bir 1min0sn'lik klibi çekiyor.

Ayrıca o sayfadan bu önemli noktayı not: "Eğer kullanırsanız -ssile -c:v copy, ortaya çıkan bit akışı olmak sonunda olabilir dalgalı, ffmpeg i-kare sadece kullanım / bölünmeye zorlanır çünkü ya, ses akışı ile senkronize oynanabilir değil. "

Bu, videoyu yalnızca kopyalamak, hatta kopuk ve senkronize olmama riskine soksanız bile yeniden kodlamanız gerektiği anlamına gelir. -c copyİlk önce deneyebilirsiniz , ancak video emerse, yeniden yapmanız gerekir.


aynı uyarı -c:a copybu arayış için de geçerlidir .
jiggunjer

1
En iyi cevap, bu yol benim için en iyisi oldu.
Ondra Žižka

3
Görünüşe göre, "-ss" ffmpeg 2.1+ sürümünde iki kez belirtmeden hızlı ve hatasız görünüyor. trac.ffmpeg.org/wiki/Seeking
Conrad Meyer

25

O bulunan -sskombine -c copybaşlangıcında bir yarım saniye pirzola ile sonuçlanmıştır.

Bunu önlemek için, kaldırmanız gerekir -c copy(kuşkusuz bir transcode yapacak).


4
Doğruluk ile ilgilenen başka bir cevap var. Varsayılan seçenekle tekrar kodlama yapmak istediğinizi DEĞİLDİR!
Tomasz Gandor

İyi nokta @TomaszGandor
Chris

1
@ TomaszGandor'un cevabını hiç anlamadım, ama -c copybunu düzeltmek düzeltildi.
Iulian Onofrei,

14

ELLE

Dosyayı kare kare ilerletecek bir medya oynatıcıda açın ve aşağıdaki gibi verilerle bir AVISynth dosyasını oynatın :

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

Daha sonra EXACT zaman formatı ile kesin:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

ve

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

Şimdi aşağıdaki gibi içerikleri olan video dosyalarıyla bir txt dosyası hazırlayın:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

Ffmpeg komutunu çalıştırın:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"

9

Benim için -tseçenek işe yaramadı, ama -vframesçalıştı. I #frames-Frame'leri kesmeyi tercih ettiğimi ve video kullanımı için GOP'ı bulduğum için kullanmayı tercih ediyorum ffprobe.

Benim için çalışan komut satırı:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

Bu arada, -ssönüne koymak -iidam zamanında büyük bir fark yaratıyor.


1
Aslında -vframes(veya -frames:v) sonradan gelmelidir, -içünkü bu bir çıktı seçeneği.
slhck

5

User225366 ile olduğu gibi, -t seçeneği kısa videolar için işe yaramaz, ancak daha uzun videolar için de geçerlidir. Kısa videolar için görünüyor ki-kare: v daha iyi. Bu benim için çalıştı.

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

-acodec kopyası, videonun sesi varsa, diğer cevapların gösterdiği gibi eklenmelidir.


0

Bunlardan pek bahsetmiyorum (uzman değilim, o yüzden belki bir avcı var), ancak dosyanızın altyazılar gibi başka akışları ve bölümler gibi diğer meta verileri ve benzerleri varsa, tüm akışları kesmek / kesmek ve saklamak mümkündür. aşağıdaki komutu

ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

Sizinle birlikte -map 0dosyadaki tüm akışları -c copyalırsınız ve siz de tüm bunları oldukları gibi kopyalarsınız. Başlangıçtan atlamanın
kullanılması , giriş videosunu başlangıçtan ikinci 60'a keser.-to-ss

Kemanlamak, mapyalnızca belirli akışların kesimde tutulmasını istiyorsanız (dosyadaki tüm ses kaynaklarına veya yalnızca bazı alt yazılara ihtiyacınız olmayabilir) da yararlıdır.

Bunu FAT32 deposunda depolanamayan büyük MKV dosyalarını bölmem gerektiğinde kullanırı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.