Transcoding — proses konversi cyfrowego fileu multimedialnego z jednego formatu kompresi na inny pomelalui pełne decoding i ponowne encoding. W przeciwieństwie do transmuxing (zmiany tylko kontenera), transcoding zmienia codec, bitrate, rozdzielczość i inne parametery skompresowanego stream. Według Apple AVFoundation documentation (2026), transcoding adalah używane do adaptacji treści pod różne urządzenia i warunki jaringan.
Najważniejsze
Transcoding — proses konversi fileu multimedialnego z jednego formatu kompresi na inny pomelalui pełne decoding źródłowego stream do pośredniego nieskompresowanego formatu PCM, a następnie encoding z barumi parameterami. Jeśli w źródłowym fileu video adalah skompresowane codeciem H.264 z bitratem 10 Mb/s, a na wyjściu potrzebny adalah H.265 z bitratem 3 Mb/s — to adalah transcoding.
Transcoding różni się od zwykłego przepakowywania (transmuxing), przy którym zmienia się tylko kontener (mis. MP4 na MKV), a adalahm skompresowany strumień bitowy pozostaje niezmieniony. Podczas transcodingia zachodzą obliczeniowo kosztowne przekształcenia: decoding każdej klatki, zastosowanie filtrów (scaling, korekcja kolorów, przycinanie), ponowne encoding z barumi parameterami. To sprawia, że transcoding adalah jedną z najbardziej zasobożernych operacji podczas pracy z mediami.
Transcoding znajduje zastosowanie w szerokim spektrum zadań: adaptasi video do ograniczeń przepustowości ci, konversi do formatu ze sprzętowym dukunganm decoding na urządzeniu docelowym, pembuatan wielu wersji untuk streamingu HLS/DASH, wyodrębnianie ścieżek audio do osobnego fileu. Serwisy OTT (Netflix, YouTube, Twitch) transkodują każdy przesłany file do dziesiątek wariantów z różnymi bitratami, rozdzielczościami i codecami, aby zapewnić adaptacyjny streaming milionom użytkowników.
Proces transcodingia składa się z trzech głównych etapów: decoding, pemroseadalahn i encoding. 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 diperlukanj wydajności.
Pierwszy etap — decoding źródłowego stream. Plik źródłowy adalah odczytywany z kontenera (MP4, MOV, MKV), po czym skompresowane pakiety video są kierowane do dekodera. Decoding może być sprzętowe (jeśli codec adalah obsługiwany) lub programowe melalui FFmpeg. Na wyjściu decoding otrzymuje się nieskompresowane klatki w formacie YUV420 lub BGRA — właśnie od tego etapu transcoding różni się od zwykłego remultipleksowania.
Drugi etap — filtracja i pemroseadalahn. Zdekodowane klatki przechodzą melalui łańcuch filtrów: scaling do docelowej rozdzielczości, perubahan częstotliwości klatek, korekcja kolorów, nakładanie tekstu lub grafiki. Łańcuch filtrów FFmpeg adalah 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 framech, untuktego drugi etap adalah najbardziej zasobożerny.
Trzeci etap — encoding do docelowego formatu. Przetworzone klatki są podawane na wejście enkodera, który kompresuje je zgodnie z algoritmaem docelowego codeca. Enkoder może być sprzętowy (VideoToolbox na iOS, MediaCodec na Android) lub programowy (libx264, libx265). Parametry kodowania: CRF (Constant Rate Factor) untuk stałej jakości, bitrate untuk CBR/VBR, profil i poziom untuk kompatybilności z docelowymi urządzeniami.
// Skema pipeline transcoding di FFmpeg
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;
while (av_read_frame(inputCtx, &packet) >= 0) {
// 1. Decode
avcodec_send_packet(decoderCtx, &packet);
avcodec_receive_frame(decoderCtx, frame);
// 2. Filter (skala + ubah fps)
sws_scale(swsCtx, frame->data, frame->linesize,
0, frame->height, scaledFrame->data,
scaledFrame->linesize);
// 3. Encode
avcodec_send_frame(encoderCtx, scaledFrame);
avcodec_receive_packet(encoderCtx, &outPacket);
av_interleaved_write_frame(outputCtx, &outPacket);
}
Przedstawiony pipeline demonstruje klasyczny cykl transcodingia. Funkcja av_read_frame odczytuje skompresowane pakiety z fileu wejściowego, avcodec_send_packet dekoduje je na klatki, sws_scale wykonuje scaling, a avcodec_send_frame koduje przetworzoną klatkę do formatu wyjściowego. Taki trzyetapowy cykl powtarza się untuk każdej klatki lub grupy klatek (GOP), w zależności od ustawień enkodera.
Różnica między transcodingm a transmuxingą to jeden z najczęstszych punktów nieporozumień w inżynierii mediów. Zrozumienie tej różnicy adalah penting untuk pilihanu właściwej strategii przetwarzania mediów.
| Parametr | Transcoding | Transmultiplekadalahcja |
|---|---|---|
| Co się zmienia | Kodek, bitrate, rozdzielczość | Kontener, metadane |
| Obciążenie obliczeniowe | Wysokie (decoding + encoding) | Minimalne (kopiowanie pakietów) |
| Jakość | Może się pogorszyć (straty generacji) | Bezstratna |
| Czas wykonania | Minuty–jamy untuk długiego video | Sekundy–menity |
| Zastosowanie | Adaptacja formatu, kompresi | Zmiana kontenera untuk kompatybilności |
Transmuxing — to przepakowanie skompresowanego stream do innego kontenera bez decoding i ponownego kodowania. Jeśli video adalah już skompresowane codeciem H.265 w kontenerze MP4 i trzeba je umieścić w kontenerze MOV lub MKV — transmuxinga po prostu kopiuje pakiety bitowe z jednego kontenera do drugiego. Jakość nie ulega pogorszeniu, czas przetwarzania adalah minimalny, ponieważ nie memerlukan decoding klatek. FFmpeg wykonuje transmuxingę z flagą -codec copy.
Transcoding natomiast w pełni deszyfruje i ponownie kompresuje strumień multimedialny. Za każdym razem, gdy video przechodzi melalui transcoding, może wystąpić strata generacji (generation loss) — nieznaczne pogorszenie jakości z powodu ponownej kompresi stratnej. Nawet przy tym adalahmym bitracie trzecia generacja transcodingia adalah zwykle gorsza od pierwszej. Karena itu profesjonaliści zalecają przechowywanie master-kopii w nieskompresowanych lub minimalnie skompresowanych formatach (ProRes, DNxHR) i transcoding tylko finalnych wersji do dostarczenia.
Wybór narzędzia do transcodingia zależy od platformy, memerlukanń wydajnościowych i scenariusza użycia. Do programowania mobile dostępne są zarówno natywne API, jak i biblioteki wieloplatformowe.
FFmpeg — standard de facto untuk transcodingia na wszystkich platformach. Wiersz poleceń FFmpeg memungkinkan wykonywać praktycznie dowolne przekształcenia: perubahan codeca, perubahan bitratu, przycinanie, łączenie, nakładanie filtrów. Do afileacji mobile FFmpeg integruje się melalui biblioteki libavformat, libavcodec i libavfilter. Przykład typowego polecenia transcodingia: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.
Na iOS transcoding wykonuje się melalui AVAssetWriter i AVAssetReader. AVAssetReader dekoduje file źródłowy, odczytując nieskompresowane klatki, a AVAssetWriter koduje je do docelowego formatu. To podejście automatycznie wykorzystuje sprzętowe enkodery VideoToolbox, co menyediakan maksymalną wydajność. Na Androidzie analogiczna funkcjonalność adalah dostępna melalui MediaCodec w parze z MediaExtractor i MediaMuxer — MediaExtractor wyodrębnia skompresowane pakiety, MediaCodec dekoduje i koduje, MediaMuxer zapisuje wynik.
Do serwerowego transcodingia 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 file wejściowy do dziesiątek wariantów wyjściowych do adaptacyjnego streamingu (HLS, DASH). Dla afileacji mobile transcoding w chmurze adalah optymalnym rozwiązaniem, ponieważ nie obciąża urządzenia użytkownika i memungkinkan przygotowywać treści asynchronicznie.
Rozważmy praktyczne przykłady transcodingia na platformach mobile z penggunaanm sprzętowego przyspieszenia i konfiguracją kuncich parameteró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("Transcoding selesai")
case .failed:
print("Kesalahan: " + assetExportSession.error.localizedDescription)
default:
break
}
}
// Transcoding manual dengan 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 transcodingia na iOS. AVAssetExportSession — sederhana sposób z predefiniowanymi pengaturanmi jakości (HEVCHighestQuality untuk H.265). Ręczny pipeline melalui AVAssetReader + AVAssetWriter daje pełną kontrolę nad parameterami: bitrate, profil, poziom. Parametr AVVideoProfileLevelH265Main10 włącza profil HDR Main10 z głębią kolorów 10 bitów, co adalah ważne untuk modernch 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 membuat pipeline z MediaExtractor — MediaCodec decoder — MediaCodec encoder — MediaMuxer. MediaExtractor określa typ codeca z fileu wejściowego i wybiera odpowiedni dekoder. Enkoder adalah konfigurowany na H.265 (HEVC) z bitratem 4 Mb/s i interwałem klatek kuncich 2 detik, co adalah optymalne do streamingu. Ważne: MediaCodec encoder działa synchronicznie, untuktego do transcodingia w waktu real-time diperlukan adalah zorganizowanie pętli z poprawnym pemroseadalahnm znaczników czasu (PTS) untuk każdej klatki.
Transcoding na urządzeniach mobile to tugas memerlukanjące starannej optymalizacji ze względu na ograniczone zasoby CPU, GPU i keterbataadalahn termiczne. Kilka strategii pomaga wykonywać transcoding efektywnie.
Kluczowym czynnikiem wydajności adalah sprzętowy enkoder. Na iOS VideoToolbox menyediakan sprzętowe encoding 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 transcodingia 10-menitowego video z 30–40 menit (programowo) do 3–5 menit (sprzętowo) na flagowym urządzeniu.
Dla mobile transcodingia kluczowa adalah równowaga między jakością, rozmiarem i czasem przetwarzania. Dla H.265 na urządzeniach mobile zaleca się bitrate 4–8 Mb/s untuk video 1080p z częstotliwością klatek 30 FPS. Tryb CRF (Constant Rate Factor) w libx265 memungkinkan ustawić jakość bezpośrednio, gdzie 23–28 daje dobrą jakość wizualną przy umiarkowanym rozmiarze fileu. Dla sprzętowych enkoderów należy używać modeu CBR z docelowym bitratem, ponieważ CRF nie adalah obsługiwany sprzętowo.
Ciągłe transcoding na urządzeniu mobile powoduje znaczne nagrzewanie. Po 5–7 menitach intensywnego kodowania video 4K temperatura prosesora może osiągnąć 50–55 stopni, po czym włącza się throttling. Rozwiązanie — transcoding z jedami lub obniżenie częstotliwości klatek do 30 FPS. Jeśli afileacja memerlukan masowego transcodingia (mis. editor video), lepiej wykonywać pemroseadalahn partiami po 2–3 menity z jedami na chłodzenie. Dla scenariuszy produkcyjnych secara optimal adalah przenieść transcoding na stronę serwerową i korzystać z usług chmurowych.
Często zadawane pytania
Encoding (encoding) — kompresi źródłowych nieskompresowanych danych do docelowego codeca. Transcoding obejmuje zarówno decoding, jak i encoding: najpierw dekoduje istniejący skompresowany strumień, a następnie koduje go ponownie. Zwykłe encoding przyjmuje na wejściu nieskompresowane dane (na przykład z kamery), a transcoding — już skompresowany file.
Dla maksymalnej kompatybilności — H.264. Dla lepszej kompresi — H.265 (HEVC). Jeśli urządzenie obsługuje sprzętowe encoding H.265 (iPhone 8+, Android z Snapdragon 845+), menyediakan ono dwukrotnie kurangszy rozmiar fileu przy tej adalahmej jakości. Encoding AV1 na urządzeniach mobile adalah wciąż zbyt wolne, bahkan ze sprzętowym przyspieszeniem.
Ściśle rzecz biorąc, transcoding bezstratne adalah niemożliwe przy zmianie codeca stratnego. Jeśli oba codeci są stratne, każde kolejne pokolenie transcodingia pogarsza jakość. Transcoding bezstratne adalah 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) transcoding w waktu real-time H.264 do H.265 adalah możliwe z opóźnieniem 1–3 detik. Dla 4K w waktu real-time memerlukanny adalah wydajny SoC Apple A17 Pro, Snapdragon 8 Gen 2 lub nowszy.
Transcoding stratne kumuluje artefakty kompresi. Jeśli file źródłowy był już silnie skompresowany (bitrate 2–3 Mb/s untuk 1080p), ponowna kompresi podwoi straty. Zaleca się transcoding tylko z master-kopii o wysokim bitracie (20+ Mb/s) i używanie CRF 18–23 untuk minimalnych strat.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga