28.11.2017

ffmpeg kullanımı

Komut satırından video dönüştürme, kırpma ve ses ekleme/çıkartma işlemleri için ideal bir araç. Birkaç kullanıma örnek vermek istiyorum.

En basit örnek olarak avi dosyasını mp4'e dönüştürmeyi deneyelim.
ffmpeg -i input.avi output.mp4
Burada -i anahtarı giriş videosunu gösterir. Çıkış dosyası için bir anahtarı kullanılmaz. Yukarıdaki örnekte ayrıca kodek, bit oranı, kare sayısı vs. gibi parametreleri belirtmedik, çünkü ffmpeg varsayılanları kullanarak dönüşüm yaptı. Eğer varsayılanların haricinde değerler kullanmak istiyorsak şöyle bir komut işimizi görürdü:
ffmpeg -i input.avi -vframes 24 -aspect 4:3 -b:a 128k -b:v 2000k -c:a mp3 -c:v libx264 - output.mp4
Burada kullanılan ve kullanılmayan anahtarlar şöyle:

-frames:v number    çıkışa verilecek -toplam- kare sayısı
-ar rate            kare hızı (Hz değeri, ondalık veya kısaltma)
-s size             kare boyutu (Gen x Yük veya kısaltma)
-aspect oran        resim oranı (4:3, 16:9 or 1.3333, 1.7777)
-bits_per_raw_sample oran  ham örnek için bit oranı
-vn                 videoyu akışını görmezden gel (sil)
-c:v codec          video kodeği

-c:a codec          ses kodeği
-timecode hh:mm:ss[:;.]ff  başlangıç zamanını belirtmek için
-pass n             geçiş sayısı (iteratif, 1'den 3'e)
-filter:v filter    video filtresi ayarlamak için
-b:a bitrate        ses bit oranı
-b:v bitrate        video bit oranı
-dn                 verileri görmezden gel


Videonun içinden bir kısmı kesip çıkartmak için:
ffmpeg -i input.avi -ss 00:01:05 -t 00:00:55 output.avi
Örneğin yukarıdaki komut 1. dakika 5. saniyede başlayıp 55 saniye sürecek (yani tam 2. dakikada bitecek) şekilde parçayı kesip çıkartır. Yukarıdaki komut kesme işleminden sonra avi tipi için varsayılanları kullanarak yeniden kodlama yapar. Yeniden kodlamadan kaydetmek için ses ve video kodekleri anahtarlarına "copy" yazmak gerekir. Örneğin
ffmpeg -i input.avi -ss 00:01:05 -t 00:00:05 -c:v copy -c:a copy output.avi
Bir video dosyasından sadece sesi alıp onu da mp3 formatında kaydetmek için
ffmpeg -i input.avi -vn output.mp3
Elbette yine sesle ilgili şu anahtarları kullanabiliriz:

-frames:a sayı      çıkışa verilecek ses "frame"i sayısı
-aq kalite          ses kalitesi (kodeğe özel)
-ar oran            Hertz cinsinden ses örneği sayısı
-ac kanal           ses kanalı sayısı
-an                 sesi görmezden gel (sil)
-c:a codec          Ses kodeğini belirt (değişiklik yapmadan 'copy')

-b:a oran           ses bit oranı
-vol volume         ses seviyesi (0 en az, 256 en yüksek)
-filter:a filter    ses filtresi

-c:a pcm_s16le      örnek başına 16 bit kodlama, signed, little-endian (tam liste)
-f s16le            ham veri, signed, little-endian 16-bit

Ayrı ayrı dosyalarda bulunan ses ve videoyu birleştirmek için (formata hiç dokunmadan):
ffmpeg -i input_video.mp4 -i input_audio.mp3 -c:v copy -c:a copy output.mp4
Buna göre örneğin elimizde kayıpsız flac dosyası varsa ve bundan 256k 44kHz 2 kanal kodlanmış mp3 yaratmak istiyorsak:
ffmpeg -i input.flac -b:a 256k -ar 44100 -ac 2 output.mp3
Kullanılabilir kodek listesini görmek için
ffmpeg -codecs
 kullanabilirz. Benzer şekilde -formats, -muxers, -demuxers, -encoders, -decoders, -filters anahtarları da mevcut.

Video kalitesini belirtmek için görüntü kodlamasında kullanılacak bit oranını belirtebiliriz:
-b:v 128k
video kodeğinin saniyede 128 kilobit veri üretmesini sağlar. -qscale veya -vbr gibi değişken bit oranlı (kalite bazlı) parametreler de kullanmak mümkün. Ama bunların değerleri kodeğe bağlı.

Bir videonun her karesini resim olarak kaydetmek için
ffmpeg -i input.mp4 resim-%03.jpg

diyebiliriz. Burada %03, 3 haneli, başında sıfırlar bulunan sayıları ifade eder. Yani 000, 001, 002,... 999 dizisi. Eğer 1000 taneden fazla resim varsa ilk çıkarılanların üzerine yazılır. Benzer bir hedef ile animated GIF dosyasının her bir karesini bir resim olarak kaydetmek için

ffmpeg -i animated.gif kare-%03.jpg

işe yarar. Tam tersi durumda resim dizizinden video yapmak için ise

ffmpeg -i resim-%03.jpg output.mp4
kullanılabilir. Burada -f image2 ile format gizli bir şekilde ima ediliyor. Ama ffmpeg çıkış formatlarını akıllı bir şekilde anlayabildiği için bu anahtara gerek kalmıyor. Eğer resimlerin başlangıcı 000 değilse bu durumda örneğin 138'den başlayan resimleri belirtmek için
ffmpeg -start_number 138 -i resim-%03.jpg output.mp4
yazılmalı. Varsayılan olarak saniyede 25 resim gösterilir. Bu oranı değiştirmek için -framerate (veya yeni sürümlerde -r) ile bir kare oranı belirtebiliriz. Bir sunum tarzı video hazırlıyorsak ve her karenin 5 saniye görünmesini istiyorsak yapılacak
ffmpeg -r 1/5 -i resim-%03 output.mp4
şeklinde 1/5 kare oranı seçmeliyiz. Resimlerin arasında silinen bir geçiş olmasını istiyorsak bunu aşağıdaki şekilde yapabiliriz:
ffmpeg -i resim-%03d.jpg -vf zoompan=d=(A+B)/B:fps=1/B,framerate=25:interp_start=0:interp_end=255:scene=100 -c:v mpeg4 -maxrate 5M -q:v 2 output.mp4
Burada A her resmin saniye cinsinden geçişsiz gösterilme süresini, B ise geçişteki silinme etkili gösterilme süresini belirtir.

Saniyede 1 resim çıkartmak için
ffmpeg -i video.webm -vf fps=1 resim-%03d.png
ya da seçilen dakika ve saniyedeki görünen resmi çıkartmak için ise

ffmpeg -i video.webm -ss 00:00:10 -vframes 1 thumbnail.png
kullanılabilir.

Filtreler özellikle çok faydalı olabilir. Örneğin ses için fade-in ve/veya fade-out eklemek için şu şekilde bir kullanım uygun:
ffmpeg -i audio.mp3 -filter:a 'fade=in:0:30,fade=out:9650:30' audio_fade.mp3
Bu şekilde fade-in için 0 ile 30. kareler arasında, fade-out için ise 9650 ile 9580 arasındaki kareler verilmiş.

ffmpeg bazı video filtrelerine de sahip. Örneğin bir videoyu ters çevirmek için reverse filtresi kullanılır:
ffmpeg -i input.mp4 -filter:v reverse output.mp4
Bu işlem, girişteki dosyanın büyüklüğüne göre videoyu tek parçada veya parça parça tersine çevirip sonra bunları ekleyerek nihai videoyu oluşturmasını sağlayabilir.

Ekleme 2020-07-28: Resim dosyaları üzerinde de benzer işlemler yapılabilir. Örneğin bir resmi 640x480'e ölçeklendirmek için

ffmpeg -i resim.jpg -vf "scale=640:480" resim_olcekli.jpg

Ya da resmin içinden x=100 ve y=120 konumundan (resmin sol üst köşesi x=0 ve y=0 olmak üzere) başlayıp x=300 ve y=250'ye kadar olan dikdörtgen alanı kırpmak için (genişlik : 300-100 = 200, yükseklik: 250-120 = 130)

ffmpeg -i resim.jpg -vf "crop=200:130:100:120 resim_kirpilmis.jpg

yazılabilir.

Ekleme 2022-07-13: Ayrıca streaming videoları indirmek için de, eğer m3u8 uzantılı bir dosyamız varsa, şöyle bir komut kullanabiliriz:

ffmpeg -i "http://example.com/video_url.m3u8" -c copy -bsf:a aac_adtstoasc "output.mp4"