3 puan yazan GN⁺ 2023-07-31 | 1 yorum | WhatsApp'ta paylaş
  • ffmprovisr, FFmpeg komutu yazmakta zorlanan kullanıcıların bir işlem seçerek örnek komutu ve her bayrağa ilişkin açıklamaları görebildiği bir komut oluşturma yardımcı sitesidir
  • Tarifler, ffmpeg, ffplay, ffprobe odağında girdi dosyası, codec, filtre, akış eşleme ve çıktı kapsayıcısı gibi öğeleri parçalarına ayırarak gösterir
  • Kapsamı yeniden kapsülleme/transcoding işlemlerinden kesme-birleştirme, altyazı-filigran, küçük resim-GIF, test dosyaları, metadata-checksum-QCTools raporlarına kadar geniştir
  • Kendi arama özelliği yoktur; ancak tüm tarifleri açtıktan sonra tarayıcı aramasıyla gerekli anahtar kelimeyi bulma yöntemi anlatılır
  • FFmpeg dışında CDDA ripping, ImageMagick, flac gibi araçları da ele alarak dijital koruma iş akışları için pratik komut koleksiyonu olarak kullanılabilir

ffmprovisr neler sunuyor

  • ffmprovisr, işleme göre örnek komutlar ve seçenek açıklamaları sunarak FFmpeg komutlarını elle birleştirme yükünü azaltır
  • Kullanıcı, işlem düğmesine basarak tek bir komuta veya ilgili komut listesine gider; ardından örnek komutu ve bayrakların tek tek ne yaptığını kontrol eder
  • Sayfanın kendisinde arama işlevi yoktur; tüm tarifleri açtıktan sonra ctrl+f veya cmd+f ile tarayıcı araması yapılması önerilir
  • Temel başvuru kaynakları olarak FFmpeg resmi web sitesi, Reto Kromer’in installation instructions, Command Line Crash Course ve explainshell.com bağlantıları verilir
  • Lisansı Creative Commons Attribution 4.0 International License’tır

FFmpeg komutlarını okumanın temel yolu

  • FFmpeg kurulduktan sonra komut isteminde ffmpeg yazılarak çağrılır
  • Komutlar genellikle bayrak ve değer çiftlerinden oluşur
    • -i input_file.ext içinde -i, girdi dosyasını belirten bayraktır; input_file.ext ise hedef dosyadır
    • -c:v prores içinde -c:v, video akışı kodlamasını belirtir; prores ise kullanılacak codec’tir
  • Çıktı dosyası adı komutun sonunda yer alır ve ayrı bir çıktı bayrağı olmadan dosya adıyla belirtilir
  • ffmpeg videoyu kaydeder; ffplay ise oluşturulan videoyu kaydetmeden oynatabilir
    • SMPTE bars kaydetme örneği: ffmpeg -f lavfi -i smptebars=size=640x480 -t 5 output_file
    • SMPTE bars oynatma örneği: ffplay -f lavfi smptebars=size=640x480
    • FFmpeg örneğinde -i, kayıt süresi -t 5 ve çıktı dosyası gerekir; FFplay örneğinde ise -i gerekmez

Hataları azaltmak için kontrol noktaları

  • Çıktı dosyasının açıldığını, oynatıldığını ve amaçlandığı gibi görünüp duyulduğunu doğrulamak gerekir
  • Çıktı uzantısı amaçlanan codec ile uyumlu olmalıdır; bazı uzantılar FFmpeg’de belirli codec varsayılanlarına yol açar
    • Örneğin .mp4, varsayılan olarak H.264 kodlamasına ayarlanabilir
  • "Error: No such file or directory"; yanlış dizin, yazım hatası, eksik boşluk veya hatalı yapıştırılmış bayrak nedeniyle oluşabilir
    • macOS’te Downloads klasörüne gitmek için cd $HOME/Downloads kullanılır
    • Kopyalayıp yapıştırılan komut normal görünse bile hata verirse, komutu komut satırında yeniden elle yazmak önerilir
  • "Could not find tag for codec", çıktı uzantısıyla uyumlu olmayan bir ses veya video codec’ine sahip dosyayı yeniden kapsüllemeye çalışırken ortaya çıkar
    • Önce uygun bir codec’e transcoding yapılabilir veya uzantının doğru codec’e otomatik kodlama yapacağından eminseniz -c copy kaldırılabilir
  • "Killed", dosya sunucu belleği kapasitesini aştığında görülebilir
    • Uzak sunucuda bellek kapasitesini artırarak çözülebilir
    • Yerel sunucuda FFmpeg sürümünü güncel tutmak ve belleği yoğun kullanan başka programlarla aynı anda çalıştırmamak daha iyidir
  • Filtre kullanırken "Error splitting argument list: option not found" çıkarsa tırnak kullanımı ve filtre grafiği biçimi kontrol edilmelidir
  • Filtreler akışın yeniden kodlanmasını gerektirdiğinden, dosya akışlarını doğrudan kopyalayan -c copy ile birlikte kullanıldığında sorun çıkabilir

