- Ses ve videoyu kodlayıp çözebilen, transcode edebilen ve yayınlayabilen FFmpeg framework’ünün yapısı ve kullanımını ele alıyor
- ffmpeg, ffplay, ffprobe gibi komut satırı araçlarının ve libavcodec, libavformat, libavfilter gibi çekirdek kütüphanelerin rollerini ayrıntılı biçimde açıklıyor
- AVFormatContext, AVCodecContext, AVPacket, AVFrame etrafında akış analizi ve decoding sürecini adım adım uyguluyor
- meson/ninja build sistemi ile örnek kodları otomatik indirip derliyor, örnek medya dosyalarını analiz ederek sonuçları yazdırıyor
- FFmpeg’in iç çalışma mantığını ve decoding pipeline’ını anlamaya yönelik uygulamalı bir giriş kaynağı olarak kullanılabilir
FFmpeg paket yapısı
- FFmpeg, çeşitli ses ve video formatlarını kodlayıp çözebilen, transcode edebilen ve ağ üzerinden yayınlayabilen araçlar ve kütüphaneler koleksiyonundan oluşur
-
FFmpeg araçları
- ffmpeg: Komut satırı tabanlı multimedya format dönüştürme aracı
- ffplay: SDL ve FFmpeg kütüphaneleri tabanlı basit bir medya oynatıcı
- ffprobe: Multimedya akışlarını analiz eden araç
-
FFmpeg kütüphaneleri
- libavformat: Girdi/çıktı ve muxing/demuxing işlevleri sağlar
- libavcodec: Encoding/decoding işlevleri sağlar
- libavfilter: Graf tabanlı filtreler üzerinden ham medya işleme
- libavdevice: Girdi/çıktı aygıt desteği
- libavutil: Ortak multimedya yardımcı araçları sağlar
- libswresample: Ses yeniden örnekleme, örnek formatı dönüşümü ve ses miksleme desteği
- libswscale: Renk dönüşümü ve görüntü ölçekleme işlevleri
- libpostproc: Video son işleme (deblocking, gürültü filtresi vb.) işlevleri
Basit FFmpeg oynatıcı
- FFmpeg’in temel kullanım biçimi, bir multimedya akışını demux ederek ses ve video akışlarına ayırmak ve bunları ham ses/video verisine decode etmekten oluşur
-
Başlıca yapılar
- AVFormatContext: Akış senkronizasyonunu, metadata’yı ve muxing’i yöneten üst yapı
- AVStream: Sürekli bir ses veya video akışı
- AVCodec: Verinin encoding ve decoding yöntemini tanımlar
- AVPacket: Akış içindeki kodlanmış veri
- AVFrame: Decode edilmiş ham video karesi veya ses örnekleri
-
Akış analizi ve demux süreci
avformat_alloc_context() ile AVFormatContext için bellek ayrılır
avformat_open_input() ile multimedya dosyası açılır
avformat_find_stream_info() ile dosya içindeki akış bilgileri analiz edilir
- Her akışın time base’i, frame rate’i, başlangıç zamanı, süresi, tipi ve FourCC kodu yazdırılır
avformat_close_input() ile dosya kapatılır ve bellek serbest bırakılır
-
Codec bulma ve başlatma
avcodec_find_decoder() ile AVStream’in codec ID’sine uygun decoder bulunur
- Video akışında çözünürlük (width, height), ses akışında ise kanal sayısı ve sample rate yazdırılır
avcodec_alloc_context3() ile AVCodecContext oluşturulur
avcodec_parameters_to_context() ile akışın codec parametreleri decoder context’ine uygulanır
avcodec_open2() ile decoder açılır
-
Paket okuma ve decoding
AVPacket ve AVFrame yapıları, sırasıyla kodlanmış paketleri ve decode edilmiş frame’leri saklamak için ayrılır
av_read_frame() ile giriş dosyasından paketler sıralı olarak okunur
- Paketin stream_index değeri üzerinden hangi akıştan geldiği belirlenir
- Yalnızca seçilen video akışının (
first_video_stream_index) paketleri decoder’a gönderilir
avcodec_send_packet() ile paket decoder’a iletilir
avcodec_receive_frame() ile decode edilmiş frame’ler döngü içinde alınır
- Her frame’in numarası, tipi (I/P/B), formatı, PTS değeri ve keyframe olup olmadığı yazdırılır
av_packet_unref() ile paket belleği yeniden kullanıma hazırlanır
- Tüm işlemler tamamlandığında
av_packet_free(), av_frame_free(), avcodec_free_context(), avformat_close_input() ile bellek serbest bırakılır
-
Çalıştırma ve örnek çıktı
- Örnek kod GitHub deposunda sunuluyor
- meson ve ninja ile build edilebilir (
pip3 install meson ninja)
meson setup build çalıştırıldığında FFmpeg otomatik olarak indirilip yapılandırılır
ninja -C build ile build edildikten sonra ./build/ffmpeg-101 sample.mp4 ile çalıştırılır
- Çıktı olarak dosya formatı, akış bilgileri (video/ses), codec, çözünürlük, sample rate, her paketin PTS değeri ve decode edilen frame bilgileri yazdırılır
-
Çıktı örneği özeti
- Video akışı: H.264 (avc1), çözünürlük 206x80, frame rate 30fps
- Ses akışı: AAC (mp4a), 2 kanal, 44.1kHz
- Her paketin PTS değeri ve frame tipi (I/P) sırayla gösterilir, decoding süreci konsolda yazdırılır
Build ve çalışma ortamı
- Gerekli araçlar: Python, pip, meson, ninja
- Kurulum komutu:
pip3 install meson ninja
-
Build adımları
- Örnek arşiv dosyasını
ffmpeg-101 klasörüne çıkarın
meson setup build komutunu çalıştırın
ninja -C build ile build edin
./build/ffmpeg-101 sample.mp4 ile çalıştırın
- FFmpeg sistemde kurulu değilse otomatik olarak indirilip yapılandırılır
1 yorum
Hacker News yorumları
FFmpeg ve libav'in iç işleyişini derinlemesine anlamak isteyenlere Leandro Moreira'nın eğitimini şiddetle tavsiye ediyorum
Şahsen şimdiye kadar gördüğüm en eksiksiz ve en net anlatım bu
FFmpeg-libav eğitim bağlantısı
Daha şimdiden ffmpeg 101 olması şaşırtıcı. Sanki ffmpeg 8 daha dün çıkmış gibi
Bir başka rehber daha paylaşılmış
HN'deki ilgili rehber bağlantısı
FFmpeg, gerçekten bayıldığım bir araç
ffmpeg için harika bir başlangıç kaynağıydı. Teşekkürler
ffmpeg tam anlamıyla bir süper güç
Birden fazla video parçasını oynatılabilir tek bir biçimde birleştirmek gerektiğinde hep onu kullanıyorum