Transcoding — proseso conversion cyfrowego fileu multimedialnego z jednego formatu compression na inny poay pamamagitan ng 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 ay używane do adaptacji treści pod różne urządzenia i warunki network.
Najważniejsze
Transcoding — proseso conversion fileu multimedialnego z jednego formatu compression na inny poay pamamagitan ng pełne decoding źródłowego stream do pośredniego nieskompresowanego formatu PCM, a następnie encoding z bagomi parameterami. Jeśli w źródłowym fileu video ay skompresowane codeciem H.264 z bitratem 10 Mb/s, a na wyjściu potrzebny ay H.265 z bitratem 3 Mb/s — to ay transcoding.
Transcoding różni się od zwykłego przepakowywania (transmuxing), przy którym zmienia się tylko kontener (np. MP4 na MKV), a aym skompresowany strumień bitowy pozostaje niezmieniony. Podczas transkodowania zachodzą obliczeniowo kosztowne przekształcenia: decoding każdej klatki, zastosowanie filtrów (scaling, korekcja kolorów, przycinanie), ponowne encoding z bagomi parameterami. To sprawia, że transcoding ay jedną z najbardziej zasobożernych operacji podczas pracy z mediami.
Transcoding znajduje zastosowanie w szerokim spektrum zadań: adaptacja video do ograniczeń przepustowości ci, conversion do formatu ze sprzętowym wsparciem dekodowania na urządzeniu docelowym, tworzenie wielu wersji para ay 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 transkodowania składa się z trzech głównych etapów: decoding, przetwarzanie 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 nangangailangannej wydajności.
Pierwszy etap — decoding źródłowego stream. Plik źródłowy ay odczytywany z kontenera (MP4, MOV, MKV), po czym skompresowane pakiety video są kierowane do dekodera. Decoding może być sprzętowe (jeśli codec ay obsługiwany) lub programowe ay pamamagitan ng FFmpeg. Na wyjściu dekodowania 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 przetwarzanie. Zdekodowane klatki przechodzą ay pamamagitan ng łańcuch filtrów: scaling do docelowej rozdzielczości, pagbabago częstotliwości klatek, korekcja kolorów, nakładanie tekstu lub grafiki. Łańcuch filtrów FFmpeg ay 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, para aytego drugi etap ay najbardziej zasobożerny.
Trzeci etap — encoding do docelowego formatu. Przetworzone klatki są podawane na wejście enkodera, który kompresuje je zgodnie z algorithmem docelowego codeca. Enkoder może być sprzętowy (VideoToolbox na iOS, MediaCodec na Android) lub programowy (libx264, libx265). Parametry kodowania: CRF (Constant Rate Factor) para ay stałej jakości, bitrate para ay CBR/VBR, profile i poziom para ay kompatybilności z docelowymi urządzeniami.
// Skema ng pipeline ng transcoding sa FFmpeg
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;
while (av_read_frame(inputCtx, &packet) >= 0) {
// 1. I-decode
avcodec_send_packet(decoderCtx, &packet);
avcodec_receive_frame(decoderCtx, frame);
// 2. I-filter (scale + fps change)
sws_scale(swsCtx, frame->data, frame->linesize,
0, frame->height, scaledFrame->data,
scaledFrame->linesize);
// 3. I-encode
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 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ę para ay każdej klatki lub grupy klatek (GOP), w zależności od ustawień enkodera.
Różnica między transcodingm a transmultiplekaycją to jeden z najczęstszych punktów nieporozumień w inżynierii mediów. Zrozumienie tej różnicy ay mahalaga para ay pagpiliu właściwej strategii przetwarzania mediów.
| Parametr | Transcoding | Transmultiplekaycja |
|---|---|---|
| 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–orasy para ay długiego video | Sekundy–minutoy |
| Zastosowanie | Adaptacja formatu, compressiona | Zmiana kontenera para ay kompatybilności |
Transmuxing — to przepakowanie skompresowanego stream do innego kontenera bez dekodowania i ponownego kodowania. Jeśli video ay już skompresowane codeciem H.265 w kontenerze MP4 i trzeba je umieścić w kontenerze MOV lub MKV — transmultiplekaycja po prostu kopiuje pakiety bitowe z jednego kontenera do drugiego. Jakość nie ulega pogorszeniu, czas przetwarzania ay minimalny, ponieważ nie nangangailangan dekodowania klatek. FFmpeg wykonuje transmultiplekaycję z flagą -codec copy.
Transcoding natomiast w pełni deszyfruje i ponownie kompresuje strumień multimedialny. Za każdym razem, gdy video przechodzi ay pamamagitan ng transcoding, może wystąpić strata generacji (generation loss) — nieznaczne pogorszenie jakości z powodu ponownej compression stratnej. Nawet przy tym aymym bitracie trzecia generacja transkodowania ay zwykle gorsza od pierwszej. Kaya 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 transkodowania zależy od platformy, nangangailanganń wydajnościowych i scenariusza użycia. Do programowania mobilnego dostępne są zarówno natywne API, jak i biblioteki wieloplatformowe.
FFmpeg — standard de facto para ay transkodowania na wszystkich platformach. Wiersz poleceń FFmpeg nagbibigay-daan wykonywać praktycznie dowolne przekształcenia: pagbabago codeca, pagbabago bitratu, przycinanie, łączenie, nakładanie filtrów. Do afileacji mobile FFmpeg integruje się ay pamamagitan ng 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 transcoding wykonuje się ay pamamagitan ng 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 zapewnia maksymalną wydajność. Na Androidzie analogiczna funkcjonalność ay dostępna ay pamamagitan ng 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 file wejściowy do dziesiątek wariantów wyjściowych do adaptacyjnego streamingu (HLS, DASH). Dla afileacji mobile transcoding w chmurze ay optymalnym rozwiązaniem, ponieważ nie obciąża urządzenia użytkownika i nagbibigay-daan przygotowywać treści asynchronicznie.
Rozważmy praktyczne przykłady transkodowania na platformach mobile z wykorzystaniem sprzętowego przyspieszenia i konfiguracją kluczowych 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("Tapos na ang transcoding")
case .failed:
print("Error: " + assetExportSession.error.localizedDescription)
default:
break
}
}
// Manual na transcoding gamit ang 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 — simple sposób z predefiniowanymi settingsmi jakości (HEVCHighestQuality para ay H.265). Ręczny pipeline ay pamamagitan ng AVAssetReader + AVAssetWriter daje pełną kontrolę nad parameterami: bitrate, profile, poziom. Parametr AVVideoProfileLevelH265Main10 włącza profile HDR Main10 z głębią kolorów 10 bitów, co ay ważne para ay 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 lumilikha pipeline z MediaExtractor — MediaCodec decoder — MediaCodec encoder — MediaMuxer. MediaExtractor określa typ codeca z fileu wejściowego i wybiera odpowiedni dekoder. Enkoder ay konfigurowany na H.265 (HEVC) z bitratem 4 Mb/s i interwałem klatek kluczowych 2 segundo, co ay optymalne do streamingu. Ważne: MediaCodec encoder działa synchronicznie, para aytego do transkodowania ay oras real-time nangangailanganne ay zorganizowanie pętli z poprawnym przetwarzaniem znaczników czasu (PTS) para ay każdej klatki.
Transcoding na urządzeniach mobile to gawain nangangailanganjące starannej optymalizacji ze względu na ograniczone zasoby CPU, GPU i ograniczenia termiczne. Kilka strategii pomaga wykonywać transcoding efektywnie.
Kluczowym czynnikiem wydajności ay sprzętowy enkoder. Na iOS VideoToolbox zapewnia 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 transkodowania 10-minutoowego video z 30–40 minuto (programowo) do 3–5 minuto (sprzętowo) na flagowym urządzeniu.
Dla mobilnego transkodowania kluczowa ay równowaga między jakością, rozmiarem i czasem przetwarzania. Dla H.265 na urządzeniach mobile zaleca się bitrate 4–8 Mb/s para ay video 1080p z częstotliwością klatek 30 FPS. Tryb CRF (Constant Rate Factor) w libx265 nagbibigay-daan 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 ay obsługiwany sprzętowo.
Ciągłe transcoding na urządzeniu mobilnym powoduje znaczne nagrzewanie. Po 5–7 minutoach intensywnego kodowania video 4K temperatura prosesoora może osiągnąć 50–55 stopni, po czym włącza się throttling. Rozwiązanie — transcoding z przerwami lub obniżenie częstotliwości klatek do 30 FPS. Jeśli afileacja nangangailangan masowego transkodowania (np. edytor video), lepiej wykonywać przetwarzanie partiami po 2–3 minutoy z przerwami na chłodzenie. Dla scenariuszy produkcyjnych optimal ay przenieść transcoding na stronę serwerową i korzystać z usług chmurowych.
Często zadawane pytania
Encoding (encoding) — compressiona ź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 compression — H.265 (HEVC). Jeśli urządzenie obsługuje sprzętowe encoding H.265 (iPhone 8+, Android z Snapdragon 845+), zapewnia ono dwukrotnie mniejszy rozmiar fileu przy tej aymej jakości. Encoding AV1 na urządzeniach mobile ay wciąż zbyt wolne, kahit ze sprzętowym przyspieszeniem.
Ściśle rzecz biorąc, transcoding bezstratne ay niemożliwe przy zmianie codeca stratnego. Jeśli oba codeci są stratne, każde kolejne pokolenie transkodowania pogarsza jakość. Transcoding bezstratne ay 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 ay oras real-time H.264 do H.265 ay możliwe z opóźnieniem 1–3 segundo. Dla 4K ay oras real-time nangangailanganny ay wydajny SoC Apple A17 Pro, Snapdragon 8 Gen 2 lub nowszy.
Transcoding stratne kumuluje artefakty compression. Jeśli file źródłowy był już silnie skompresowany (bitrate 2–3 Mb/s para ay 1080p), ponowna compressiona podwoi straty. Zaleca się transcoding tylko z master-kopii o wysokim bitracie (20+ Mb/s) i używanie CRF 18–23 para ay minimalnych strat.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din