Filtre grafikleri, akış eşleme ve varsayılan codec’ler

  • Döngü içinde FFmpeg toplu işleri çalıştırırken, standart girdi etkileşiminin varsayılan davranışını geçersiz kılmak için girdiden önce -nostdin eklenebilir
    • Örnek: ffmpeg -nostdin -i input_file ...
  • FFmpeg, çıktı dosyası biçimine göre codec ve codec parametresi varsayılanlarını otomatik ayarlar
    • .avi: ses mp3, video mpeg4
    • .mkv: ses ac3, video H.264
    • .mov: ses AAC, video H.264
    • .mp4: ses AAC, video H.264
    • .mpg: ses mp2, video mpeg1video
    • .mxf: ses pcm_s16le, video mpeg2video
    • .wav: ses pcm_s16le
  • Filtre grafiği, -vf veya -af sonrasında gelen filtre adı ve seçeneklerin birleşimidir
    • -vf, -filter:v için bir kısaltmadır
    • Video filtresi örneği hflip, ses filtresi örneği amergedir
    • Birden fazla filtre virgülle bağlanır; birden fazla filtre zinciri noktalı virgülle ayrılır
    • -vf "fieldmatch,yadif,decimate", inverse telecine işlemi için kullanılan tek bir filtre zinciridir
    • Girdi veya çıktı sayısı birden fazlaysa -vf yerine -filter_complex kullanılmalıdır
    • Düz tırnak kullanılmalı, kıvrımlı tırnaklardan kaçınılmalıdır
  • Akış eşleme, girdi dosyasındaki video, ses, altyazı, veri ve ek akışlardan hangilerinin çıktıya dahil edileceğini belirler
    • FFmpeg a, v, s, d, t akış türlerini tanır
    • -map 0:v, ilk girdi dosyasındaki tüm video akışlarını seçer
    • -map 0:3, ilk girdi dosyasındaki dördüncü akışı seçer
    • -map 0:a:2, ilk girdi dosyasındaki üçüncü ses akışını seçer
    • Eşleme belirtilmezse, video dosyaları için varsayılan davranış çıktıya yalnızca 1 video ve 1 ses akışı almaktır
    • Tüm akışları eşlemek için -map 0 kullanılır
    • -map 0:a? gibi ? eklenirse toplu işlem sırasında sesi olmayan dosyalar da hata vermeden işlenebilir

Kapsayıcı değiştirme ve transkodlama

  • Dosya yeniden sarmalama işlemi ffmpeg -i input_file.ext -c copy -map 0 output_file.ext ile yapılır
    • İçerideki video, ses ve altyazı verilerini değiştirmeden başka bir kapsayıcı biçimine taşır
    • Yeniden sarmalama, remuxing veya re-multiplexing olarak da adlandırılır
    • Birden fazla ses parçası gibi tüm akışları koruyabilmek için -map 0 kullanılmalıdır
    • Bazı kapsayıcılar yalnızca belirli akış kodlamalarını barındırabildiğinden, yeniden kodlama olmadan yeniden sarmalama mümkün olmayabilir
  • Broadcast WAV oluşturma, -write_bext 1 ve -metadata field_name='Content' ile BEXT chunk ve ilgili metaverileri yazar
    • Sık kullanılan alanlar description, originator, originator_reference, origination_date, origination_time, coding_history, IARL şeklindedir
    • BWF metaveri alanlarında karakter sayısı sınırları vardır; OriginatorReference en fazla 32 karakterdir
  • DV codec’li videoyu .dv dosyasına yeniden sarmalarken, DV akışı içindeki kaynak metaverilerinin istemeden kaldırılmasını önlemek için -f rawvideo -c:v copy kullanılır
  • Apple ProRes LT transkodlama örneği -c:v prores -profile:v 1 -vf yadif -c:a pcm_s16le şeklindedir
    • ProRes 422 profilleri 0 Proxy, 1 LT, 2 Standard, 3 HQ olarak ayrılır
    • ProRes kapsayıcıları olarak QuickTime .mov, Matroska .mkv, MXF .mxf FFmpeg tarafından desteklenir
  • H.264 transkodlama örneği -c:v libx264 -pix_fmt yuv420p -c:a aac şeklindedir
    • libx264 varsayılanı medium preset’i ve CRF 23’tür
    • -pix_fmt yuv420p, QuickTime ve FFmpeg tabanlı olmayan çoğu oynatıcıyla uyumluluk için 4:2:0 chroma subsampling belirtir
    • Akış optimizasyonu için -movflags +faststart eklenir
    • Daha yüksek kalite örneği -preset veryslow -crf 18 olup CRF 18 çoğu zaman “görsel olarak kayıpsız” kabul edilir
  • Nvidia GPU tabanlı H.264/H.265 kodlama h264_nvenc veya hevc_nvenc kullanır
    • Nvidia sabit işlevli donanımı CPU kodlamaya göre 10 kat performans sunabilir, ancak düşük bitrate kalite optimizasyonu için daha fazla parametre gerekir
    • HEVC, yaklaşık 2015 sonrası GPU’larda desteklenen daha verimli bir codec olarak açıklanır
  • H.265/HEVC transkodlama -c:v libx265 -pix_fmt yuv420p -c:a copy kullanır
    • libx265 varsayılanı medium preset’i ve CRF 28’dir
    • H.265’te CRF 28, H.264’te CRF 23’e karşılık gelir ve dosya boyutu yaklaşık yarıya inebilir
  • Koruma amaçlı kayıpsız örnek, FFV1 Version 3’ü Matroska kapsayıcısına koyup giriş framemd5 çıktısını da birlikte oluşturan komuttur
    • -map 0 tüm akışları eşler
    • -dn, Matroska’nın izin vermediği veri akışlarını hariç tutar
    • -slicecrc 1, kod çözücünün bozuk slice’ları algılayabilmesi için CRC bilgisi ekler
    • -f framemd5 -an, her video karesi için MD5 sağlama toplamı oluşturur

Video ve ses özelliklerini değiştirme

  • En-boy oranı değiştirme tarifi padding filtresini kullanır
    • 4:3’ü 16:9 yapmak için pillarbox uygulanır
    • 16:9’u 4:3 yapmak için letterbox uygulanır
    • Sessiz videolarda -c:a copy yerine -an kullanılabilir
  • SD’yi HD’ye dönüştürme örneği colormatrix=bt601:bt709, scale=1440:1080:flags=lanczos, pad=1920:1080:240:0 olmak üzere üç filtre kullanır
    • Rec. 601’den Rec. 709’a luma katsayılarını değiştirir
    • Lanczos ölçekleme varsayılan bilinear’dan daha yavaştır, ancak daha iyi sonuç verir
    • Interlaced kaynaklar için ölçeklemeden önce yadif ile deinterlace yapılması önerilir
  • Görüntüleme en-boy oranı, -aspect 4:3 gibi seçeneklerle kapsayıcı düzeyinde değiştirilebilir
    • -c:v copy ile birlikte kullanıldığında, kodlanmış karelerin içindeki en-boy oranını değil kapsayıcıda saklanan en-boy oranını etkiler
  • Renk uzayı dönüşümü colormatrix=src:dst filtresini kullanır
    • İzin verilen değerler arasında bt601, smpte170m, bt470bg, bt709, bt2020 bulunur
    • Renk uzayı metaverisi gömmek için -color_primaries, -color_trc, -colorspace kullanılır
    • Gerçekte Rec.601 olan bir dosyaya Rec.709 etiketi de takılabileceğinden dikkat gerekir
    • Metaveri etiketlerini libx264 veya libx265 yazdığı için yeniden kodlama olmadan eklenemez
  • Hız değiştirme setpts ve atempoyu birlikte kullanır
    • Örnek, 24fps’i 25fps’e çevirirken ses perdesini koruyan PAL’e hızlandırılmış bir kopya oluşturmadır
  • Fade işlemi için fade ve afade filtreleri kullanılır; filtre kullanımı nedeniyle video ve sesin yeniden kodlanması gerekir
  • Ses çıkarma, -c:a copy -vn ile video olmadan ses akışını kayıpsız çıkarır
  • İki ses parçasını birleştirme amerge ve -filter_complex kullanır
    • YouTube otomatik altyazıları gibi tek bir ses parçası bekleyen sonraki işlemler için yararlı olabilir
    • İstenen parçaları doğrulamak için betik yazmadan önce ffprobe çalıştırılması önerilir
  • Ses yüksekliği analizi ve normalizasyon için loudnorm filtresi kullanılır
    • JSON çıktısı, 2-pass normalizasyonun girdi değerleri olarak kullanılabilir
    • Varsayılanların PBS’in önerdiği hedef ses yüksekliğiyle iyi örtüştüğü açıklanır
    • 1-pass hızlıdır, ancak 2-pass’e göre daha az doğrudur
  • CD pre-emphasis, RIAA equalization, ses yeniden örnekleme ve 192kHz WAV’ı 96kHz olarak zorla yorumlama tarifleri de bulunur

Kesme, birleştirme, segmentler

  • Aynı teknik özelliklere sahip dosyaları birleştirirken concat demuxer kullanılır
    • ffmpeg -f concat -i mylist.txt -c copy output_file
    • Birleştirilecek dosyalar aynı codec ve teknik özelliklere sahip olmalı, sonuç dosyası mutlaka önizlenmelidir
    • Mutlak yol kullanmak için -safe 0 eklenir
  • Farklı dosya biçimlerine veya codec’lere sahip dosyaları birleştirirken concat filtresi ve -filter_complex kullanılır
    • Girdi dosyalarının kapsayıcıları, codec’leri, chroma subsampling’i, kare hızları vb. farklı olabilir
    • Temel örnek yalnızca aynı çözünürlükte doğru çalışır
    • Kare hızları farklıysa çıktı değişken kare hızlı olabilir
    • Çözünürlükler farklıysa concat öncesinde scale ile eşitlenir; SD ve HD birleştirirken SD’ye pillarbox uygulanabilir
  • Dosya bölme segment muxer ile yapılır
    • -segment_time 60, en fazla 60 saniyelik segmentler oluşturur
    • %03d, 3 basamaklı sıfır dolgulu sayı içeren dosya adları üretir
  • Yeniden kodlama olmadan kırpma -ss, -to, -t, -c copy, -map 0 kullanır
    • H.264 gibi kareler arası codec’lerde başlangıç, i-frame’e göre en yakın noktadan yapılabilir
    • -sseof -5, dosyanın sonundan 5 saniye öncesinden itibaren kopyalama yöntemidir
  • Ses dosyasının başındaki sessizliği kaldırma silenceremove=start_threshold=-57dB:start_duration=1:start_periods=1 kullanır
    • -57dB, analog hiss’i hesaba katmak için uygun bir seviye olarak sunulur
    • Filtre kullanımı nedeniyle ses yeniden kodlanır
  • Ses dosyasının sonundaki sessizliği kaldırma areverse, silenceremove, areverse sırasıyla yapılır
    • silenceremove başlangıçtaki sessizliği kaldırmaya daha uygun olduğundan ses ters çevrilip tekrar geri çevrilir

Geçmeli video işleme

  • SD NTSC kaynaktan HD H.264 erişim dosyası oluştururken yadif, scale, pad, format=yuv420p birlikte kullanılır
    • yadif bir deinterlace filtresidir
    • scale=1440:1080:flags=lanczos görüntüyü 1440x1080’e ölçekler
    • pad=1920:1080:(ow-iw)/2:(oh-ih)/2, 4:3 girdiyi 16:9 çıktı karesine uyacak şekilde dolgu ekler
  • Genel deinterlace örneği -vf "yadif,format=yuv420p" şeklindedir
    • format=yuv420p, H.264 oynatma uyumluluğu için 4:2:0 kroma alt örneklemesini belirtir
    • FFmpeg’de yadif dışında bwdif, w3fdif, kerndeint, nnedi deinterlacer’ları da vardır
  • Alanları karelere ayıran deinterlace için idet,bwdif,format=yuv420p kullanılır
    • Hareketin yoğun olduğu geçmeli videolarda kaynağın görsel cadence’ini korumak için tercih edilir
    • idet alan sırasını algılar
    • bwdif varsayılan olarak her alan için bir kare çıktılar
  • Inverse telecine, fieldmatch,yadif,decimate kullanır
    • 3:2 pulldown’ı geri alarak 29.97fps geçmeli videoyu özgün film kaynağının 24fps kare hızına geri döndürür
    • 29.97i dosyaya uygulandığında çıktı kare hızı fiilen 23.976fps olur
  • Alan sırasını değiştirmek için setfield=tff veya setfield=bff kullanılır
    • Video filtresi kullanıldığı için -c copy kullanılamaz; yeniden kodlama gerekir
  • Geçmeli desenini kontrol etmek için ffmpeg -i input_file -filter:v idet -f null - ile çıktı dosyası olmadan analiz yapılır

Filigran, altyazı, küçük resim, GIF

  • Metin filigranı drawtext filtresiyle oluşturulur
    • fontfile, fontsize, text, fontcolor, alpha, x, y seçenekleri belirtilir
    • x=(w-text_w)/2:y=(h-text_h)/2, video boyutundan bağımsız olarak ortalar
  • Görsel filigranı overlay=main_w-overlay_w-5:5 ile sağ üste yerleştirilebilir
  • Burn-in timecode için drawtextin timecode, box, boxcolor, rate seçenekleri kullanılır
    • Başlangıç timecode’u hh:mm:ss[:;.]ff biçimindedir
  • Altyazı dosyası gömmek için -i subtitles_file -c copy -c:s mov_text kullanılır
    • mov_text, MP4 ve MOV konteynerlerinde çalışır
    • MKV konteynerinin izin verdiği biçimler ASS, SRT, SSAdır
  • Tek bir küçük resim -ss 00:00:20 -vframes 1 thumb.png ile çıkarılır
  • Her 1 dakikada bir küçük resim oluşturmak için -vf fps=1/60 out%d.png kullanılır
  • Görüntü dizisini GIF’e dönüştürürken image2, -framerate, -pattern_type glob, scale kullanılır
  • Yüksek kaliteli GIF iki aşamada oluşturulur
    • İlk komut palettegen ile özel bir palet oluşturur
    • İkinci komut paletteuse ile paleti uygular
    • Daha basit yöntem -vf "fps=10,scale=500:-1" kullanmaktır; ancak dithering daha belirgin olur ve dosya boyutu daha küçük olur

