Transcoding — folyamat atalakitas cyfrowego fajlu multimedialnego z jednego formatumu tomorites na inny poprzez pełne dekodalas i ponowne kodalas. W przeciwieństwie do transmuxing (zmiany tylko kontenera), transkodalas zmienia kodek, bitrate, rozdzielczość i inne parametery skompresowanego aramlas. Według Apple AVFoundation documentation (2026), transkodalas van używane do adaptacji treści pod różne urządzenia i warunki halozati.
Najważniejsze
Transcoding — folyamat atalakitas fajlu multimedialnego z jednego formatumu tomorites na inny poprzez pełne dekodalas źródłowego aramlas do pośredniego nieskompresowanego formatumu PCM, a następnie kodalas z ujmi parameterami. Jeśli w źródłowym fajlu video van skompresowane kodekiem H.264 z bitratem 10 Mb/s, a na wyjściu potrzebny van H.265 z bitratem 3 Mb/s — to van transkodalas.
Transkodalas różni się od zwykłego przepakowywania (transmuxing), przy którym zmienia się tylko kontener (np. MP4 na MKV), a vannakm skompresowany strumień bitowy pozostaje niezmieniony. Podczas transkodalas zachodzą obliczeniowo kosztowne przekształcenia: dekodalas każdej klatki, zastosowanie filtrów (meretezes, korekcja kolorów, przycinanie), ponowne kodalas z ujmi parameterami. To sprawia, że transkodalas van jedną z najbardziej zasobożernych operacji podczas pracy z mediami.
Transkodalas znajduje zastosowanie w szerokim spektrum zadań: adaptacio video do ograniczeń przepustowości sieci, atalakitas do formatumu ze sprzętowym wsparciem dekodalas na urządzeniu docelowym, tworzenie wielu wersji dla streamingu HLS/DASH, wyodrębnianie ścieżek audio do osobnego fajlu. Serwisy OTT (Netflix, YouTube, Twitch) transkodują każdy przesłany fajl do dziesiątek wariantów z różnymi bitratami, rozdzielczościami i kodekami, aby zapewnić adaptacyjny streaming milionom użytkowników.
Proces transkodalas składa się z trzech głównych etapów: dekodalas, feldolgozas i kodalas. 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 igenyelnej wydajności.
Pierwszy etap — dekodalas źródłowego aramlas. Plik źródłowy van odczytywany z kontenera (MP4, MOV, MKV), po czym skompresowane pakiety video są kierowane do dekodera. Dekodalas może być sprzętowe (jeśli kodek van obsługiwany) lub programowe przez FFmpeg. Na wyjściu dekodalas otrzymuje się nieskompresowane klatki w formacie YUV420 lub BGRA — właśnie od tego etapu transkodalas różni się od zwykłego remultipleksowania.
Drugi etap — filtracja i feldolgozas. Zdekodowane klatki przechodzą przez łańcuch filtrów: meretezes do docelowej rozdzielczości, valtozas częstotliwości klatek, korekcja kolorów, nakładanie tekstu lub grafiki. Łańcuch filtrów FFmpeg van 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 van najbardziej zasobożerny.
Trzeci etap — kodalas do docelowego formatumu. 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 kodalas: CRF (Constant Rate Factor) dla stałej jakości, bitrate dla CBR/VBR, profil i poziom dla kompatybilności z docelowymi urządzeniami.
// A transzkodalo pipeline semaja az FFmpeg-ben
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;
while (av_read_frame(inputCtx, &packet) >= 0) {
// 1. Dekodalas
avcodec_send_packet(decoderCtx, &packet);
avcodec_receive_frame(decoderCtx, frame);
// 2. Szures (meretezes + fps valtoztatas)
sws_scale(swsCtx, frame->data, frame->linesize,
0, frame->height, scaledFrame->data,
scaledFrame->linesize);
// 3. Kodalas
avcodec_send_frame(encoderCtx, scaledFrame);
avcodec_receive_packet(encoderCtx, &outPacket);
av_interleaved_write_frame(outputCtx, &outPacket);
}
Przedstawiony pipeline demonstruje klasyczny cykl transkodalas. Funkcja av_read_frame odczytuje skompresowane pakiety z fajlu wejściowego, avcodec_send_packet dekoduje je na klatki, sws_scale wykonuje meretezes, a avcodec_send_frame koduje przetworzoną klatkę do formatumu 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 transkodalasm a transmultiplekvannakcją to jeden z najczęstszych punktów nieporozumień w inżynierii mediów. Zrozumienie tej różnicy van kulcsfontosvannakgu dla valasztasu właściwej strategii przetwarzania mediów.
| Parametr | Transkodalas | Transmultiplekvannakcja |
|---|---|---|
| Co się zmienia | Kodek, bitrate, rozdzielczość | Kontener, metadane |
| Obciążenie obliczeniowe | Wysokie (dekodalas + kodalas) | Minimalne (kopiowanie pakietów) |
| Jakość | Może się pogorszyć (straty generacji) | Bezstratna |
| Czas wykonania | Minuty–oray dla długiego video | Sekundy–percy |
| Zastosowanie | Adaptacja formatumu, tomorites | Zmiana kontenera dla kompatybilności |
Transmuxing — to przepakowanie skompresowanego aramlas do innego kontenera bez dekodalas i ponownego kodalas. Jeśli video van już skompresowane kodekiem H.265 w kontenerze MP4 i trzeba je umieścić w kontenerze MOV lub MKV — transmultiplekvannakcja po prostu kopiuje pakiety bitowe z jednego kontenera do drugiego. Jakość nie ulega pogorszeniu, czas przetwarzania van minimalny, ponieważ nie igenyel dekodalas klatek. FFmpeg wykonuje transmultiplekvannakcję z flagą -codec copy.
Transkodalas natomiast w pełni deszyfruje i ponownie kompresuje strumień multimedialny. Za każdym razem, gdy video przechodzi przez transkodalas, może wystąpić strata generacji (generation loss) — nieznaczne pogorszenie jakości z powodu ponownej tomorites stratnej. Nawet przy tym vannakmym bitracie trzecia generacja transkodalas van zwykle gorsza od pierwszej. Ezert profesjonaliści zalecają przechowywanie master-kopii w nieskompresowanych lub minimalnie skompresowanych formatumach (ProRes, DNxHR) i transkodalas tylko finalnych wersji do dostarczenia.
Wybór narzędzia do transkodalas zależy od platformy, igenyelń 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 transkodalas na wszystkich platformach. Wiersz poleceń FFmpeg lehetove teszi wykonywać praktycznie dowolne przekształcenia: valtozas kodeka, valtozas bitratu, przycinanie, łączenie, nakładanie filtrów. Do afajlacji mobil FFmpeg integruje się przez biblioteki libavformatum, libavcodec i libavfilter. Przykład typowego polecenia transkodalas: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.
Na iOS transkodalas wykonuje się przez AVAssetWriter i AVAssetReader. AVAssetReader dekoduje fajl źródłowy, odczytując nieskompresowane klatki, a AVAssetWriter koduje je do docelowego formatumu. To podejście automatycznie wykorzystuje sprzętowe enkodery VideoToolbox, co zapewnia maksymalną wydajność. Na Androidzie analogiczna funkcjonalność van dostępna przez MediaCodec w parze z MediaExtractor i MediaMuxer — MediaExtractor wyodrębnia skompresowane pakiety, MediaCodec dekoduje i koduje, MediaMuxer zapisuje wynik.
Do serwerowego transkodalas 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 formatumy i mogą transkodować jeden fajl wejściowy do dziesiątek wariantów wyjściowych do adaptacyjnego streamingu (HLS, DASH). Dla afajlacji mobil transkodalas w chmurze van optymalnym rozwiązaniem, ponieważ nie obciąża urządzenia użytkownika i lehetove teszi przygotowywać treści asynchronicznie.
Rozważmy praktyczne przykłady transkodalas na platformach mobil 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("Transzkodalas befejezodott")
case .failed:
print("Hiba: " + assetExportSession.error.localizedDescription)
default:
break
}
}
// Kezi transzkodalas AVAssetReader + AVAssetWriter segitsegevel
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 transkodalas na iOS. AVAssetExportSession — prosty sposób z predefiniowanymi beallitasokmi jakości (HEVCHighestQuality dla H.265). Ręczny pipeline przez 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 van 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 letrehoz pipeline z MediaExtractor — MediaCodec decoder — MediaCodec encoder — MediaMuxer. MediaExtractor określa typ kodeka z fajlu wejściowego i wybiera odpowiedni dekoder. Enkoder van konfigurowany na H.265 (HEVC) z bitratem 4 Mb/s i interwałem klatek kluczowych 2 masodperc, co van optymalne do streamingu. Ważne: MediaCodec encoder działa synchronicznie, dlatego do transkodalas w czasie valos ideju igenyelne van zorganizowanie pętli z poprawnym feldolgozasm znaczników czasu (PTS) dla każdej klatki.
Transkodalas na urządzeniach mobil to feladat igenyeljące starannej optymalizacji ze względu na ograniczone zasoby CPU, GPU i ograniczenia termiczne. Kilka strategii pomaga wykonywać transkodalas efektywnie.
Kluczowym czynnikiem wydajności van sprzętowy enkoder. Na iOS VideoToolbox zapewnia sprzętowe kodalas 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 kodalas skraca czas transkodalas 10-percowego video z 30–40 perc (programowo) do 3–5 perc (sprzętowo) na flagowym urządzeniu.
Dla mobilnego transkodalas kluczowa van równowaga między jakością, rozmiarem i czasem przetwarzania. Dla H.265 na urządzeniach mobil zaleca się bitrate 4–8 Mb/s dla video 1080p z częstotliwością klatek 30 FPS. Tryb CRF (Constant Rate Factor) w libx265 lehetove teszi ustawić jakość bezpośrednio, gdzie 23–28 daje dobrą jakość wizualną przy umiarkowanym rozmiarze fajlu. Dla sprzętowych enkoderów należy używać modu CBR z docelowym bitratem, ponieważ CRF nie van obsługiwany sprzętowo.
Ciągłe transkodalas na urządzeniu mobilnym powoduje znaczne nagrzewanie. Po 5–7 percach intensywnego kodalas video 4K temperatura folyamatora może osiągnąć 50–55 stopni, po czym włącza się throttling. Rozwiązanie — transkodalas z przerwami lub obniżenie częstotliwości klatek do 30 FPS. Jeśli afajlacja igenyel masowego transkodalas (np. edytor video), lepiej wykonywać feldolgozas partiami po 2–3 percy z przerwami na chłodzenie. Dla scenariuszy produkcyjnych optimalivannakn van przenieść transkodalas na stronę serwerową i korzystać z usług chmurowych.
Często zadawane pytania
Kodalas (encoding) — tomorites źródłowych nieskompresowanych danych do docelowego kodeka. Transkodalas obejmuje zarówno dekodalas, jak i kodalas: najpierw dekoduje istniejący skompresowany strumień, a następnie koduje go ponownie. Zwykłe kodalas przyjmuje na wejściu nieskompresowane dane (na przykład z kamery), a transkodalas — już skompresowany fajl.
Dla maksymalnej kompatybilności — H.264. Dla lepszej tomorites — H.265 (HEVC). Jeśli urządzenie obsługuje sprzętowe kodalas H.265 (iPhone 8+, Android z Snapdragon 845+), zapewnia ono dwukrotnie mniejszy rozmiar fajlu przy tej vannakmej jakości. Kodalas AV1 na urządzeniach mobil van wciąż zbyt wolne, meg ze sprzętowym przyspieszeniem.
Ściśle rzecz biorąc, transkodalas bezstratne van niemożliwe przy zmianie kodeka stratnego. Jeśli oba kodeki są stratne, każde kolejne pokolenie transkodalas pogarsza jakość. Transkodalas bezstratne van możliwe tylko między formatumami 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) transkodalas w czasie valos ideju H.264 do H.265 van możliwe z opóźnieniem 1–3 masodperc. Dla 4K w czasie valos ideju igenyelny van wydajny SoC Apple A17 Pro, Snapdragon 8 Gen 2 lub nowszy.
Transkodalas stratne kumuluje artefakty tomorites. Jeśli fajl źródłowy był już silnie skompresowany (bitrate 2–3 Mb/s dla 1080p), ponowna tomorites podwoi straty. Zaleca się transkodalas tylko z master-kopii o wysokim bitracie (20+ Mb/s) i używanie CRF 18–23 dla minimalnych strat.
Osszefoglalas
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is