Proqram dekodinqi: bu nədir, iş prinsipi və tətbiq ssenariləri

Müəllif: IT Sectr Dərc olunub: 2026-05-25 Oxuma vaxtı: 9 dəq

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 — FFmpeg və libavcodec kimi kitabxanalar vasitəsilə CPU-da medianın dekompressiyası
  • Uyğunluq — proqram dekoderləri aparat blokları üçün əlçatmaz olan yüzlərlə formatı dəstəkləyir
  • Enerji sərfiyyatı aparatdan 5–10 dəfə yüksəkdir, bu da avtonom iş müddətini azaldır
  • Dav1d — 50% sürət artımı təmin edən optimallaşdırılmış AV1 proqram dekoderi
  • Tətbiq — nadir formatlar, fərdi pipeline-lar, aparat dəstəyi olmadıqda fallback

Proqram dekodlaşdırması nədir?

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 necə işləyir?

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.

Proqram dekoderinin arxitekturası

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.

Mobil CPU-larda dekodlaşdırmanın xüsusiyyətləri

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 / libavcodec

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 — optimallaşdırılmış AV1 dekoderi

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.

DekoderFormatlarPlatformalarLisenziya
libavcodec200+ kodekHamısıLGPL/GPL
dav1dAV1HamısıBSD 2-Clause
libaomAV1HamısıBSD 2-Clause
MediaFoundationH.264, H.265WindowsMüəllif hüququ

Proqram və aparat dekodinqinin müqayisəsi

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.

ParametrSoftware DecodingHardware Decoding
Dəstəklənən formatlar200+ kodek4–6 kodek
Enerji sərfiyyatı1,5–5 Vt0,2–0,8 Vt
FərdiləşdirməPipeline üzərində tam nəzarətYalnız API vasitəsilə
Gecikmə30–80 ms5–15 ms
İstilik buraxmaYü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.

Proqram dekodinqinin kod nümunələri

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.

FFmpeg ilə C dilində proqram dekodinqi

cpp
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.

mobile-ffmpeg ilə Kotlin dilində proqram dekodinqi

kotlin
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.

dav1d ilə AV1 proqram dekodinqi

c
#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.

Proqram dekodinqinin tətbiq ssenariləri

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.

Nadir və köhnəlmiş formatlar

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.

Fərdi post-emal

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.

Aparat dəstəyi olmadıqda fallback

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

Nə üçün proqram dekodinqi daha çox enerji sərf edir?

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.

Hansı proqram dekoderi ən sürətlidir?

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.

iOS və Android-də FFmpeg istifadə etmək olarmı?

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.

CPU-da real vaxtda H.264 dekodinqi nədir?

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.

Proqram dekodinqində CPU yükünü necə azaltmaq olar?

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ə

  • Software decoding — universal kitabxanalar (FFmpeg, dav1d, libavcodec) vasitəsilə CPU-da dekompressiya
  • FFmpeg 200-dən çox kodeki dəstəkləyir, istənilən formatlarla maksimum uyğunluğu təmin edir
  • Dav1d — ARM NEON və Intel AVX optimallaşdırmaları ilə ən sürətli proqram AV1 dekoderi
  • Enerji sərfiyyatı aparatdan 5–10 dəfə yüksəkdir: 1,5–5 Vt qarşı 0,2–0,8 Vt
  • Proqram dekodinqi fərdi post-emal və filtrasiya üçün pipeline üzərində tam nəzarəti təmin edir
  • Əsas ssenarilər — nadir formatlar, peşəkar kodeklər, aparat dəstəyi olmadıqda fallback
  • Hibrid strategiyadan istifadə edin: standart olaraq aparat dekodinqi, dəstəklənməyən kodeklər üçün proqram fallback

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.

Layihəni müzakirə et

Həm də oxuyun