Görüntü dizisi, skoplar, OCR

  • Bir görüntü dizisini 10-bit sıkıştırılmamış videoya dönüştürürken -f image2 -framerate 24 -i input_file_%06d.ext -c:v v210 kullanılır
    • image2 demuxer’ının varsayılan kare hızı 25fps’dir
    • %06d, altı haneli sayısal dosya adlarını artan sırayla okur
  • Bir görüntü ve ses dosyasını birleştirip video oluştururken -loop 1, -shortest, -vf scale=1280:720 kullanılır
    • Ses dosyasını YouTube gibi platformlara yüklemek istediğinizde yararlı olabilir
  • ffplay -f lavfi ve filtreler kullanılarak ses bit derinliği görselleştirmesi, desibel grafiği, yayın aralığı dışındaki piksellerin gösterimi ve vectorscope gösterimi yapılabilir
  • tblend=all_mode=difference128 ve hstack, iki giriş videosunun zamansal farklarını yan yana gösterir
  • xstack, birden fazla video kaynağını dikey veya yatay olarak yığan bir çıktı penceresi oluşturmak için kullanılır; vrecordda kullanılan çıktı penceresiyle aynı tür amaçlar için yararlıdır
  • OCR örneği, tanınan metni video üzerine göstermek için ocr filtresi ve drawtext kullanır
  • OCR veri çıktısı ffprobe -show_entries frame_tags=lavfi.ocr.text -f lavfi -i "movie=input_file,ocr" biçiminde ekrana yazdırılır

Meta veri, sağlama toplamı, koruma işlemleri

  • Teknik meta veri çıkarma ffprobe -i input_file -show_format -show_streams -show_data -print_format xml ile yapılır
    • Çıktı biçimi olarak XML dışında JSON ve flat de kullanılabilir
  • Meta veri kaldırmak için -map_metadata -1 -c:v copy -c:a copy kullanılır
    • Video ve ses kopyalanır, meta veri kopyalanmaz
  • Bash toplu işleme .sh dosyası ve for döngüsüyle yapılır
    • Örnek: for file in *.mxf; do ffmpeg -i "$file" -map 0 -c copy "${file%.mxf}.mov"; done
    • .sh dosyası ve işlenecek .mxf dosyaları aynı dizinde olmalı ve komut o dizinden çalıştırılmalıdır
    • Özyinelemeli işleme için find input_directory -iname "*.mxf" -exec ffmpeg -i {} -map 0 -c copy {}.mov \; kullanılabilir
  • Windows’ta toplu işleme PowerShell .ps1 betiğiyle yapılır
    • Örnek, .mp4 dosyalarının listesini oluşturur ve her dosyanın uzantısını .mkv olarak değiştirip yeniden sarmalar
    • ffmpegin tam yol olmadan çağrılabilmesi için doğru şekilde ayarlanmış olması gerekir
  • Dekoder hatalarını kontrol etmek için ffmpeg -i input_file -f null - ile çıktı dosyası olmadan decode edilir ve hatalar ekrana yazdırılır
  • FFV1 Version 3 fixity kontrolü -report -i input_file -f null - ile CRC checksum mismatch olup olmadığını kontrol eder
    • Frame CRC, FFV1 Version 3’te varsayılan olarak etkindir
  • Kare bazlı video MD5’i -f framemd5 -an ile oluşturulur
  • Ses örneği grupları bazında MD5, asetnsamples=n=48000 -f framemd5 -vn ile oluşturulur
    • Örnek grubu sayısının medyanın sample rate’iyle eşleştirilmesi iyi bir uygulama olarak sunulur
    • Varsayılan olarak ses 16-bit PCM’e transcode edilerek framemd5 oluşturulur
  • Stream MD5, video ve ses stream’leri ayrı ayrı -map edilip -c copy -f md5 ile oluşturulabilir
    • Konteyner meta verisi değişikliklerinden bağımsız olarak A/V bilgi bütünlüğünü doğrulamak için kullanılır
  • streamhash, tüm stream’ler için stream bazında hash çıktısı verir
    • Hangi stream’den kaç tane olduğunu bilmeye gerek olmadığı için mixed born-digital material hash’lemede yararlıdır
  • QCTools raporu, ffprobe -f lavfi ile signalstats, cropdetect, idet, psnr, ssim, ebur128, astats vb. kullanılarak .qctools.xml.gz oluşturur
    • Sesi olan ve olmayan dosyalar için ayrı komutlar sağlanır
  • EIA-608 Line 21 kapalı altyazı çıkarma, readeia608 filtresi ve ffprobe ile hex değerlerini CSV olarak çıktılar

Test dosyaları ve diğer FFmpeg örnekleri

  • Test videoları mandelbrot, smptebars, testsrc, smptehdbars gibi lavfi girdileriyle oluşturulur veya oynatılır
    • Mandelbrot örneği 1280x720, 25fps, 10 saniyelik H.264 çıktısıdır
    • SMPTE bars örneği 720x576, 25fps, 10 saniyelik ProRes çıktısıdır
    • HD SMPTE bars oynatma: ffplay -f lavfi -i smptehdbars=size=1920x1080
    • VGA SMPTE bars oynatma: ffplay -f lavfi -i smptebars=size=640x480
  • Sinüs dalgası test sesi, sine=frequency=1000:sample_rate=48000:duration=5 ve pcm_s16le ile bir WAV dosyası oluşturur
  • SMPTE bars ve 1kHz sinüs dalgasını birleştiren test videosu, iki lavfi girdisi ile -c:v ffv1, -c:a pcm_s16le kullanır
  • Bozulma test dosyası, -bsf noise=1 -c copy ile paket içeriğini kasıtlı olarak bozar ancak container’ı bozmaz
  • Conway's Game of Life, ffplay -f lavfi life=... ile simüle edilir; ffmpeg ve -t 5 kullanılırsa belirli bir bölüm kaydedilebilir
  • İki videonun algısal benzerlik karşılaştırması signature=detectmode=full:nb_inputs=2 filtresini kullanır
  • Girdi videosunun algısal hash’i, signature=format=xml:filename="output.xml" ile bir XML dosyası oluşturur
  • Görüntü dizileri, ffplay -framerate 5 input_file_%06d.ext ile video oluşturmadan doğrudan oynatılabilir
  • Ses ve video kanallarını ayırmak için -map 0:v:0 ve -map 0:a:0 kullanılır
  • Ses ve video kanallarını birleştirmek için -map 0:v -map 1:a -c copy ile ilk dosyanın videosu ve ikinci dosyanın sesi birleştirilir
  • DVD erişimi için ISO oluşturmaya yönelik MPEG dosyası -aspect 4:3 -target ntsc-dvd output_file.mpg ile oluşturulur; dvdauthor kurulumu gerekir
  • YDIF tabanlı sahne algılama için CSV, ffprobe ve signalstatsin lavfi.signalstats.YDIF değerlerini yazdırır
  • head switching noise, drawbox=w=iw:h=7:y=ih-h:t=max ile karenin altına siyah bir kutu çizilerek gizlenebilir
  • RTMP hedefine canlı yayın yaparken aynı anda yerel MP4 kaydı almak için tee muxer kullanılır
    • Girdi 1280px genişliğe ölçeklenir ve belirtilen süreden sonra stream sonlandırılır
    • Örnekte, bunun yaklaşık 4 yıl boyunca gerçek bir TV programının canlı yayınında her gün kullanıldığına dair bir not yer alır
  • Belirli decoder, encoder, demuxer, muxer ve filtre bilgileri ffmpeg -h type=name ile kontrol edilir
    • Örnekler encoder=libx264, decoder=mp3, muxer=matroska, demuxer=mov, filter=crop şeklindedir

FFmpeg ile birlikte tanıtılan ilgili araçlar

  • CDDA ripping aracı, CD sürücü offset’ini doğrulama ve ses CD’lerini doğru şekilde rip etme konularını ele alır
    • Farklı CD sürücü modellerinin okumaya başladığı konumlar farklı olduğundan, aynı içeriğin checksum doğrulaması için offset düzeltmesi gerekir
    • Sürücü tanımlama cdda2wav -scanbus, cdda2wav, cdparanoia -vsQ ile kontrol edilebilir
    • Offset değeri Accurate Rip CD drive offset list üzerinden bulunur
    • macOS GUI aracı olarak XLD tanıtılır
  • CD Paranoia ile ripping, cdparanoia -L -B -O [Drive Offset] [Starting Track Number]-[Ending Track Number] output_file.wav komutunu kullanır
    • -B, parçaları otomatik olarak ayrı dosyalara bölen batch modudur
  • Cdda2wav, ses CD’lerini doğru şekilde rip etmek için Paranoia library kullanan bir araçtır
    • Homebrew kurulum komutu brew install cdrtools şeklindedir
    • Örnek komut, tüm CD’yi tek bir WAV olarak rip eder, CDDB sorgular ve cue sheet oluşturur
    • macOS’te komutu çalıştırmadan önce CD’nin unmount edilmesi gerekir
  • CD emphasis, bazı erken 1980’ler CD’lerini ve Japon baskı CD’leri etkileyebilen bir gürültü azaltma yöntemi olarak açıklanır
    • Varlık kontrolü cdda2wav -J veya cdparanoia -Q ile yapılır
    • Cdda2wav ile ripping sırasında düzeltmek için -T bayrağı eklenir
  • ImageMagick, raster ve vektör görüntü dosyalarını görüntülemek, dönüştürmek ve düzenlemek için ücretsiz ve açık kaynaklı bir yazılım koleksiyonudur
    • Komutlar convert, montage, mogrify gibi ayrı komutlar olarak çağrılır
    • Görüntü karşılaştırma, compare -metric ae image1.ext image2.ext null: ile farklı piksel sayısını döndürür
    • Küçük resim oluşturma mogrify -resize 80x80 -format jpg -quality 75 -path thumbs *.jpg kullanır
    • Görüntü ızgarası montage @list.txt -tile 6x12 -geometry +0+0 output_grid.jpg ile oluşturulur
    • EXIF kaldırma mogrify -path ./stripped/ -strip *.jpg kullanır
  • flac aracı, FLAC projesi tarafından oluşturulan FLAC transcoding ve metadata işleme aracıdır
    • Diğer araçlara kıyasla BWF gibi foreign metadata gömebilme avantajına sahiptir
    • WAV’dan FLAC’a dönüştürürken BWF metadata’sını korumak için flac --best --keep-foreign-metadata --preserve-modtime --verify input.wav kullanılır
    • FLAC’tan özgün BWF’yi yeniden oluşturmak için --best yerine --decode kullanılır

1 yorum

 
GN⁺ 2023-07-31
Hacker News yorumları
  • Konudan biraz sapıyorum ama ffmpeg’in şimdiye kadar yapılmış en üst düzey yazılımlardan biri olduğunu düşünüyorum
    Fabrice Bellard gibi yetenekli bir mühendis FOSS topluluğu için büyük bir armağan; daha önce çalıştığım, değeri yaklaşık 2 milyar dolar olan unicorn’da da ürünün büyük bir kısmı ffmpeg’e dayanıyordu

    • O zaman herhâlde epey büyük bir bağış yapmışlardır?
      https://ffmpeg.org/donations.html
    • “Fabian Fabrice” değil, Fabrice Bellard
      QEMU, TCC, QuickJS gibi şeyleri de yapan kişi
    • Onun gibisi yok. Fabrice Bellard ile aynı ligde olan kimse de yok; hatta en başta aynı oyunu oynayan biri bile yok gibi :-)
      Ciddi konuşmak gerekirse, herhangi bir anda onun yazdığı kodun çalıştığı cihaz sayısı gerçekten akıl almaz düzeyde
    • Bilgi olarak: “FFmpeg”deki “FF”, “fast forward” anlamına geliyor
    • ffmpeg’i seviyorum ama ARM performansı iyileştirilmeli
  • ffmpeg komut satırı, iyi rehberlere baksanız bile hâlâ insanı saç baş yoldurduğu için VapourSynth önermek isterim
    https://www.vapoursynth.com/
    Optimize edilmiş Python tarzı bir video filtreleme aracı, ama bundan çok daha fazlası da var: https://vsdb.top/
    Ayrıca StaxRip; ffmpeg, VapourSynth, onlarca encoder ve aracı iyi kullanıyor; sırf bu yüzden Linux’tan Windows’a yeniden başlatıyorum: https://github.com/staxrip/staxrip

    • Daha iyi bir komut satırı arayüzüne sahip bir ffmpeg wrapper bile olsa gerçekten harika olurdu
      Gereksiz derecede karmaşık; bir açıdan bakınca yapının tamamı mantıklı olabilir ama çok yaygın işleri yapmak için büyü formülü gibi seçenekleri bilmek zorunda olmak uygun değil
      150 karakterlik ffmpeg komutlarını iki kelimeye indiren onlarca bash alias’ım vardır
      ffprobe da akıl alır gibi değil; kullanımın %99’u argümansız çalıştırıp uzunluk, çözünürlük, frame rate ve ses parçası sayısını hızlıca görmek iken çıktının %99’u derleme seçenekleri gibi tamamen alakasız şeyler
  • Birlikte bakılabilecek kaynaklar:
    https://ffmpeg.guide/ — karmaşık FFmpeg filtre grafiklerini hızlı ve doğru şekilde oluşturma
    https://www.hadet.dev/ffmpeg-cheatsheet/ — kesme, fade in/out ekleme, ölçekleme, birleştirme vb.

    • İkinci bağlantıdaki kesme komutu, benim deneyimime göre ideal değildi
      Bilinmeyen bir nedenle ffmpeg, -ss ve -t/-to bayraklarını -i’den önce mi sonra mı koyduğunuza bağlı olarak farklı davranıyor; bende önce koymak daha iyi sonuç verdi
      Orijinal metinde de aynı sorun var
    • ffmpeg.guide harika görünüyor ama ffmpeg’in kendisinde daha iyi bir şey olması gerektiğini düşünüyorum
      Doğrusal olmayan bir grafiği düz ve doğrusal bir komut satırına zorla sığdırmak tuhaf
      Daha ayrıntılı bir JSON yapılandırması bile çok daha iyi olurdu
    • ffmpeg.guide gerçekten iyi. ImageMagick için de benzeri var mı?
    • Sadece ffmpeg-python kullanın
  • Çok faydalı
    ffmpeg komutları oluştururken ChatGPT kullanmaya başladım; gereken şeyi bulmak çok daha hızlı ve kolay oluyor
    Komut satırından doğrudan yapabilmek için küçük bir araç da yaptım: https://github.com/alexkrkn/help-cli
    İlgili bir video da hazırladım: https://www.youtube.com/watch?v=pOda6TDBqcY

  • Yakın zamanda bir ffmpeg UI ararken Shutter Encoder’ı keşfettim; açık kaynaklı, mac/windows destekleyen çok iyi bir yazılımmış
    Sonunda 15 yıllık, 300 GB’lık kişisel video arşivimi sıkıştırmaya başladım
    https://www.shutterencoder.com/
    Hepsini H.265’e sıkıştırıyorum ve video boyutu bazen 1/10’a kadar düşüyor. Bunu yapmamam için bir neden var mı? Sıkıştırılmış videoları oynatmak için daha fazla işlem gücü gerektiğini okudum ama ileride büyük bir sorun olur mu emin değilim

    • Büyük bir video arşivine otomatik olarak uygulamayı denedim; test videolarında iyi görünse de CRF ayarı zayıf kaldığı için kalite beklediğimin altındaydı
      Bunu, orijinalleri silmeden önce birden çok videoyu doğrulamanız gerektiğine dair bir uyarı olarak alın
      Yine de 300 GB ise depolama yeterince ucuz; orijinalleri olduğu gibi saklayabilirsiniz
    • Hâlâ H.264 seçmenin nedenlerinden biri, eski donanımlarda veya düşük maliyetli donanımlarda çoğu zaman H.265 donanımsal decoding olmaması
      Ayrıca Plex’te transcoding olmadan kullanmak için benim homelab’imde de bu seçenek daha kolay
  • Bu rehber deinterlacing filtresi olarak yadif öneriyor ama benim gözüme w3fdif daha iyi görünüyor
    yadif gibi hareket takibi yapmadığı için oldukça hızlı ve hareket takibinin bazen ürettiği rahatsız edici artefact’lardan kaçınabiliyor
    Bence bazen harika bazen kötü sonuçlardansa, tutarlı şekilde vasat sonuçlar daha iyi
    Ancak yadif’in iki field’a bakmasının aksine w3fdif aynı anda üç field’ı dikkate alıyor ve interlacing artefact’larını daha iyi gizliyor

    • Bunun genişletilmiş bir sürümü var: https://github.com/HomeOfVapourSynthEvolution/VapourSynth-Bw...
      Zaten yeniden encode edecekseniz, doğrudan QTGMC kullanmak daha iyi
    • Yukarıda belirtildiği gibi w3fdif genel olarak bwdif ile değiştirildi
      w3fdif titreme/parıldama etkisi yaratabilir ama yadif bunu yapmaz; bu yüzden bwdif, yadif gibi davranırken w3fdif’in daha iyi field matching’ini kullanır
    • bwdif, yadif ile w3fdifin hibritidir
  • ffmpeg’i benimsemekteki en büyük engel muhtemelen çevrimdışı premium freemium araçlar ve web frontend’leri
    Siteler, insanların Google’a sıkça yazdığı “avi to mp4”, “mp3 to wav” gibi ifadelerle arama optimizasyonu yapmış durumda
    Komut satırı uygulamalarını kabul etmem beklediğimden daha uzun sürdü; çünkü Windows dünyası, her şeyin bir GUI’si olması gerektiğini öğretmişti

    • Bu tür dosya dönüştürme sitelerinin çoğunun, nginx gibi bir şeyin üzerine ffmpeg koyan bir yapı olduğunu düşünmüştüm
  • İnsanlar ffmpeg’in karmaşık olduğunu söylüyor ama onu şık bir GUI’ye dönüştürseniz de pek kolaylaşmıyor. Karmaşık olan video sıkıştırmanın kendisi
    HandBrake gibi tıklamalı arayüzlerde olduğu gibi kararları sizin yerinize veren bir yaklaşım değilse, hiçbir yazılımın bunu daha kolay hale getirebileceğini sanmıyorum
    Emin değilim ama dijital video kodlama ve sıkıştırmayı yeterince ayrıntılı öğrendikten sonra ffmpeg’de ne yapmanız gerektiği de oldukça sezgisel gelebilir. Bunu gerçekten yapmış biri var mı?

    • Yaklaşık 17 yıl önce WindowsMobile için DirectShow filtresi yazmıştım, bu yüzden codec’leri ve container’ları epey iyi anlıyorum
      O dönemde mkv gibi formatlar ya da HEVC gibi codec’ler yoktu ama çeşitli filtreler üzerinden ses/videoyu işleme kavramı harikaydı ve çoğu A/V dönüştürme yazılımı böyle çalışıyor
      FFmpeg man sayfalarına bakmaya başlayınca bağlantıları gördüm ve yaklaşık bir gün kurcaladıktan sonra kullanabilir hale geldim
      Komut satırını sevmem ve man sayfalarını okuyan biri olmam da avantaj sağlamış olabilir
  • ffmpeg güçlü olduğu için sık kullanıyorum ama API yapısı kafama oturmuyor. Bir LLM frontend’i olsa iyi olurdu

  • İyi fikir. FFmpeg’e istediğim işi yaptırmak her zaman göz korkutucu
    ChatGPT yardımcı oldu ama kusursuz değildi

    • ChatGPT sayesinde birçok komut satırı aracının argümanlarını ve seçeneklerini kullanmak kolaylaştı
      OpenSSL seçeneklerini ve argümanlarını ezberlemek her zaman zordu; artık sadece GPT kullanıyorum
    • ChatGPT sayesinde ffmpeg gerçekten çok daha erişilebilir hale geldi
      Yalnız işletim sistemleri arasındaki ince farklar küçük bir sorun olarak kalıyor