Transcoding — protses konvertirane cyfrowego failu multimedialnego z jednego formatu kompresiya na inny poprzez pełne dekodirane i ponowne kodirane. W przeciwieństwie do transmuxing (zmiany tylko kontenera), transkodirane zmienia kodek, bitrate, rozdzielczość i inne parametary skompresowanego potok. Według Apple AVFoundation documentation (2026), transkodirane e używane do adaptacji treści pod różne urządzenia i warunki sieciowe.
Najważniejsze
Transcoding — protses konvertirane failu multimedialnego z jednego formatu kompresiya na inny poprzez pełne dekodirane źródłowego potok do pośredniego nieskompresowanego formatu PCM, a następnie kodirane z novmi parametarami. Jeśli w źródłowym failu video e skompresowane kodekiem H.264 z bitratem 10 Mb/s, a na wyjściu potrzebny e H.265 z bitratem 3 Mb/s — to e transkodirane.
Transkodirane różni się od zwykłego przepakowywania (transmuxing), przy którym zmienia się tylko kontener (np. MP4 na MKV), a sam skompresowany strumień bitowy pozostaje niezmieniony. Podczas transkodowania zachodzą obliczeniowo kosztowne przekształcenia: dekodirane każdej klatki, zastosowanie filtrów (skalirane, korekcja kolorów, przycinanie), ponowne kodirane z novmi parametarami. To sprawia, że transkodirane e jedną z najbardziej zasobożernych operacji podczas pracy z mediami.
Transkodirane znajduje zastosowanie w szerokim spektrum zadań: adaptacja video do ograniczeń przepustowości sieci, konvertirane do formatu ze sprzętowym wsparciem dekodowania na urządzeniu docelowym, tworzenie wielu wersji dla streamingu HLS/DASH, wyodrębnianie ścieżek audio do osobnego failu. Serwisy OTT (Netflix, YouTube, Twitch) transkodują każdy przesłany fail do dziesiątek wariantów z różnymi bitratami, rozdzielczościami i kodekami, aby zapewnić adaptacyjny streaming milionom użytkowników.
Proces transkodowania składa się z trzech głównych etapów: dekodirane, przetwarzanie i kodirane. Każdy etap może być wykonany zarówno na CPU, jak i na GPU/sprzętowych blokach, w zależności od dostępności i iziskvanej wydajności.
Pierwszy etap — dekodirane źródłowego potok. Plik źródłowy e odczytywany z kontenera (MP4, MOV, MKV), po czym skompresowane pakiety video są kierowane do dekodera. Dekodirane może być sprzętowe (jeśli kodek e obsługiwany) lub programowe przez FFmpeg. Na wyjściu dekodowania otrzymuje się nieskompresowane klatki w formacie YUV420 lub BGRA — właśnie od tego etapu transkodirane różni się od zwykłego remultipleksowania.
Drugi etap — filtracja i przetwarzanie. Zdekodowane klatki przechodzą przez łańcuch filtrów: skalirane do docelowej rozdzielczości, zmiana częstotliwości klatek, korekcja kolorów, nakładanie tekstu lub grafiki. Łańcuch filtrów FFmpeg e budowany jako graf, gdzie każdy filtr to osobny moduł przetwarzania. Na przykład filtr scale=1280:720 zmienia rozdzielczość, fps=30 zmienia częstotliwość klatek, a yadif wykonuje deinterlacing. Wszystkie operacje są wykonywane na nieskompresowanych klatkach, dlatego drugi etap e najbardziej zasobożerny.
Trzeci etap — kodirane do docelowego formatu. Przetworzone klatki są podawane na wejście enkodera, który kompresuje je zgodnie z algorytmem docelowego kodeka. Enkoder może być sprzętowy (VideoToolbox na iOS, MediaCodec na Android) lub programowy (libx264, libx265). Parametry kodowania: CRF (Constant Rate Factor) dla stałej jakości, bitrate dla CBR/VBR, profil i poziom dla kompatybilności z docelowymi urządzeniami.
// Shema na pipeline za transkodirane v FFmpeg
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;
while (av_read_frame(inputCtx, &packet) >= 0) {
// 1. Dekodirane
avcodec_send_packet(decoderCtx, &packet);
avcodec_receive_frame(decoderCtx, frame);
// 2. Filtirane (skalirane + promyana na fps)
sws_scale(swsCtx, frame->data, frame->linesize,
0, frame->height, scaledFrame->data,
scaledFrame->linesize);
// 3. Kodirane
avcodec_send_frame(encoderCtx, scaledFrame);
avcodec_receive_packet(encoderCtx, &outPacket);
av_interleaved_write_frame(outputCtx, &outPacket);
}
Przedstawiony pipeline demonstruje klasyczny cykl transkodowania. Funkcja av_read_frame odczytuje skompresowane pakiety z failu wejściowego, avcodec_send_packet dekoduje je na klatki, sws_scale wykonuje skalirane, a avcodec_send_frame koduje przetworzoną klatkę do formatu wyjściowego. Taki trzyetapowy cykl powtarza się dla każdej klatki lub grupy klatek (GOP), w zależności od ustawień enkodera.
Różnica między transkodiranem a transmultipleksacją to jeden z najczęstszych punktów nieporozumień w inżynierii mediów. Zrozumienie tej różnicy e kluczowe dla wyboru właściwej strategii przetwarzania mediów.
| Parametr | Transkodirane | Transmultipleksacja |
|---|---|---|
| Co się zmienia | Kodek, bitrate, rozdzielczość | Kontener, metadane |
| Obciążenie obliczeniowe | Wysokie (dekodirane + kodirane) | Minimalne (kopiowanie pakietów) |
| Jakość | Może się pogorszyć (straty generacji) | Bezstratna |
| Czas wykonania | Minuty–godziny dla długiego video | Sekundy–minutiy |
| Zastosowanie | Adaptacja formatu, kompresiya | Zmiana kontenera dla kompatybilności |
Transmuxing — to przepakowanie skompresowanego potok do innego kontenera bez dekodowania i ponownego kodowania. Jeśli video e już skompresowane kodekiem H.265 w kontenerze MP4 i trzeba je umieścić w kontenerze MOV lub MKV — transmultipleksacja po prostu kopiuje pakiety bitowe z jednego kontenera do drugiego. Jakość nie ulega pogorszeniu, czas przetwarzania e minimalny, ponieważ nie iziskva dekodowania klatek. FFmpeg wykonuje transmultipleksację z flagą -codec copy.
Transkodirane natomiast w pełni deszyfruje i ponownie kompresuje strumień multimedialny. Za każdym razem, gdy video przechodzi przez transkodirane, może wystąpić strata generacji (generation loss) — nieznaczne pogorszenie jakości z powodu ponownej kompresiya stratnej. Nawet przy tym samym bitracie trzecia generacja transkodowania e zwykle gorsza od pierwszej. Dlatego profesjonaliści zalecają przechowywanie master-kopii w nieskompresowanych lub minimalnie skompresowanych formatach (ProRes, DNxHR) i transkodirane tylko finalnych wersji do dostarczenia.
Wybór narzędzia do transkodowania zależy od platformy, iziskvań wydajnościowych i scenariusza użycia. Do programowania mobilnego dostępne są zarówno natywne API, jak i biblioteki wieloplatformowe.
FFmpeg — standard de facto dla transkodowania na wszystkich platformach. Wiersz poleceń FFmpeg pozvolqva wykonywać praktycznie dowolne przekształcenia: zmiana kodeka, zmiana bitratu, przycinanie, łączenie, nakładanie filtrów. Do afailacji mobilni FFmpeg integruje się przez biblioteki libavformat, libavcodec i libavfilter. Przykład typowego polecenia transkodowania: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.
Na iOS transkodirane wykonuje się przez AVAssetWriter i AVAssetReader. AVAssetReader dekoduje fail źródłowy, odczytując nieskompresowane klatki, a AVAssetWriter koduje je do docelowego formatu. To podejście automatycznie wykorzystuje sprzętowe enkodery VideoToolbox, co zapewnia maksymalną wydajność. Na Androidzie analogiczna funkcjonalność e dostępna przez MediaCodec w parze z MediaExtractor i MediaMuxer — MediaExtractor wyodrębnia skompresowane pakiety, MediaCodec dekoduje i koduje, MediaMuxer zapisuje wynik.
Do serwerowego transkodowania w środowisku produkcyjnym używa się usług chmurowych: AWS Elemental MediaConvert, Azure Media Services, Google Transcoder API. Te usługi automatycznie skalują się pod obciążeniem, obsługują wszystkie popularne formaty i mogą transkodować jeden fail wejściowy do dziesiątek wariantów wyjściowych do adaptacyjnego streamingu (HLS, DASH). Dla afailacji mobilni transkodirane w chmurze e optymalnym rozwiązaniem, ponieważ nie obciąża urządzenia użytkownika i pozvolqva przygotowywać treści asynchronicznie.
Rozważmy praktyczne przykłady transkodowania na platformach mobilni z wykorzystaniem sprzętowego przyspieszenia i konfiguracją kluczowych parametarów jakości.
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("Transkodiraneto zavarsheno")
case .failed:
print("Greshka: " + assetExportSession.error.localizedDescription)
default:
break
}
}
// Rachno transkodirane s AVAssetReader + AVAssetWriter
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)
}
W przykładzie zastosowano dwa podejścia do transkodowania na iOS. AVAssetExportSession — prosty sposób z predefiniowanymi ustawieniami jakości (HEVCHighestQuality dla H.265). Ręczny pipeline przez AVAssetReader + AVAssetWriter daje pełną kontrolę nad parametarami: bitrate, profil, poziom. Parametr AVVideoProfileLevelH265Main10 włącza profil HDR Main10 z głębią kolorów 10 bitów, co e ważne dla nowoczesnych treści HDR.
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()
}
}
Kod na Androida sazdava pipeline z MediaExtractor — MediaCodec decoder — MediaCodec encoder — MediaMuxer. MediaExtractor określa typ kodeka z failu wejściowego i wybiera odpowiedni dekoder. Enkoder e konfigurowany na H.265 (HEVC) z bitratem 4 Mb/s i interwałem klatek kluczowych 2 sekundi, co e optymalne do streamingu. Ważne: MediaCodec encoder działa synchronicznie, dlatego do transkodowania w czasie rzeczywistym iziskvane e zorganizowanie pętli z poprawnym przetwarzaniem znaczników czasu (PTS) dla każdej klatki.
Transkodirane na urządzeniach mobilni to zadanie iziskvające starannej optymalizacji ze względu na ograniczone zasoby CPU, GPU i ograniczenia termiczne. Kilka strategii pomaga wykonywać transkodirane efektywnie.
Kluczowym czynnikiem wydajności e sprzętowy enkoder. Na iOS VideoToolbox zapewnia sprzętowe kodirane H.264 i H.265 z prędkością 5–10 razy większą niż programowy libx264. Na Androidzie MediaCodec używa sprzętowych komponentów OMX, jeśli są dostępne. Włączenie sprzętowego kodowania skraca czas transkodowania 10-minutiowego video z 30–40 minuti (programowo) do 3–5 minuti (sprzętowo) na flagowym urządzeniu.
Dla mobilnego transkodowania kluczowa e równowaga między jakością, rozmiarem i czasem przetwarzania. Dla H.265 na urządzeniach mobilni zaleca się bitrate 4–8 Mb/s dla video 1080p z częstotliwością klatek 30 FPS. Tryb CRF (Constant Rate Factor) w libx265 pozvolqva ustawić jakość bezpośrednio, gdzie 23–28 daje dobrą jakość wizualną przy umiarkowanym rozmiarze failu. Dla sprzętowych enkoderów należy używać rezhimu CBR z docelowym bitratem, ponieważ CRF nie e obsługiwany sprzętowo.
Ciągłe transkodirane na urządzeniu mobilnym powoduje znaczne nagrzewanie. Po 5–7 minutiach intensywnego kodowania video 4K temperatura protsesora może osiągnąć 50–55 stopni, po czym włącza się throttling. Rozwiązanie — transkodirane z przerwami lub obniżenie częstotliwości klatek do 30 FPS. Jeśli afailacja iziskva masowego transkodowania (np. edytor video), lepiej wykonywać przetwarzanie partiami po 2–3 minutiy z przerwami na chłodzenie. Dla scenariuszy produkcyjnych optymalnie e przenieść transkodirane na stronę serwerową i korzystać z usług chmurowych.
Często zadawane pytania
Kodirane (encoding) — kompresiya źródłowych nieskompresowanych danych do docelowego kodeka. Transkodirane obejmuje zarówno dekodirane, jak i kodirane: najpierw dekoduje istniejący skompresowany strumień, a następnie koduje go ponownie. Zwykłe kodirane przyjmuje na wejściu nieskompresowane dane (na przykład z kamery), a transkodirane — już skompresowany fail.
Dla maksymalnej kompatybilności — H.264. Dla lepszej kompresiya — H.265 (HEVC). Jeśli urządzenie obsługuje sprzętowe kodirane H.265 (iPhone 8+, Android z Snapdragon 845+), zapewnia ono dwukrotnie mniejszy rozmiar failu przy tej samej jakości. Kodirane AV1 na urządzeniach mobilni e wciąż zbyt wolne, nawet ze sprzętowym przyspieszeniem.
Ściśle rzecz biorąc, transkodirane bezstratne e niemożliwe przy zmianie kodeka stratnego. Jeśli oba kodeki są stratne, każde kolejne pokolenie transkodowania pogarsza jakość. Transkodirane bezstratne e możliwe tylko między formatami bezstratnymi (FFV1, H.264 Lossless) lub przy zmianie kontenera bez przekodowywania (transmuxing).
Tak, jeśli używane są sprzętowe dekoder i enkoder, a docelowa rozdzielczość nie przekracza 1080p. Na urządzeniach z VideoToolbox (iOS) lub MediaCodec (Android) transkodirane w czasie rzeczywistym H.264 do H.265 e możliwe z opóźnieniem 1–3 sekundi. Dla 4K w czasie rzeczywistym iziskvany e wydajny SoC Apple A17 Pro, Snapdragon 8 Gen 2 lub nowszy.
Transkodirane stratne kumuluje artefakty kompresiya. Jeśli fail źródłowy był już silnie skompresowany (bitrate 2–3 Mb/s dla 1080p), ponowna kompresiya podwoi straty. Zaleca się transkodirane tylko z master-kopii o wysokim bitracie (20+ Mb/s) i używanie CRF 18–23 dla minimalnych strat.
Zaklyuchenie
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също