21 Eylül 2018 Cuma

FFMpeg Windows komut satırından masaüstü ekranı kaydetme işlemi (ses ile beraber) (desktop recording ffmpeg,gdigrab,dshow)

FFMpeg içerisinde barındırdığı bir çok özellikle tercih edilen bir multimedia programı. Bu yazıda basit olarak ekran kaydetme ve parametrelerini anlatmaya çalışacağım.
Öncelikle ffmpeg programını exe formatında https://ffmpeg.zeranoe.com/builds/   adresinden indirebilirsiniz.
Bu sayfada mesela ben 4.0.2 sürümünü windows 64 bit için ve sadece exe halini indirmek istediğimden static'i seçip download build diyorum.
Ayrıca ffmpeg kullanarak C/C++ geliştirme yapmak istiyorsanız derlenmiş hallerinin dll'lerini ve header dosyalarını shared ve dev seçeneklerinden günlük build'ler olarak  yüklüyorlar. Ama biz şu an sadece komut satırı üzerinden işlem yapacağımızdan ffmpeg exe formatı windows için yeterlidir. İnen arşiv dosyasını klasöre çıkardıktan sonra exe ile işlemlerimize başlayabiliriz.
Klasörün içerisinde bin klasöründe ffmpeg.exe'yi görebilirsiniz. standalone exe olduğundan kopyalayıp başka klasörde de kullanabilirsiniz.
ffmpeg ile masaüstü ekran kaydının benim kullandığım 2 yolu var. Bu iki yolda da ffmpeg ekranı kendisi kaydetmiyor, ancak ekranı kaydeden bir device'dan görüntüleri alıp video şekline getiriyor.
1. Yöntem ffmpeg gdigrab device'ını kullanmak 
gdigrab kendiliğinden yüklü bir ekran kaydetme device'ı olduğundan ffmpeg başka bir device kurmadan direk görüntü alabiliyor. Parametreler rahatlıkla değiştirilebiliyor. gdigrab bu yüzden ekran kaydetme işleminde ilk tercihim. Ancak işin içine ses ile senkronizasyon girince işler biraz karışıyor. Burada birkaç örnekle parametreleri açıklayalım . ffmpeg klasörünün olduğu yerde shift + sağ tık yaparak komut satırını burada aç'a tıklayın. aşağıdaki komutu çalıştırın ve ekran kaydedilmeye başlandı :
ffmpeg -f gdigrab -framerate 30 -i desktop output.mkv
burada -f gdigrab bu device'ı kullan, - framerate 30 saniyedeki alınan frame sayısı 30 olsun demek, -i desktop bütün masaüstünü kaydediyorum demek ve çıktı video dosyası da output.mkv olsun demek. Ekran kaydetme işi bittikten sonra komut satırına 'q' yazıp entera basın ve ffmpeg işlemini bitirsin.

Çıkan videoya baktığımda 5 dakikalık video ortalama bir kalitede ve 10 mb civarında, fena sayılmaz.
bütün masaüstünü değil de masaüstünün bir bölümünü kaydetmek istiyorsak ne yapacağız :
ffmpeg -f gdigrab -framerate 30 -offset_x 10 -offset_y 20 -video_size 640x480 -show_region 1 -i desktop output.mkv
burada da dediğimiz şey ekranın 10'a 20 (-offset_x,-offset_y parametreleri) noktasından başlayıp 640x480'lik (-video_size parametresi )bir alanı kaydet ve -show_region 1 parametresi de kaydedilen alanın etrafını bir çizgiyle göstermeye yarıyor. aynı dosya ismiyle kaydediyorsak y'ye basarak dosyanın üzerine yazmasına izin veriyoruz. ardından ekranı videoya kaydediyor. yine işlem bittikten sonra q'ya basıp çıkıyoruz. bu örneklerde mkv uzantısının kullanılması daha iyi sıkıştırma sağladığı içindi, siz isterseniz .mp4 olarak da değiştirebilirsiniz. (https://trac.ffmpeg.org/wiki/Capture/Desktop)
belli bir isme sahip pencereyi kaydetmek için de aşağıdaki Calculator isimli pencereyi kaydeden komutu siz pencere ismini değiştirerek kullanabilirsiniz :
ffmpeg -f gdigrab -framerate 30 -i title=Calculator output.mkv
burada yine video_size ve offset_x,offset_y parametrelerini de kullanabilirsiniz o pencerenin belli bir alanını kaydetmek istiyorsanız.
gdigrab'daki diğer parametreler de şu şekilde :
-draw_mouse : mouse olmadan çizme -draw_mouse 0 (default halinde fare imlecini gösteriyor) :
ffmpeg -f gdigrab -framerate 30 -draw_mouse 0 -i desktop output.mkv
-framerate : dosyanın boyutunu azaltmak için framerate biraz düşürülebilir.
(https://www.ffmpeg.org/ffmpeg-devices.html#gdigrab)

2. Yöntem ffmpeg ile beraber dshow aygıtını kullanmak
Windows'da bulunan diğer bir aygıt dshow hem bize bilgisayara bağlı görüntü kaynaklarına ulaşma imkanı veriyor hem de ses kaynaklarına ulaşım imkanı veriyor. Görüntü kaynaklarına örnek olarak bilgisayara takılı webcam devicelarımız olabilir. Ayrıca dshow bize görüntü kaydetmemizi sağlayan aygıtlara da erişim imkanı veriyor. dshow ile hem webcam ve mikrofonlarınızdan görüntü ve ses alabileceğiniz gibi, dışardan kurulan ekran kayıt cihazlarıyla ekranın görüntülerini de alabiliyoruz. Öncelikle dshow'un görebildiği cihazları (kamera ve mikrofonları) görmek için aşağıdaki komutu komut satırına yapıştırıyoruz :
ffmpeg -list_devices true -f dshow -i dummy
Bu bize şöyle bir sonuç veriyor :
üstte directshow video devices yani video aygıtı olarak 2 aygıt geldi biri dizüstü bilgisayarımın webcam'i diğeri ise benim sonradan bilgisayarıma yüklediğim bize ekran görüntülerini sunan video aygıtı. (birazdan açıklanacak). aşağıda ise dshow'un ses aygıtları görünmekte bunlardan üstteki benim bilgisayarımın mikrofonu. Mesela ben eğer webcam'den gelen görüntü ile mikrofonumdan gelen sesi birleştirip kaydetmek istiyorum aşağıdaki gibi bir komut yazmalıyım :
ffmpeg -f dshow -i video="USB2.0 VGA UVC WebCam":audio="Microphone (Realtek High Definition Audio)" output.mkv
burada -f dshow demek dshow device'ını kullan demek ve video audio olarak da yukarıda ismi geçen aygıtları kullan demek. tabi buradaki isimler yukarıda sorguladığımız isimlerle aynı olmalı. kopyala yapıştır yapabilirsiniz bu isimleri.
sadece video alıp audio istemiyorsak aşağıdaki gibi bir komut yazmalıyız :
ffmpeg -f dshow -i video="USB2.0 VGA UVC WebCam" output.mkv
yine ilk bölümdeki -video_size -framerate gibi parametreleri kullanarak videomuzu özelleştirebiliriz :
ffmpeg -f dshow -video_size=1280x720 -i video="USB2.0 VGA UVC WebCam" output.mkv
buradaki kaynaktan biraz daha fazla örnek görebilirsiniz : https://trac.ffmpeg.org/wiki/DirectShow
DSHOW İLE EKRAN KAYDI
Tamam bizim bilgisayarımızda webcam aygıtı yüklü ve dshow ona ulaşıp görüntüyü alabiliyor. Ancak ekran görüntülerini almamız için bir aygıt yüklemek gerekiyor ki dshow bu ekran görüntüsü kaydı yapan aygıta ulaşıp görüntüleri alsın. Buradaki aygıtımız screen-capture-recorder aygıtı, farklı aygıtlar da mevcut ancak ben bu aygıtı ffmpeg sitesinde örnek olarak gösterildiği için tercih ettim. Bu aygıtı bilgisayarımıza kurmamız gerekiyor. https://github.com/rdp/screen-capture-recorder-to-video-windows-free/releases bu adresten en son sürümün setup dosyasını indirip kurun ve ffmpeg -list_devices true -f dshow -i dummy komutunu yeniden çağırın video device bölümünde bendeki gibi screen-capture-recorder aygıtını görüyorsanız kullanıma hazır demektir.
Mesela ekran kaydı yapıyoruz ve aynı anda mikrofonumuzdan konuştuğumuz şeylerin de videoya kaydolmasını istiyoruz : 
ffmpeg -f dshow -i video="screen-capture-recorder":audio="Microphone (Realtek High Definition Audio)" output.mkv
FFmpeg ile görüntüyü gdigrab ile sesi ise dshow ile almak istiyorsanız , ben screen-capture-recorder kurmak istemiyorum arkadaş derseniz, bu da mümkün ancak denemelerim kadarıyla ses senkronizasyonunda bazı sıkıntılar yaşanıyor. dshow ile birden fazla video ve audio ile yaptığım denemelerde senkronizasyon sorununun en aza indiğini gördüm. Ancak screen-capture-recorder aygıtının masaüstünde nereyi kaydedeceği, frameratei, farenin gösterilip gösterilmeyeceği gibi parametreler ffmpeg komutu üzerinden ayarlanılamıyor maalesef. default olarak ana ekranın tümünü kaydetmekte. bu aygıtın özelliklerini ayarlamak için regedit'ten HKEY_CURRENT_USER\Software\screen-capture-recorder konumuna bazı parametreler eklemek gerekiyor. Aşağıdaki gibi DWORD cinsinden anahtarlar ekliyoruz. Bu anahtarlar ihtiyacınıza göre şunlar olabilir : capture_height , capture_width , start_x , start_y , default_max_fps,capture_mouse_default_1  vs.
Keylerin isimlerini düzgün verip oluşturduktan sonra onlara değer atama işlemini yapabiliriz. Oluşturduğumuz anahtarın üstüne çift tıklıyoruz ve ondalık seçeneğini seçip istediğimiz değeri giriyoruz :
Mesela ben burada 1920'e 1080 lik bir alanı kaydetmesi için gerekli parametreleri ekledim.Mesela siz mouse imleci gözükmesin diyorsanız capture_mouse_default_1 keyine 0 değerini verebilirsiniz. Dediğim gibi eğer key eklemezseniz default olarak ana ekran kaydedilecektir. (diğer parametrelere screen-capture-recorder'in githubdaki beni oku sayfasından da bakabilirsiniz https://github.com/rdp/screen-capture-recorder-to-video-windows-free)
Mesela hem ekran kaydı yapmak istiyoruz hem de hoparlörden duyulan sesi kaydetmek istiyoruz ne yapmalıyız? 
Öncelikle bize kulaklık veya hoparlörden duyduğumuz sesleri bir mikrofon gibi iletecek Stereo Mix mikrofonunu aktifleştirmeliyiz . Ses denetim masasını açın,kayıt bölümünde aşağıdaki resimdeki gibi stereo mix'i aktifleştirin. eğer stereo mix görünmüyor ise sağ tıklayıp aktif olmayan cihazları göster seçeneğine tıklayın.

Bu işlemi yaptıktan sonra yukarıdaki gibi dshow cihazlarını gösterme komutunu (ffmpeg -list_devices true -f dshow -i dummy) çağırdığımızda ses aygıtları bölümünde stereo mix'i de göreceğiz.
ffmpeg -f dshow -i video="screen-capture-recorder":audio="Stereo Mix (Realtek High Definition Audio)"  output.mkv
yukarıdaki komut hem ekranı kaydedecek hem de o an bilgisayarda ana kulaklıkda duyduğumuz sesleri mikrofondan geliyormuşcasına kaydedecek.
Mesela hem ekranı kaydedeyim hem de kulaklıktan gelen sesi kaydediyim bir de bilgisayarıma bağlı olan mikrofondan gelen sesi kaydedeyim derseniz o zaman ffmpeg ile 2 dshow cihazı çağırarak bunu başarabilirsiniz : 
ffmpeg -f dshow -i video="screen-capture-recorder":audio="Stereo Mix (Realtek High Definition Audio)"  -f dshow -i audio="Microphone (Realtek High Definition Audio)" -filter_complex amix=inputs=2  output.mkv
sondaki -filter_complex amix=inputs=2 parametresi 2 sesi beraber kaydetmesi için kullanılıyor, dikkat ederseniz -f dshow 2 kere yazılmış : bir device'dan bir video ve audio aygıtına ulaşılırken diğerinden bir audio cihazına ulaşılıyor, bunlardan bilgiler alınıyor ve ffmpeg tarafından bir video olarak kaydediliyor.
Bunlar benim kullandığım örnekler siz de eklemek istediğiniz ve sormak istediğiniz şeyler olursa yorumlara yazın lütfen.






Hiç yorum yok:

Yorum Gönder