Transcoding — rəqəmsal media faylının bir sıxılma formatından digərinə tam dekodlaşdırma və yenidən kodlaşdırma ilə çevrilməsi prosesidir. Transmulyasiyadan (yalnız konteynerin dəyişdirilməsi) fərqli olaraq, transkodlaşdırma kodek, bitrate, rezolyusiya və sıxılmış axının digər parametrlərini dəyişir. Apple AVFoundation documentation (2026)-ya görə, transkodlaşdırma məzmunun müxtəlif cihazlar və şəbəkə şərtlərinə uyğunlaşdırılması üçün istifadə olunur.
Əsas məqamlar
Transcoding — media faylının bir sıxılma formatından digərinə mənbə axınının aralıq sıxılmamış PCM formatına tam dekodlaşdırılması və sonra yeni parametrlərlə kodlaşdırılması prosesidir. Əgər mənbə faylda video H.264 kodeki ilə 10 Mb/s bitrate-də sıxılıbsa və çıxışda H.265 3 Mb/s bitrate ilə tələb olunursa — bu transkodlaşdırmadır.
Transkodlaşdırma yalnız konteynerin dəyişdirildiyi (məsələn, MP4-dən MKV-yə) adyenidən qablaşdırmadan (transmuxing) fərqlənir, burada sıxılmış bit axını dəyişməz qalır. Transkodlaşdırma zamanı hesablama baxımından bahalı çevrilmələr baş verir: hər kadrın dekodlaşdırılması, filtrlərin tətbiqi (miqyaslama, rəng korreksiyası, kəsmə), yeni parametrlərlə yenidən kodlaşdırma. Bu, transkodlaşdırmanı media ilə iş zamanı ən resurs tutumlu əməliyyatlardan birinə çevirir.
Transkodlaşdırma geniş spektrli tapşırıqlarda tətbiq olunur: videonun şəbəkə bant genişliyi məhdudiyyətlərinə uyğunlaşdırılması, hədəf cihazda dekodlaşdırmanın aparat dəstəyi olan formata çevrilməsi, HLS/DASH striminqi üçün çoxsaylı versiyaların yaradılması, audio treklərin ayrıca fayla çıxarılması. OTT xidmətləri (Netflix, YouTube, Twitch) hər yüklənmiş faylı milyonlarla istifadəçiyə adaptiv striminq təmin etmək üçün müxtəlif bitrate-lər, rezolyusiyalar və kodeklərlə onlarla varianta transkodlaşdırır.
Transkodlaşdırma prosesi üç əsas mərhələdən ibarətdir: dekodlaşdırma, emal və kodlaşdırma. Hər mərhələ mövcudluq və tələb olunan performansdan asılı olaraq həm CPU-da, həm də GPU/aparat bloklarında yerinə yetirilə bilər.
Birinci mərhələ — mənbə axınının dekodlaşdırılması. Mənbə fayl konteynerdən (MP4, MOV, MKV) oxunur, sonra sıxılmış video paketlər dekoderə göndərilir. Dekodlaşdırma aparat (əgər kodek dəstəklənirsə) və ya FFmpeg vasitəsilə proqram təminatı ola bilər. Dekodlaşdırmanın çıxışında YUV420 və ya BGRA formatında sıxılmamış kadrlar alınır — məhz bu mərhələdən transkodlaşdırma adi remultipleksasiyadan fərqlənir.
İkinci mərhələ — filtrləmə və emal. Dekodlaşdırılmış kadrlar filtr zəncirindən keçir: hədəf rezolyusiyaya miqyaslama, kadr tezliyinin dəyişdirilməsi, rəng korreksiyası, mətn və ya qrafikanın əlavə edilməsi. FFmpeg filtr zənciri qraf kimi qurulur, burada hər filtr ayrıca emal moduludur. Məsələn, scale=1280:720 filtri rezolyusiyanı dəyişir, fps=30 kadr tezliyini dəyişir, yadif isə deinterleystinq həyata keçirir. Bütün əməliyyatlar sıxılmamış kadrlar üzərində aparılır, buna görə də ikinci mərhələ ən resurs tutumludur.
Üçüncü mərhələ — hədəf formata kodlaşdırma. Emal edilmiş kadrlar enkoderin girişinə verilir, o da onları hədəf kodekin alqoritmi ilə sıxır. Enkoder aparat (iOS-da VideoToolbox, Android-də MediaCodec) və ya proqram (libx264, libx265) ola bilər. Kodlaşdırma parametrləri: sabit keyfiyyət üçün CRF (Constant Rate Factor), CBR/VBR üçün bitrate, hədəf cihazlarla uyğunluq üçün profil və səviyyə.
// FFmpeg-də transkodlaşdırma pipeline sxemi
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;
while (av_read_frame(inputCtx, &packet) >= 0) {
// 1. Dekodlaşdır
avcodec_send_packet(decoderCtx, &packet);
avcodec_receive_frame(decoderCtx, frame);
// 2. Filtr (miqyaslama + fps dəyişməsi)
sws_scale(swsCtx, frame->data, frame->linesize,
0, frame->height, scaledFrame->data,
scaledFrame->linesize);
// 3. Kodlaşdır
avcodec_send_frame(encoderCtx, scaledFrame);
avcodec_receive_packet(encoderCtx, &outPacket);
av_interleaved_write_frame(outputCtx, &outPacket);
}
Təqdim olunan pipeline klassik transkodlaşdırma dövrünü nümayiş etdirir. av_read_frame funksiyası giriş faylından sıxılmış paketləri oxuyur, avcodec_send_packet onları kadrlara dekodlaşdırır, sws_scale miqyaslamanı yerinə yetirir və avcodec_send_frame emal edilmiş kadrı çıxış formatına kodlaşdırır. Bu üç mərhələli dövr hər kadr və ya kadr qrupu (GOP) üçün enkoder parametrlərindən asılı olaraq təkrarlanır.
Transkodlaşdırma və transmulyasiya arasındakı fərq media mühəndisliyində ən çox qarışıqlıq yaradan məqamlardan biridir. Bu fərqi başa düşmək media emalı üçün düzgün strategiya seçmək üçün kritik əhəmiyyət daşıyır.
| Parametr | Transkodlaşdırma | Transmulyasiya |
|---|---|---|
| Nə dəyişir | Kodek, bitrate, rezolyusiya | Konteyner, metadata |
| Hesablama yükü | Yüksək (dekodlaşdırma + kodlaşdırma) | Minimal (paketlərin kopyalanması) |
| Keyfiyyət | Pisləşə bilər (generasiya itkisi) | İtki olmadan |
| İcra müddəti | Uzun video üçün dəqiqələr–saatlar | Saniyələr–dəqiqələr |
| Tətbiq | Format uyğunlaşdırılması, sıxılma | Uyğunluq üçün konteyner dəyişikliyi |
Transmuxing — sıxılmış axının dekodlaşdırma və yenidən kodlaşdırma olmadan başqa konteynerə yenidən qablaşdırılmasıdır. Əgər video artıq MP4 konteynerində H.265 kodeki ilə sıxılıbsa və onu MOV və ya MKV konteynerinə yerləşdirmək lazımdırsa — transmulyasiya sadəcə bit paketlərini bir konteynerdən digərinə kopyalayır. Keyfiyyət pisləşmir, emal müddəti minimaldır, çünki kadrların dekodlaşdırılması tələb olunmur. FFmpeg transmulyasiyanı -codec copy flagı ilə yerinə yetirir.
Transkodlaşdırma isə media axınını tamamilə deşifrə edir və yenidən sıxır. Video hər dəfə transkodlaşdırmadan keçdikdə generasiya itkisi (generation loss) baş verə bilər — itkili sıxılma səbəbindən keyfiyyətin cüzi pisləşməsi. Hətta eyni bitrate-də üçüncü nəsil transkodlaşdırma adətən birincidən daha pisdir. Buna görə də peşəkarlar master-surətləri sıxılmamış və ya minimal sıxılmış formatlarda (ProRes, DNxHR) saxlamağı və yalnız çatdırılma üçün final versiyalarını transkodlaşdırmağı tövsiyə edirlər.
Transkodlaşdırma alətinin seçimi platformadan, performans tələblərindən və istifadə ssenarisindən asılıdır. Mobil inkişaf üçün həm yerli API-lər, həm də platformalararası kitabxanalar mövcuddur.
FFmpeg — bütün platformalarda transkodlaşdırma üçün de-fakto standartdır. FFmpeg komanda sətri demək olar ki, istənilən çevrilməni yerinə yetirməyə imkan verir: kodek dəyişikliyi, bitrate dəyişikliyi, kəsmə, birləşdirmə, filtrlərin tətbiqi. Mobil tətbiqlər üçün FFmpeg libavformat, libavcodec və libavfilter kitabxanaları vasitəsilə inteqrasiya olunur. Tipik transkodlaşdırma əmr nümunəsi: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.
iOS-da transkodlaşdırma AVAssetWriter və AVAssetReader vasitəsilə həyata keçirilir. AVAssetReader mənbə faylı dekodlaşdırır, sıxılmamış kadrları oxuyur, AVAssetWriter isə onları hədəf formata kodlaşdırır. Bu yanaşma avtomatik olaraq VideoToolbox aparat enkoderlərindən istifadə edir və maksimum performans təmin edir. Android-də analoji funksionallıq MediaExtractor və MediaMuxer ilə birlikdə MediaCodec vasitəsilə mövcuddur — MediaExtractor sıxılmış paketləri çıxarır, MediaCodec dekodlaşdırır və kodlaşdırır, MediaMuxer nəticəni yazır.
İstehsal mühitində server transkodlaşdırması üçün bulud xidmətlərindən istifadə olunur: AWS Elemental MediaConvert, Azure Media Services, Google Transcoder API. Bu xidmətlər yük altında avtomatik miqyaslanır, bütün populyar formatları dəstəkləyir və bir giriş faylını adaptiv striminq (HLS, DASH) üçün onlarla çıxış variantına transkodlaşdıra bilər. Mobil tətbiqlər üçün bulud transkodlaşdırması optimal həll yoludur, çünki istifadəçi cihazını yükləmir və məzmunu asinxron hazırlamağa imkan verir.
Mobil platformalarda aparat sürətləndirilməsi və əsas keyfiyyət parametrlərinin konfiqurasiyası ilə transkodlaşdırmanın praktik nümunələrini nəzərdən keçirək.
import AVFoundation
func transcodeVideo(sourceURL: URL, destURL: URL) {
let asset = AVAsset(url: sourceURL)
let preset = AVAssetExportPresetHEVCHighestQuality
AVAssetExportSession(asset: asset, presetName: preset)?
.exportAsynchronously {
switch assetExportSession?.status {
case .completed:
print("Transkodlaşdırma tamamlandı")
case .failed:
print("Xəta: " + assetExportSession.error.localizedDescription)
default:
break
}
}
// AVAssetReader + AVAssetWriter ilə əl ilə transkodlaşdırma
let reader = try AVAssetReader(asset: asset)
let writer = try AVAssetWriter(url: destURL,
fileType: .mp4)
let outputSettings: [String: Any] = [
AVVideoCodecKey: AVVideoCodecType.hevc,
AVVideoWidthKey: 1920,
AVVideoHeightKey: 1080,
AVVideoCompressionPropertiesKey: [
AVVideoAverageBitRateKey: 4_000_000,
AVVideoProfileLevelKey: AVVideoProfileLevelH265Main10
]
]
let adaptor = AVAssetWriterInput(
mediaType: .video,
outputSettings: outputSettings
)
writer.add(adaptor)
}
Nümunədə iOS-da transkodlaşdırmaya iki yanaşma göstərilib. AVAssetExportSession — keyfiyyət parametrləri (H.265 üçün HEVCHighestQuality) ilə sadə üsul. AVAssetReader + AVAssetWriter vasitəsilə əl ilə pipeline parametrlər üzərində tam nəzarət verir: bitrate, profil, səviyyə. AVVideoProfileLevelH265Main10 parametri 10 bit rəng dərinliyi ilə HDR Main10 profilini aktivləşdirir ki, bu da müasir HDR məzmunu üçün vacibdir.
class Transcoder(private val context: Context) {
fun transcodeToHevc(inputUri: Uri, outputFile: File) {
val extractor = MediaExtractor()
extractor.setDataSource(context, inputUri, null)
val trackFormat = extractor.getTrackFormat(videoTrackIndex)
val mime = trackFormat.getString(MediaFormat.KEY_MIME)
val decoder = MediaCodec.createDecoderByType(mime!!)
val encoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_HEVC)
val outputFormat = MediaFormat.createVideoFormat(
MediaFormat.MIMETYPE_VIDEO_HEVC, 1920, 1080
).apply {
setInteger(MediaFormat.KEY_BIT_RATE, 4_000_000)
setInteger(MediaFormat.KEY_FRAME_RATE, 30)
setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 2)
}
encoder.configure(outputFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)
encoder.start()
}
}
Android kodu MediaExtractor — MediaCodec decoder — MediaCodec encoder — MediaMuxer pipeline yaradır. MediaExtractor giriş faylından kodek tipini müəyyən edir və müvafiq dekoderi seçir. Enkoder 4 Mb/s bitrate və 2 saniyə əsas kadr intervalı ilə H.265 (HEVC) üçün konfiqurasiya olunur ki, bu da striminq üçün optimaldır. Vacib: MediaCodec encoder sinxron işləyir, buna görə də realtime transkodlaşdırma üçün hər kadrın vaxt nişanlarının (PTS) düzgün emalı ilə dövr təşkil etmək tələb olunur.
Mobil cihazlarda transkodlaşdırma məhdud CPU, GPU resursları və istilik məhdudiyyətləri səbəbindən diqqətli optimallaşdırma tələb edən tapşırıqdır. Bir neçə strategiya transkodlaşdırmanı səmərəli şəkildə yerinə yetirməyə kömək edir.
Performansın əsas amili — aparat enkoderidir. iOS-da VideoToolbox H.264 və H.265-in aparat kodlaşdırmasını proqram libx264-dən 5–10 dəfə sürətli təmin edir. Android-də MediaCodec mövcud olduqda aparat OMX komponentlərindən istifadə edir. Apartment kodlaşdırmanın aktivləşdirilməsi flaqman cihazda 10 dəqiqəlik videonun transkodlaşdırma müddətini 30–40 dəqiqədən (proqram) 3–5 dəqiqəyə (aparat) qısaldır.
Mobil transkodlaşdırma üçün keyfiyyət, ölçü və emal müddəti arasında balans kritik əhəmiyyət daşıyır. Mobil cihazlarda H.265 üçün 30 FPS kadr tezliyi ilə 1080p video üçün 4–8 Mb/s bitrate tövsiyə olunur. CRF rejimi (Constant Rate Factor) libx265-də birbaşa keyfiyyəti təyin etməyə imkan verir, burada 23–28 orta fayl ölçüsündə yaxşı vizual keyfiyyət verir. Apartment enkoderlər üçün hədəf bitrate ilə CBR rejimindən istifadə edin, çünki CRF apartament dəstəklənmir.
Mobil cihazda fasiləsiz transkodlaşdırma əhəmiyyətli qızmağa səbəb olur. 4K videonun intensiv kodlaşdırılmasının 5–7 dəqiqəsindən sonra prosessorun temperaturu 50–55 dərəcəyə çata bilər, bundan sonra trottling işə düşür. Həll yolu — fasilələrlə transkodlaşdırma və ya kadr tezliyinin 30 FPS-ə endirilməsi. Əgər tətbiq kütləvi transkodlaşdırma tələb edirsə (məsələn, video redaktoru), emalı soyutma intervalları ilə 2–3 dəqiqəlik partiyalarla yerinə yetirmək daha yaxşıdır. İstehsal ssenariləri üçün transkodlaşdırmanı server tərəfinə keçirmək və bulud xidmətlərindən istifadə etmək optimaldır.
Tez-tez verilən suallar
Kodlaşdırma (encoding) — mənbə sıxılmamış məlumatların hədəf kodekə sıxılmasıdır. Transkodlaşdırma həm dekodlaşdırma, həm də kodlaşdırmanı əhatə edir: əvvəlcə mövcud sıxılmış axını dekodlaşdırır, sonra yenidən kodlaşdırır. Sadə kodlaşdırma giriş kimi sıxılmamış məlumatları (məsələn, kameradan) qəbul edir, transkodlaşdırma isə artıq sıxılmış faylı qəbul edir.
Maksimum uyğunluq üçün — H.264. Daha yaxşı sıxılma üçün — H.265 (HEVC). Əgər cihaz H.265-in aparat kodlaşdırmasını dəstəkləyirsə (iPhone 8+, Snapdragon 845+ ilə Android), eyni keyfiyyətdə iki dəfə kiçik fayl ölçüsü təmin edir. AV1 kodlaşdırması mobil cihazlarda hələ də çox yavaşdır, hətta aparat sürətləndirilməsi ilə belə.
Düzünü desək, itkili kodek dəyişdirilərkən itkisiz transkodlaşdırma mümkün deyil. Əgər hər iki kodek itkilidirsə, transkodlaşdırmanın hər nəsli keyfiyyəti pisləşdirir. İtkisiz transkodlaşdırma yalnız itkisiz formatlar (FFV1, H.264 Lossless) arasında və ya konteyneri yenidən kodlaşdırmadan dəyişdirərkən (transmuxing) mümkündür.
Bəli, əgər aparat dekoderi və enkoderi istifadə olunursa və hədəf rezolyusiya 1080p-dən çox deyilsə. VideoToolbox (iOS) və ya MediaCodec (Android) olan cihazlarda H.264-dən H.265-ə realtime transkodlaşdırma 1–3 saniyə gecikmə ilə mümkündür. 4K realtime üçün güclü SoC Apple A17 Pro, Snapdragon 8 Gen 2 və ya daha yenisi tələb olunur.
İtkili transkodlaşdırma sıxılma artefaktlarını toplayır. Əgər mənbə fayl artıq güclü sıxılmışdısa (1080p üçün 2–3 Mb/s), yenidən sıxılma itkiləri ikiqat artıracaq. Tövsiyə olunur yalnız yüksək bitrate-li (20+ Mb/s) master-surətlərdən transkodlaşdırmaq və minimal itkilər üçün CRF 18–23 istifadə etmək.
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