Transcoding — η διαδικασία μετατροπής ενός ψηφιακού αρχείου πολυμέσων από μια μορφή συμπίεσης σε άλλη με πλήρη αποκωδικοποίηση και επανακωδικοποίηση. Σε αντίθεση με τη διαμόρφωση μεταφοράς (αλλαγή μόνο του δοχείου), το transcoding αλλάζει τον codec, το bitrate, την ανάλυση και άλλες παραμέτρους της συμπιεσμένης ροής. Σύμφωνα με την τεκμηρίωση Apple AVFoundation (2026), το transcoding χρησιμοποιείται για την προσαρμογή περιεχομένου σε διάφορες συσκευές και συνθήκες δικτύου.
Κύρια σημεία
Transcoding — η διαδικασία μετατροπής ενός αρχείου πολυμέσων από μια μορφή συμπίεσης σε άλλη μέσω πλήρους αποκωδικοποίησης της αρχικής ροής σε ενδιάμεση ασυμπίεστη μορφή PCM και επακόλουθης κωδικοποίησης με νέες παραμέτρους. Εάν στο αρχικό αρχείο το βίντεο είναι συμπιεσμένο με τον codec H.264 με bitrate 10 Mbit/s και στην έξοδο χρειάζεται H.265 με bitrate 3 Mbit/s — αυτό είναι transcoding.
Το transcoding διαφέρει από την απλή επανασυσκευασία (transmuxing), κατά την οποία αλλάζει μόνο το δοχείο (π.χ. MP4 σε MKV), ενώ η ίδια η συμπιεσμένη ροή bit παραμένει αμετάβλητη. Κατά το transcoding πραγματοποιούνται υπολογιστικά δαπανηρές μετατροπές: αποκωδικοποίηση κάθε καρέ, εφαρμογή φίλτρων (αλλαγή κλίμακας, διόρθωση χρώματος, περικοπή), επανακωδικοποίηση με νέες παραμέτρους. Αυτό καθιστά το transcoding μία από τις πιο απαιτητικές σε πόρους λειτουργίες κατά την εργασία με πολυμέσα.
Το transcoding εφαρμόζεται σε ένα ευρύ φάσμα εργασιών: προσαρμογή βίντεο σε περιορισμούς εύρους ζώνης δικτύου, μετατροπή σε μορφή με υποστήριξη αποκωδικοποίησης υλικού στην τελική συσκευή, δημιουργία πολλαπλών εκδόσεων για ροή HLS/DASH, εξαγωγή ηχητικών κομματιών σε ξεχωριστό αρχείο. Οι υπηρεσίες OTT (Netflix, YouTube, Twitch) μετατρέπουν κάθε μεταφορτωμένο αρχείο σε δεκάδες παραλλαγές με διαφορετικά bitrate, αναλύσεις και codecs για την παροχή προσαρμοστικής ροής σε εκατομμύρια χρήστες.
Η διαδικασία του transcoding αποτελείται από τρία κύρια στάδια: αποκωδικοποίηση, επεξεργασία και κωδικοποίηση. Κάθε στάδιο μπορεί να εκτελεστεί είτε σε CPU είτε σε GPU/μονάδες υλικού ανάλογα με τη διαθεσιμότητα και την απαιτούμενη απόδοση.
Το πρώτο στάδιο — η αποκωδικοποίηση της αρχικής ροής. Το αρχικό αρχείο διαβάζεται από το δοχείο (MP4, MOV, MKV), μετά τα συμπιεσμένα πακέτα βίντεο κατευθύνονται στον αποκωδικοποιητή. Η αποκωδικοποίηση μπορεί να είναι υλικού (αν υποστηρίζεται ο codec) ή λογισμικού μέσω FFmpeg. Στην έξοδο της αποκωδικοποίησης προκύπτουν ασυμπίεστα καρέ σε μορφή YUV420 ή BGRA — από αυτό το στάδιο το transcoding διαφέρει από την απλή πολυπλεξία.
Το δεύτερο στάδιο — φιλτράρισμα και επεξεργασία. Τα αποκωδικοποιημένα καρέ περνούν μέσα από μια αλυσίδα φίλτρων: αλλαγή κλίμακας στην επιθυμητή ανάλυση, αλλαγή ρυθμού καρέ, διόρθωση χρώματος, επικάλυψη κειμένου ή γραφικών. Η αλυσίδα φίλτρων του FFmpeg δομείται ως γράφος, όπου κάθε φίλτρο είναι μια ξεχωριστή μονάδα επεξεργασίας. Για παράδειγμα, το φίλτρο scale=1280:720 αλλάζει την ανάλυση, το fps=30 αλλάζει τον ρυθμό καρέ, και το yadif εκτελεί αποδιαπλοκή. Όλες οι λειτουργίες εκτελούνται σε ασυμπίεστα καρέ, επομένως το δεύτερο στάδιο είναι το πιο απαιτητικό σε πόρους.
Το τρίτο στάδιο — κωδικοποίηση στην επιθυμητή μορφή. Τα επεξεργασμένα καρέ τροφοδοτούνται στον κωδικοποιητή, ο οποίος τα συμπιέζει σύμφωνα με τον αλγόριθμο του codec-στόχου. Ο κωδικοποιητής μπορεί να είναι υλικού (VideoToolbox σε iOS, MediaCodec σε Android) ή λογισμικού (libx264, libx265). Παράμετροι κωδικοποίησης: CRF (Constant Rate Factor) για σταθερή ποιότητα, bitrate για CBR/VBR, προφίλ και επίπεδο για συμβατότητα με συσκευές-στόχους.
// Διάγραμμα pipeline transcoding σε FFmpeg
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;
while (av_read_frame(inputCtx, &packet) >= 0) {
// 1. Αποκωδικοποίηση
avcodec_send_packet(decoderCtx, &packet);
avcodec_receive_frame(decoderCtx, frame);
// 2. Φιλτράρισμα (αλλαγή κλίμακας + fps)
sws_scale(swsCtx, frame->data, frame->linesize,
0, frame->height, scaledFrame->data,
scaledFrame->linesize);
// 3. Κωδικοποίηση
avcodec_send_frame(encoderCtx, scaledFrame);
avcodec_receive_packet(encoderCtx, &outPacket);
av_interleaved_write_frame(outputCtx, &outPacket);
}
Το παραπάνω pipeline παρουσιάζει τον κλασικό κύκλο transcoding. Η συνάρτηση av_read_frame διαβάζει συμπιεσμένα πακέτα από το αρχείο εισόδου, η avcodec_send_packet τα αποκωδικοποιεί σε καρέ, η sws_scale εκτελεί αλλαγή κλίμακας και η avcodec_send_frame κωδικοποιεί το επεξεργασμένο καρέ στην επιθυμητή μορφή. Αυτός ο τριών σταδίων κύκλος επαναλαμβάνεται για κάθε καρέ ή ομάδα καρέ (GOP), ανάλογα με τις ρυθμίσεις του κωδικοποιητή.
Η διαφορά μεταξύ transcoding και διαμόρφωσης μεταφοράς είναι ένα από τα πιο συχνά σημεία σύγχυσης στη μηχανική πολυμέσων. Η κατανόηση αυτής της διαφοράς είναι κρίσιμη για την επιλογή της σωστής στρατηγικής επεξεργασίας πολυμέσων.
| Παράμετρος | Transcoding | Διαμόρφωση μεταφοράς |
|---|---|---|
| Τι αλλάζει | Codec, bitrate, ανάλυση | Δοχείο, μεταδεδομένα |
| Υπολογιστικό φορτίο | Υψηλό (αποκωδικοποίηση + κωδικοποίηση) | Ελάχιστο (αντιγραφή πακέτων) |
| Ποιότητα | Μπορεί να υποβαθμιστεί (απώλειες γενιάς) | Χωρίς απώλειες |
| Χρόνος εκτέλεσης | Λεπτά–ώρες για μεγάλο βίντεο | Δευτερόλεπτα–λεπτά |
| Εφαρμογή | Προσαρμογή μορφής, συμπίεση | Αλλαγή δοχείου για συμβατότητα |
Διαμόρφωση μεταφοράς — είναι η επανασυσκευασία μιας συμπιεσμένης ροής σε άλλο δοχείο χωρίς αποκωδικοποίηση και επανακωδικοποίηση. Εάν το βίντεο έχει ήδη συμπιεστεί με τον codec H.265 σε δοχείο MP4 και πρέπει να τοποθετηθεί σε δοχείο MOV ή MKV — η διαμόρφωση μεταφοράς απλώς αντιγράφει τα πακέτα bit από το ένα δοχείο στο άλλο. Η ποιότητα δεν επηρεάζεται, ο χρόνος επεξεργασίας είναι ελάχιστος, καθώς δεν απαιτείται αποκωδικοποίηση καρέ. Το FFmpeg εκτελεί διαμόρφωση μεταφοράς με τη σημαία -codec copy.
Το transcoding αντίθετα αποκωδικοποιεί και επανασυμπιέζει πλήρως τη ροή πολυμέσων. Κάθε φορά που το βίντεο περνά από transcoding, μπορεί να προκύψει απώλεια γενιάς (generation loss) — μια μικρή υποβάθμιση της ποιότητας λόγω επαναλαμβανόμενης συμπίεσης με απώλειες. Ακόμα και με το ίδιο bitrate, η τρίτη γενιά transcoding είναι συνήθως χειρότερη από την πρώτη. Γι' αυτό οι επαγγελματίες συνιστούν τη διατήρηση των πρωτοτύπων σε ασυμπίεστες ή ελάχιστα συμπιεσμένες μορφές (ProRes, DNxHR) και το transcoding μόνο των τελικών εκδόσεων για διανομή.
Η επιλογή εργαλείου transcoding εξαρτάται από την πλατφόρμα, τις απαιτήσεις απόδοσης και το σενάριο χρήσης. Για ανάπτυξη εφαρμογών για κινητά, διατίθενται τόσο εγγενή API όσο και διαπλατφορμικές βιβλιοθήκες.
FFmpeg — το de facto πρότυπο για transcoding σε όλες τις πλατφόρμες. Η γραμμή εντολών του FFmpeg επιτρέπει σχεδόν οποιεσδήποτε μετατροπές: αλλαγή codec, αλλαγή bitrate, περικοπή, συγχώνευση, επικάλυψη φίλτρων. Για εφαρμογές για κινητά, το FFmpeg ενσωματώνεται μέσω των βιβλιοθηκών libavformat, libavcodec και libavfilter. Παράδειγμα τυπικής εντολής transcoding: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.
Σε iOS, το transcoding εκτελείται μέσω AVAssetWriter και AVAssetReader. Ο AVAssetReader αποκωδικοποιεί το αρχικό αρχείο, διαβάζοντας ασυμπίεστα καρέ, ενώ ο AVAssetWriter τα κωδικοποιεί στην επιθυμητή μορφή. Αυτή η προσέγγιση χρησιμοποιεί αυτόματα τους κωδικοποιητές υλικού VideoToolbox, εξασφαλίζοντας μέγιστη απόδοση. Σε Android, ανάλογη λειτουργικότητα είναι διαθέσιμη μέσω MediaCodec σε συνδυασμό με MediaExtractor και MediaMuxer — ο MediaExtractor εξάγει συμπιεσμένα πακέτα, ο MediaCodec αποκωδικοποιεί και κωδικοποιεί, ο MediaMuxer καταγράφει το αποτέλεσμα.
Για server-side transcoding σε περιβάλλον παραγωγής χρησιμοποιούνται υπηρεσίες cloud: AWS Elemental MediaConvert, Azure Media Services, Google Transcoder API. Αυτές οι υπηρεσίες κλιμακώνονται αυτόματα με το φορτίο, υποστηρίζουν όλες τις δημοφιλείς μορφές και μπορούν να μετατρέψουν ένα αρχείο εισόδου σε δεκάδες εκδόσεις εξόδου για προσαρμοστική ροή (HLS, DASH). Για εφαρμογές για κινητά, το cloud transcoding είναι η βέλτιστη λύση, καθώς δεν επιβαρύνει τη συσκευή του χρήστη και επιτρέπει την ασύγχρονη προετοιμασία περιεχομένου.
Ας εξετάσουμε πρακτικά παραδείγματα transcoding σε κινητές πλατφόρμες με χρήση επιτάχυνσης υλικού και ρύθμιση βασικών παραμέτρων ποιότητας.
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 ολοκληρώθηκε")
case .failed:
print("Σφάλμα: " + assetExportSession.error.localizedDescription)
default:
break
}
}
// Μη αυτόματο transcoding με 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)
}
Στο παράδειγμα χρησιμοποιούνται δύο προσεγγίσεις για transcoding σε iOS. Το AVAssetExportSession είναι ένας απλός τρόπος με προεπιλογές ποιότητας (HEVCHighestQuality για H.265). Το μη αυτόματο pipeline μέσω AVAssetReader + AVAssetWriter παρέχει πλήρη έλεγχο των παραμέτρων: bitrate, προφίλ, επίπεδο. Η παράμετρος AVVideoProfileLevelH265Main10 ενεργοποιεί το προφίλ HDR Main10 με βάθος χρώματος 10 bit, που είναι σημαντικό για σύγχρονο περιεχόμενο 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()
}
}
Ο κώδικας σε Android δημιουργεί ένα pipeline από MediaExtractor — MediaCodec decoder — MediaCodec encoder — MediaMuxer. Ο MediaExtractor προσδιορίζει τον τύπο codec από το αρχείο εισόδου και επιλέγει τον αντίστοιχο αποκωδικοποιητή. Ο κωδικοποιητής ρυθμίζεται σε H.265 (HEVC) με bitrate 4 Mbit/s και διάστημα βασικών καρέ 2 δευτερόλεπτα, το οποίο είναι βέλτιστο για ροή. Σημαντικό: ο κωδικοποιητής MediaCodec λειτουργεί σύγχρονα, επομένως για transcoding σε πραγματικό χρόνο απαιτείται οργάνωση ενός βρόχου με σωστή επεξεργασία χρονικών σημάτων (PTS) για κάθε καρέ.
Το transcoding σε κινητές συσκευές είναι μια εργασία που απαιτεί προσεκτική βελτιστοποίηση λόγω περιορισμένων πόρων CPU, GPU και θερμικών περιορισμών. Αρκετές στρατηγικές βοηθούν στην αποτελεσματική εκτέλεση transcoding.
Ο βασικός παράγοντας απόδοσης — ο κωδικοποιητής υλικού. Σε iOS, το VideoToolbox παρέχει κωδικοποίηση υλικού H.264 και H.265 με ταχύτητα 5–10 φορές μεγαλύτερη από το λογισμικό libx264. Σε Android, το MediaCodec χρησιμοποιεί εξαρτήματα υλικού OMX, εάν είναι διαθέσιμα. Η ενεργοποίηση κωδικοποίησης υλικού μειώνει τον χρόνο transcoding ενός βίντεο 10 λεπτών από 30–40 λεπτά (λογισμικό) σε 3–5 λεπτά (υλικό) σε μια κορυφαία συσκευή.
Για κινητό transcoding, η ισορροπία μεταξύ ποιότητας, μεγέθους και χρόνου επεξεργασίας είναι κρίσιμη. Για H.265 σε κινητές συσκευές, συνιστάται bitrate 4–8 Mbit/s για βίντεο 1080p με ρυθμό καρέ 30 FPS. Η λειτουργία CRF (Constant Rate Factor) στο libx265 επιτρέπει τον άμεσο ορισμό ποιότητας, όπου 23–28 δίνει καλή οπτική ποιότητα με μέτριο μέγεθος αρχείου. Για κωδικοποιητές υλικού, χρησιμοποιήστε λειτουργία CBR με επιθυμητό bitrate, καθώς το CRF δεν υποστηρίζεται από υλικό.
Η συνεχής εκτέλεση transcoding σε κινητή συσκευή προκαλεί σημαντική θέρμανση. Μετά από 5–7 λεπτά έντονης κωδικοποίησης βίντεο 4K, η θερμοκρασία του επεξεργαστή μπορεί να φτάσει τους 50–55 βαθμούς, οπότε ενεργοποιείται το throttling. Λύση — transcoding με διαλείμματα ή μείωση του ρυθμού καρέ σε 30 FPS. Εάν η εφαρμογή απαιτεί μαζικό transcoding (π.χ. επεξεργαστής βίντεο), είναι προτιμότερο να εκτελείται η επεξεργασία σε παρτίδες των 2–3 λεπτών με διαστήματα ψύξης. Για σενάρια παραγωγής, είναι βέλτιστο να μεταφέρεται το transcoding στην πλευρά του διακομιστή και να χρησιμοποιούνται υπηρεσίες cloud.
Συχνές ερωτήσεις
Η κωδικοποίηση (encoding) είναι η συμπίεση αρχικών ασυμπίεστων δεδομένων στον επιθυμητό codec. Το transcoding περιλαμβάνει τόσο αποκωδικοποίηση όσο και κωδικοποίηση: πρώτα αποκωδικοποιεί την υπάρχουσα συμπιεσμένη ροή, στη συνέχεια κωδικοποιεί ξανά. Η απλή κωδικοποίηση λαμβάνει στην είσοδο ασυμπίεστα δεδομένα (π.χ. από κάμερα), ενώ το transcoding — ένα ήδη συμπιεσμένο αρχείο.
Για μέγιστη συμβατότητα — H.264. Για καλύτερη συμπίεση — H.265 (HEVC). Εάν η συσκευή υποστηρίζει κωδικοποίηση υλικού H.265 (iPhone 8+, Android με Snapdragon 845+), παρέχει περίπου διπλάσιο μικρότερο μέγεθος αρχείου με την ίδια ποιότητα. Η κωδικοποίηση AV1 σε κινητές συσκευές είναι ακόμη πολύ αργή, ακόμα και με επιτάχυνση υλικού.
Αυστηρά μιλώντας, transcoding χωρίς απώλειες είναι αδύνατο κατά την αλλαγή lossy codec. Εάν και οι δύο codec συμπιέζουν με απώλειες, κάθε γενιά transcoding υποβαθμίζει την ποιότητα. Transcoding χωρίς απώλειες είναι δυνατό μόνο μεταξύ μορφών χωρίς απώλειες (FFV1, H.264 Lossless) ή κατά την αλλαγή δοχείου χωρίς επανακωδικοποίηση (transmuxing).
Ναι, εάν χρησιμοποιούνται αποκωδικοποιητής και κωδικοποιητής υλικού και η επιθυμητή ανάλυση δεν υπερβαίνει τα 1080p. Σε συσκευές με VideoToolbox (iOS) ή MediaCodec (Android), το realtime transcoding H.264→H.265 είναι δυνατό με καθυστέρηση 1–3 δευτερολέπτων. Για 4K σε πραγματικό χρόνο απαιτείται ισχυρό SoC Apple A17 Pro, Snapdragon 8 Gen 2 ή νεότερο.
Το transcoding με απώλειες συσσωρεύει τεχνουργήματα συμπίεσης. Εάν το αρχικό αρχείο ήταν ήδη πολύ συμπιεσμένο (bitrate 2–3 Mbit/s για 1080p), η επαναλαμβανόμενη συμπίεση θα διπλασιάσει τις απώλειες. Συνιστάται να γίνεται transcoding μόνο από πρωτότυπα υψηλού bitrate (20+ Mbit/s) και να χρησιμοποιείται CRF 18–23 για ελάχιστες απώλειες.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης