Software decoding — mərkəzi prosessordan (CPU) istifadə edərək, SoC-nin aparat blokları olmadan proqram kitabxanaları vasitəsilə media məlumatlarının dekompressiya prosesidir. Proqram dekoderləri çarpaz platformalı kitabxanalar kimi həyata keçirilir: FFmpeg libavcodec ilə və AV1 üçün dav1d. FFmpeg sənədlərinə (2026) görə, libavcodec 200-dən çox kodeki dəstəkləyir ki, bu da software decoding-i nadir formatların oxudulmasının yeganə yolu edir.
Əsas məqamlar
Software decoding — bütün hesablama əməliyyatlarının CPU-nun universal nüvələrində yerinə yetirildiyi media məlumatlarının dekompressiya üsuludur. Aparat dekodinqindən fərqli olaraq, hər bir kodekin ayrıca fiziki bloku var, proqram dekoderi isə eyni alqoritmləri prosessor təlimatları ilə yerinə yetirən adi koddur.
Proqram dekoderləri müəyyən CPU arxitekturaları üçün optimallaşdırmalardan istifadə edərək C/C++ dilində yazılır: mobil cihazlar üçün ARM NEON SIMD təlimatları, desktoplar üçün Intel SSE/AVX. FFmpeg tərkibindəki libavcodec kitabxanası müxtəlif platformalar üçün on minlərlə sətir optimallaşdırılmış assembler kodu ehtiva edir ki, bu da proqram dekodinqinə güclü CPU-larda AV1 kimi ağır formatlar üçün belə layiqli performans əldə etməyə imkan verir.
Proqram dekodinqinin əsas üstünlüyü universallıqdır. Aparat dekoderi yalnız 4–5 əsas formatı (H.264, H.265, VP9, AV1) dəstəkləyirsə, FFmpeg 200-dən çox kodeki dekod edə bilər: müasir AV1 və H.265-dən arxiv Sorenson Spark, RealVideo və Motion JPEG-ə qədər. Bu, proqram dekodinqini qeyri-standart media məlumatları ilə işləyən tətbiqlər üçün — məsələn, peşəkar video redaktorları, müşahidə sistemləri və ixtisaslaşmış pleyerlər üçün əvəzolunmaz alət edir.
Proqram dekodinqi aparatla eyni mərhələləri təkrarlayır, lakin universal CPU-da. Hər mərhələ hər bir makroblok və ya kadr üçün ardıcıl çağırılan funksiyalar şəklində həyata keçirilir. Əsas fərq çeviklikdir: tərtibatçı pipeline-ı dəyişə, dekodinq mərhələləri arasında filtrlər və post-emal əlavə edə bilər.
Tipik proqram dekoderi alqoritmin ayrı-ayrı mərhələlərini həyata keçirən modullardan ibarətdir. Entropiya dekodlaşdırma modulu bit axınını oxuyur və kvantlaşdırılmış DCT əmsallarını bərpa edir. H.264 üçün bu modul CABAC (Context-Adaptive Binary Arithmetic Coding) — şərti keçidləri olan mürəkkəb alqoritmi həyata keçirir ki, bu da aparat sürətləndirilməsinə zəif uyğun gəlir, lakin yaxşı branch prediktoru olan CPU-da səmərəli işləyir.
Tərs kvantlaşdırma modulu əmsalları kvantlaşdırma addımına vurur, tərs DCT modulu isə diskret kosinus çevrilməsini tətbiq edir. Tərs DCT-nin proqram tətbiqi 8x8 bloku üçün vurma-akkumulyasiya əməliyyatlarının sayını 4096-dan 256-ya endirən sürətli Chen alqoritmi və ya Loeffler alqoritmindən istifadə edir. NEON SIMD təlimatları (ARM) və ya SSE (x86) bir təlimatda 4–8 əmsalı emal etməyə imkan verir ki, bu da skalyar kodla müqayisədə 4–8 dəfə sürətlənmə verir.
Hərəkət kompensasiyası modulu — yaddaş üçün ən tələbkar moduldur. Hərəkət vektorlarına uyğun olaraq istinad kadrlarından sahələri çıxarır və subpiksel interpolyasiyası tətbiq edir. H.265 üçün interpolyasiya dəqiqliyi 1/8 pikselə çatır ki, bu da lüma üçün 8-taplı FIR filtri və xroma üçün 4-taplı filtr tələb edir. Proqram tətbiqi istinad kadrlarının böyük həcmdə məlumatlarını keşdən yükləməyə məcbur olur ki, bu da CPU-da yüksək rezolyusiyaların dekodlanmasında hərəkət kompensasiyasını darboğaza çevirir.
Apple A17 və ya Qualcomm Snapdragon 8 Gen 2 kimi müasir mobil prosessorlar kadr buraxmadan 1080p H.264 proqram dekodlaşdırması üçün kifayət qədər performansla 6–8 nüvəyə malikdir. Lakin 4K məzmunu, xüsusən H.265 və AV1 formatlarında, CPU-da proqram dekodinqi öhdəsindən gələ bilməz: bütün nüvələrin tipik yükü 70–90%-ə çatır ki, bu da çox tapşırıqlılıq üçün kritikdir. Böyük nüvələr (Apple Performance, Qualcomm Kryo Prime) kiçik enerjiyə qənaət edən nüvələrlə müqayisədə ~4–5x performans təmin edir, lakin mütənasib olaraq daha çox enerji sərf edir.
Proqram dekoderləri bazarı bir neçə əsas kitabxana ilə təmsil olunur, hər biri öz nişi üçün optimallaşdırılıb. Dekoder seçimi tələb olunan formatlardan, platformadan və lisenziya məhdudiyyətlərindən asılıdır.
FFmpeg — sənayedə proqram dekodinqinin de-fakto standartı. libavcodec kitabxanası bütün əsas və nadir kodeklərin əksəriyyəti üçün dekoderləri ehtiva edir, bütün konteynerləri (MP4, MKV, AVI, MOV, WebM) dəstəkləyir və bütün platformalarda işləyir. FFmpeg LGPL/GPL altında lisenziyalaşdırılıb ki, bu da kommersiya istifadəsində lisenziya şərtlərinin nəzərə alınmasını tələb edir. Mobil cihazlarda FFmpeg sarğılar vasitəsilə istifadə olunur: iOS və Android üçün ffmpeg-kit, React Native üçün mobile-ffmpeg.
Dav1d — VideoLAN-dan (VLC-nin yaradıcıları) SIMD optimallaşdırmaları ilə C dilində yazılmış proqram AV1 dekoderidir. Onun əsas vəzifəsi aparat dəstəyi olmadan CPU-da AV1-in mümkün qədər sürətli proqram dekodlaşdırmasıdır. Dav1d aqressiv optimallaşdırmalar sayəsində Alliance for Open Media-dan istinad libaom dekoderindən 30–50% daha sürətlidir: keşin əl ilə idarə edilməsi, post-emal filtrləri üçün JIT-kompilyasiyadan istifadə və kritik funksiyaların vektorlaşdırılması.
Mobil cihazlarda dav1d flaqman SoC-lərdə (Apple A16+, Snapdragon 8 Gen 2+) real vaxtda 1080p AV1 dekod edə bilər, lakin 4K üçün güclü CPU tələb olunur. Məsələn, Apple M1-də proqram dav1d 4K AV1 üçün ~60 FPS, Snapdragon 8 Gen 2-də isə ~35 FPS-ə çatır. Mobil cihazlarda sabit 4K AV1 oxutma üçün yenə də aparat dəstəyi tövsiyə olunur.
| Dekoder | Formatlar | Platformalar | Lisenziya |
|---|---|---|---|
| libavcodec | 200+ kodek | Hamısı | LGPL/GPL |
| dav1d | AV1 | Hamısı | BSD 2-Clause |
| libaom | AV1 | Hamısı | BSD 2-Clause |
| MediaFoundation | H.264, H.265 | Windows | Müəllif hüququ |
Proqram və aparat dekodinqi arasında seçim uyğunluq və səmərəlilik arasında kompromisdir. Aşağıdakı cədvəl əsas xüsusiyyətlərin ətraflı müqayisəsini təqdim edir.
| Parametr | Software Decoding | Hardware Decoding |
|---|---|---|
| Dəstəklənən formatlar | 200+ kodek | 4–6 kodek |
| Enerji sərfiyyatı | 1,5–5 Vt | 0,2–0,8 Vt |
| Fərdiləşdirmə | Pipeline üzərində tam nəzarət | Yalnız API vasitəsilə |
| Gecikmə | 30–80 ms | 5–15 ms |
| İstilik buraxma | Yüksək (45–50 °C) | Aşağı (35–40 °C) |
| Kodek yeniləmə | Kitabxana yeniləməsi ilə | Yalnız yeni SoC ilə |
Proqram dekodinqi maksimum çeviklik təmin edir: tərtibatçı alqoritmləri dəyişə, fərdi filtrlər əlavə edə, öz emal konveyerlərini həyata keçirə bilər. Məsələn, video montaj tətbiqlərində dekodinqin hər mərhələsi rəng korreksiyası və ya effektlərin tətbiqi üçün GPU-ya yönləndirilə bilər — bu, yalnız dekodinq üzərində proqram nəzarəti olduqda mümkündür.
Lakin çevikliyin qiyməti enerji sərfiyyatıdır. Batareyası 3000–5000 mAh olan mobil cihazlar üçün fasiləsiz proqram dekodinqi baxış müddətini 10–15 saatdan (aparat) 2–4 saata endirir. CPU-nun qızması 45–50 dərəcəyə qədər həmçinin trotlinqə — həddindən artıq istiləşmədən qorunmaq üçün prosessor tezliyinin azaldılmasına səbəb ola bilər ki, bu da kadrların buraxılmasına və istifadəçi təcrübəsinin pisləşməsinə gətirib çıxarır.
Hər iki mobil platformada proqram dekodinqinin praktik tətbiqini nəzərdən keçirək. iOS-da proqram dekodinqi FFmpeg vasitəsilə, Android-də isə eyni kitabxana Java/Kotlin sarğısı ilə istifadə olunur.
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
}
class SoftwareDecoder {
AVCodecContext* codecCtx;
public:
bool init(const char* filename) {
AVFormatContext* fmtCtx = nullptr;
avformat_open_input(&fmtCtx, filename, nullptr, nullptr);
avformat_find_stream_info(fmtCtx, nullptr);
int videoStream = av_find_best_stream(
fmtCtx, AVMEDIA_TYPE_VIDEO, -1, -1, nullptr, 0
);
AVCodec* decoder = avcodec_find_decoder(
fmtCtx->streams[videoStream]->codecpar->codec_id
);
codecCtx = avcodec_alloc_context3(decoder);
avcodec_parameters_to_context(codecCtx,
fmtCtx->streams[videoStream]->codecpar);
avcodec_open2(codecCtx, decoder, nullptr);
return true;
}
AVFrame* decodePacket(AVPacket* packet) {
avcodec_send_packet(codecCtx, packet);
AVFrame* frame = av_frame_alloc();
int ret = avcodec_receive_frame(codecCtx, frame);
return (ret >= 0) ? frame : nullptr;
}
};
Kod proqram dekodinqi üçün minimal FFmpeg pipeline-nı nümayiş etdirir. avformat_open_input faylı açır və konteyner formatını müəyyən edir, avcodec_find_decoder istənilən kodek üçün avtomatik olaraq uyğun dekoderi tapır. decodePacket metodu real vaxt tətbiqləri üçün AV_CODEC_FLAG_LOW_DELAY bayrağı aktiv olduqda çoxşaxəli dekodlaşdırmanı dəstəkləyən yeni API-dən (avcodec_send_packet / avcodec_receive_frame) istifadə edir.
class SoftwareDecoder(private val context: Context) {
fun decodeVideo(inputPath: String, outputFolder: String) {
val cmd = "-i $inputPath -vf fps=1 $outputFolder/frame_%04d.jpg"
FFmpegExecutor(context).executeCommand(cmd) { rc ->
Log.d("Dekoder", "$rc ilə bitdi")
}
}
fun getFrameCount(filePath: String): Int {
val probe = MediaMetadataRetriever()
probe.setDataSource(filePath)
val duration = probe.extractMetadata(
MediaMetadataRetriever.METADATA_KEY_DURATION
)?.toIntOrNull() ?: 0
val fps = probe.extractMetadata(
MediaMetadataRetriever.METADATA_KEY_VIDEO_FRAME_COUNT
)?.toIntOrNull() ?: 0
probe.release()
return fps
}
}
Kotlin nümunəsi videodan saniyədə bir kadr çıxarmaq üçün FFmpegExecutor istifadə edir. -vf fps=1 parametri CPU yükünü azaldaraq 60 kadrdan 59-nu keçən filtr yaradır. Bu yanaşma mobil tətbiqlərdə ön izləmə və placeholder yaratmaq üçün faydalıdır. Real vaxtda proqram dekodinqi üçün JNI vasitəsilə birbaşa libavcodec-in aşağı səviyyəli API-dən istifadə etmək tövsiyə olunur.
#include <dav1d/dav1d.h>
int decode_av1_frame(const uint8_t* data, size_t size) {
Dav1dContext* ctx = nullptr;
Dav1dSettings settings = { 0 };
dav1d_default_settings(&settings);
settings.n_threads = 4;
dav1d_open(&ctx, &settings);
Dav1dData dav1d_data = { 0 };
dav1d_data_wrap(&dav1d_data, data, size, nullptr, nullptr);
Dav1dPicture pic = { 0 };
if (dav1d_send_data(ctx, &dav1d_data) == 0) {
dav1d_get_picture(ctx, &pic);
}
dav1d_close(&ctx);
return pic.p.w;
}
Dav1d minimalist API təmin edir: dav1d_open müəyyən sayda axınla dekoder konteksti yaradır, dav1d_send_data sıxılmış bit axınını qəbul edir, dav1d_get_picture YUV420 formatında dekodlanmış kadrı qaytarır. Mobil cihazlar üçün optimal axın sayı (n_threads) UI axını üçün resurs buraxmaq üçün CPU-nun məhsuldar nüvələrinin sayından bir azdır. Dav1d həmçinin yaddaşın idarə edilməsi və kadrın GPU-ya ötürülməsi zamanı lazımsız surətlərin qarşısını almaq üçün Dav1dPicAllocator-u dəstəkləyir.
Daha yüksək enerji sərfiyyatına baxmayaraq, proqram dekodinqi aparat dekodinqinin lazımi funksionallığı təmin edə bilmədiyi bir sıra ssenarilərdə əvəzolunmazdır. Bu ssenariləri başa düşmək tərtibatçıya memarlıq qərarları qəbul etməyə kömək edir.
Aparat dekoderləri yalnız müasir formatları dəstəkləyir. Tətbiq arxiv yazıları, müşahidə (MJPEG, H.263), peşəkar kodeklər (ProRes, DNxHD, CineForm) və ya üçüncü tərəf mənbələrindən məzmunla işləyirsə — FFmpeg vasitəsilə proqram dekodinqi yeganə variant olacaq. ProRes aparat dəstəyi olan Apple A13+ çiplərindən başqa bütün cihazlarda proqram şəkildə dekodlanır. H.263 üçün heç bir müasir SoC-də aparat dəstəyi yoxdur — yalnız proqram dekodinqi.
Proqram dekodinqi kadr emalının hər mərhələsinə tam giriş verir. Bu, çıxışdan əvvəl dekodlanmış məlumatlara birbaşa filtrlər (bulanıqlaşdırma, səs-küyün azaldılması, kəskinliyin artırılması) tətbiq etmək tələb olunan tətbiqlər üçün kritikdir. FFmpeg filtrləri mürəkkəb zəncirlər qurmağa imkan verir: dekodlaşdırma -> rəng korreksiyası -> miqyaslama -> altyazı əlavə etmə -> kodlaşdırma — hamısı bir kitabxana çərçivəsində, məlumatları müxtəlif API-lər arasında ötürmədən.
Media pleyer üçün tövsiyə olunan arxitektura hibriddir: əsas olaraq aparat dekodinqi, fallback olaraq proqram. Oxutmadan əvvəl tətbiq verilmiş kodek üçün aparat dekoderinin mövcudluğunu yoxlayır. Dekoder tapılmazsa — FFmpeg vasitəsilə proqram dekodinqi işə salınır. Belə strategiya əsas formatlar üçün performans itkisi olmadan maksimum uyğunluğu təmin edir. Mövcudluğu yoxlama hər işə salınmada aparılmalıdır, çünki aparat dəstəyi hətta eyni model cihazlarda müxtəlif SoC reviziyaları səbəbindən fərqlənə bilər.
Tez-tez verilən suallar
CPU çoxlu müxtəlif tapşırıqları yerinə yetirən universal prosessordur. Dekodinq üçün o, bir tapşırığı yerinə yetirərkən belə enerji sərf edən ümumi hesablama bloklarından və keş yaddaşdan istifadə edir. Aparat dekoderi isə hər tranzistorun yalnız dekodinqdə iştirak etdiyi sabit konveyerli ixtisaslaşdırılmış sxemdir ki, bu da enerji sərfiyyatını kökündən azaldır.
H.264/H.265 üçün — SIMD optimallaşdırmaları aktiv olan FFmpeg-dən libavcodec. AV1 üçün — istinad libaom-dan 30–50% daha sürətli olan dav1d. Mobil cihazlarda dav1d-in performansı flaqman SoC-lərdə (A16+, Dimensity 9200+) real vaxtda 1080p AV1 dekodlaşdırmağa imkan verir.
Bəli, FFmpeg hər iki platformaya port edilib. iOS üçün ffmpeg-kit — bütün kodek və formatları dəstəkləyən hazır qurğu istifadə edin. Android üçün — mobile-ffmpeg və ya NDK vasitəsilə FFmpeg qurun. Kommersiya yayımında GPL/LGPL lisenziya məhdudiyyətlərini nəzərə alın.
Real vaxtda dekodinq o deməkdir ki, CPU kadrları ekranda göstərildiyindən (adətən 30 və ya 60 FPS) daha sürətli dekod edə bilir. 1080p H.264 üçün müasir mobil CPU ehtiyatla, bir məhsuldar nüvənin təxminən 30–50%-ni istifadə edərək öhdəsindən gəlir. 4K H.265 real vaxtda CPU-da yalnız flaqman SoC-lərdə bütün nüvələrin 70–90% yükü ilə mümkündür.
thread_count bayrağı ilə FFmpeg vasitəsilə çoxşaxəli dekodlaşdırmadan (frame-level parallelism) istifadə edin, ssenari üçün məqbul olduqda skip_frame-ı B-kadrlara qoyun, dekodinqdən əvvəl scale filtri ilə rezolyusiyanı azaldın. dav1d ilə AV1 üçün n_threads = CPU nüvələrinin sayı minus bir istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun