ट्रांसकोडिंग एक डिजिटल मीडिया फ़ाइल को एक संपीड़न प्रारूप से दूसरे में पूर्ण डिकोडिंग और पुनः एन्कोडिंग के साथ रूपांतरित करने की प्रक्रिया है। ट्रांसमक्सिंग (केवल कंटेनर बदलना) के विपरीत, ट्रांसकोडिंग कोडेक, बिटरेट, रिज़ॉल्यूशन और संपीड़ित स्ट्रीम के अन्य पैरामीटर बदलता है। Apple AVFoundation documentation (2026) के अनुसार, ट्रांसकोडिंग का उपयोग विभिन्न उपकरणों और नेटवर्क स्थितियों के लिए सामग्री को अनुकूलित करने के लिए किया जाता है।
मुख्य बिंदु
ट्रांसकोडिंग एक मीडिया फ़ाइल को एक संपीड़न प्रारूप से दूसरे में बदलने की प्रक्रिया है, जिसमें स्रोत स्ट्रीम को पूरी तरह से एक मध्यवर्ती बिना संपीड़ित PCM प्रारूप में डिकोड किया जाता है और फिर नए पैरामीटर के साथ एन्कोड किया जाता है। यदि स्रोत फ़ाइल 10 Mbps की बिटरेट के साथ H.264 कोडेक का उपयोग करती है और आउटपुट को 3 Mbps की बिटरेट के साथ H.265 की आवश्यकता है — यह ट्रांसकोडिंग है।
ट्रांसकोडिंग सरल रीपैकेजिंग (ट्रांसमक्सिंग) से भिन्न है, जहां केवल कंटेनर बदलता है (उदा., MP4 से MKV) जबकि संपीड़ित बिटस्ट्रीम अपरिवर्तित रहती है। ट्रांसकोडिंग में कम्प्यूटेशनल रूप से महंगे संचालन शामिल हैं: प्रत्येक फ्रेम को डिकोड करना, फ़िल्टर लगाना (स्केलिंग, रंग सुधार, क्रॉपिंग), और नए पैरामीटर के साथ पुनः एन्कोडिंग करना। यह ट्रांसकोडिंग को मीडिया के साथ काम करते समय सबसे अधिक संसाधन-गहन कार्यों में से एक बनाता है।
ट्रांसकोडिंग का उपयोग कई कार्यों में किया जाता है: बैंडविड्थ सीमाओं के अनुसार वीडियो को अनुकूलित करना, लक्ष्य उपकरण पर हार्डवेयर डिकोडिंग समर्थन वाले प्रारूप में परिवर्तित करना, HLS/DASH स्ट्रीमिंग के लिए कई संस्करण बनाना, अलग फ़ाइल में ऑडियो ट्रैक निकालना। OTT सेवाएं (Netflix, YouTube, Twitch) प्रत्येक अपलोड की गई फ़ाइल को अलग-अलग बिटरेट, रिज़ॉल्यूशन और कोडेक वाले दर्जनों वेरिएंट में ट्रांसकोड करती हैं ताकि लाखों उपयोगकर्ताओं को अनुकूली स्ट्रीमिंग प्रदान की जा सके।
ट्रांसकोडिंग प्रक्रिया तीन मुख्य चरणों से मिलकर बनी है: डिकोडिंग, प्रोसेसिंग और एन्कोडिंग। प्रत्येक चरण उपलब्धता और आवश्यक प्रदर्शन के आधार पर CPU या GPU/हार्डवेयर ब्लॉक पर किया जा सकता है।
पहला चरण स्रोत स्ट्रीम को डिकोड करना है। स्रोत फ़ाइल कंटेनर (MP4, MOV, MKV) से पढ़ी जाती है, जिसके बाद संपीड़ित वीडियो पैकेट डिकोडर को भेजे जाते हैं। डिकोडिंग हार्डवेयर-आधारित (यदि कोडेक समर्थित है) या FFmpeg के माध्यम से सॉफ़्टवेयर-आधारित हो सकती है। डिकोडिंग का आउटपुट YUV420 या BGRA प्रारूप में बिना संपीड़ित फ्रेम होते हैं — यह वह चरण है जहां ट्रांसकोडिंग सरल रीमल्टीप्लेक्सिंग से भिन्न होता है।
दूसरा चरण फ़िल्टरिंग और प्रोसेसिंग है। डिकोड किए गए फ्रेम फ़िल्टर की एक श्रृंखला से गुज़रते हैं: लक्ष्य रिज़ॉल्यूशन पर स्केलिंग, फ्रेम दर बदलना, रंग सुधार, टेक्स्ट या ग्राफ़िक्स ओवरले करना। FFmpeg फ़िल्टर श्रृंखला एक ग्राफ़ के रूप में बनाई जाती है जहां प्रत्येक फ़िल्टर एक अलग प्रोसेसिंग मॉड्यूल है। उदाहरण के लिए, फ़िल्टर scale=1280:720 रिज़ॉल्यूशन बदलता है, fps=30 फ्रेम दर बदलता है, और yadif डीइंटरलेसिंग करता है। सभी संचालन बिना संपीड़ित फ्रेम पर किए जाते हैं, जिससे दूसरा चरण सबसे अधिक संसाधन-गहन होता है।
तीसरा चरण लक्ष्य प्रारूप में एन्कोडिंग है। प्रोसेस किए गए फ्रेम एन्कोडर को दिए जाते हैं, जो उन्हें लक्ष्य कोडेक एल्गोरिथम के अनुसार संपीड़ित करता है। एन्कोडर हार्डवेयर-आधारित (iOS पर VideoToolbox, Android पर MediaCodec) या सॉफ़्टवेयर-आधारित (libx264, libx265) हो सकता है। एन्कोडिंग पैरामीटर: स्थिर गुणवत्ता के लिए CRF (कॉन्स्टेंट रेट फ़ैक्टर), CBR/VBR के लिए बिटरेट, लक्ष्य उपकरणों के साथ संगतता के लिए प्रोफ़ाइल और स्तर।
// 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);
}
उपरोक्त पाइपलाइन क्लासिक ट्रांसकोडिंग चक्र को प्रदर्शित करती है। av_read_frame फ़ंक्शन इनपुट फ़ाइल से संपीड़ित पैकेट पढ़ता है, avcodec_send_packet उन्हें फ्रेम में डिकोड करता है, sws_scale स्केलिंग करता है, और avcodec_send_frame प्रोसेस किए गए फ्रेम को आउटपुट प्रारूप में एन्कोड करता है। यह तीन-चरणीय चक्र प्रत्येक फ्रेम या फ्रेम समूह (GOP) के लिए एन्कोडर सेटिंग्स के आधार पर दोहराया जाता है।
ट्रांसकोडिंग और ट्रांसमक्सिंग के बीच अंतर मीडिया इंजीनियरिंग में सबसे आम भ्रम बिंदुओं में से एक है। इस अंतर को समझना सही मीडिया प्रोसेसिंग रणनीति चुनने के लिए महत्वपूर्ण है।
| पैरामीटर | ट्रांसकोडिंग | ट्रांसमक्सिंग |
|---|---|---|
| क्या बदलता है | कोडेक, बिटरेट, रिज़ॉल्यूशन | कंटेनर, मेटाडेटा |
| कम्प्यूटेशनल लोड | उच्च (डिकोडिंग + एन्कोडिंग) | न्यूनतम (पैकेट कॉपी करना) |
| गुणवत्ता | खराब हो सकती है (जनरेशन लॉस) | बिना नुकसान |
| निष्पादन समय | लंबे वीडियो के लिए मिनट–घंटे | सेकंड–मिनट |
| अनुप्रयोग | प्रारूप अनुकूलन, संपीड़न | संगतता के लिए कंटेनर बदलना |
ट्रांसमक्सिंग बिना डिकोडिंग और पुनः एन्कोडिंग के एक संपीड़ित स्ट्रीम को दूसरे कंटेनर में रीपैकेज करना है। यदि वीडियो पहले से MP4 कंटेनर में H.265 कोडेक के साथ संपीड़ित है और इसे MOV या MKV कंटेनर में रखने की आवश्यकता है — ट्रांसमक्सिंग बस बिटस्ट्रीम पैकेट को एक कंटेनर से दूसरे में कॉपी करता है। गुणवत्ता प्रभावित नहीं होती, प्रोसेसिंग समय न्यूनतम होता है क्योंकि फ्रेम डिकोडिंग की आवश्यकता नहीं होती। FFmpeg -codec copy फ़्लैग के साथ ट्रांसमक्सिंग करता है।
ट्रांसकोडिंग, दूसरी ओर, मीडिया स्ट्रीम को पूरी तरह से डिकोड और पुनः संपीड़ित करता है। हर बार जब वीडियो ट्रांसकोडिंग से गुज़रता है, जनरेशन लॉस हो सकता है — बार-बार लॉसी संपीड़न के कारण गुणवत्ता में मामूली गिरावट। समान बिटरेट पर भी, ट्रांसकोडिंग की तीसरी पीढ़ी आमतौर पर पहली से खराब होती है। यही कारण है कि पेशेवर मास्टर कॉपी को बिना संपीड़ित या न्यूनतम संपीड़ित प्रारूप (ProRes, DNxHR) में संग्रहीत करने और केवल अंतिम वितरण संस्करणों को ट्रांसकोड करने की सलाह देते हैं।
ट्रांसकोडिंग उपकरण का चुनाव प्लेटफ़ॉर्म, प्रदर्शन आवश्यकताओं और उपयोग के मामले पर निर्भर करता है। मोबाइल डेवलपमेंट के लिए देशी API और क्रॉस-प्लेटफ़ॉर्म लाइब्रेरी दोनों उपलब्ध हैं।
FFmpeg सभी प्लेटफ़ॉर्म पर ट्रांसकोडिंग के लिए डी फ़ैक्टो मानक है। FFmpeg कमांड लाइन लगभग किसी भी रूपांतरण की अनुमति देती है: कोडेक बदलना, बिटरेट समायोजन, ट्रिमिंग, कॉन्केटनेशन, फ़िल्टर अनुप्रयोग। मोबाइल ऐप्लिकेशन के लिए, FFmpeg को libavformat, libavcodec और libavfilter लाइब्रेरी के माध्यम से एकीकृत किया जाता है। एक विशिष्ट ट्रांसकोडिंग कमांड का उदाहरण: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4।
iOS पर, ट्रांसकोडिंग AVAssetWriter और AVAssetReader के माध्यम से की जाती है। AVAssetReader बिना संपीड़ित फ्रेम पढ़कर स्रोत फ़ाइल को डिकोड करता है, और AVAssetWriter उन्हें लक्ष्य प्रारूप में एन्कोड करता है। यह दृष्टिकोण स्वचालित रूप से VideoToolbox हार्डवेयर एन्कोडर का उपयोग करता है, जो अधिकतम प्रदर्शन सुनिश्चित करता है। Android पर, समान कार्यक्षमता MediaCodec के माध्यम से MediaExtractor और MediaMuxer के साथ उपलब्ध है — MediaExtractor संपीड़ित पैकेट निकालता है, MediaCodec डिकोड और एन्कोड करता है, MediaMuxer परिणाम लिखता है।
प्रोडक्शन वातावरण में सर्वर-साइड ट्रांसकोडिंग के लिए, क्लाउड सेवाओं का उपयोग किया जाता है: AWS Elemental MediaConvert, Azure Media Services, Google Transcoder API। ये सेवाएं लोड के तहत स्वचालित रूप से स्केल होती हैं, सभी लोकप्रिय प्रारूपों का समर्थन करती हैं, और अनुकूली स्ट्रीमिंग (HLS, DASH) के लिए एक इनपुट फ़ाइल को दर्जनों आउटपुट वेरिएंट में ट्रांसकोड कर सकती हैं। मोबाइल ऐप्लिकेशन के लिए, क्लाउड ट्रांसकोडिंग सबसे अच्छा समाधान है क्योंकि यह उपयोगकर्ता के उपकरण को लोड नहीं करता और अतुल्यकालिक सामग्री तैयारी की अनुमति देता है।
आइए हार्डवेयर त्वरण और प्रमुख गुणवत्ता पैरामीटर कॉन्फ़िगरेशन का उपयोग करके मोबाइल प्लेटफ़ॉर्म पर व्यावहारिक ट्रांसकोडिंग उदाहरण देखें।
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("ट्रांसकोडिंग पूर्ण हुई")
case .failed:
print("त्रुटि: " + assetExportSession.error.localizedDescription)
default:
break
}
}
// 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)
}
उदाहरण iOS पर ट्रांसकोडिंग के दो दृष्टिकोण दिखाता है। AVAssetExportSession गुणवत्ता प्रीसेट (H.265 के लिए HEVCHighestQuality) के साथ एक सरल तरीका है। AVAssetReader + AVAssetWriter के माध्यम से मैनुअल पाइपलाइन पैरामीटर पर पूर्ण नियंत्रण प्रदान करती है: बिटरेट, प्रोफ़ाइल, स्तर। AVVideoProfileLevelH265Main10 पैरामीटर 10-बिट रंग गहराई के साथ HDR प्रोफ़ाइल Main10 को सक्षम करता है, जो आधुनिक 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 कोड MediaExtractor — MediaCodec डिकोडर — MediaCodec एन्कोडर — MediaMuxer की पाइपलाइन बनाता है। MediaExtractor इनपुट फ़ाइल से कोडेक प्रकार निर्धारित करता है और संबंधित डिकोडर चुनता है। एन्कोडर H.265 (HEVC) के लिए 4 Mbps की बिटरेट और 2 सेकंड की कुंजी फ्रेम अंतराल के साथ कॉन्फ़िगर किया गया है, जो स्ट्रीमिंग के लिए इष्टतम है। महत्वपूर्ण: MediaCodec एन्कोडर समकालिक रूप से काम करता है, इसलिए रीयल-टाइम ट्रांसकोडिंग के लिए प्रत्येक फ्रेम के सही PTS टाइमस्टैम्प हैंडलिंग के साथ एक लूप लागू किया जाना चाहिए।
मोबाइल उपकरणों पर ट्रांसकोडिंग एक ऐसा कार्य है जिसमें सीमित CPU, GPU संसाधनों और थर्मल बाधाओं के कारण सावधानीपूर्वक अनुकूलन की आवश्यकता होती है। कई रणनीतियां कुशलतापूर्वक ट्रांसकोडिंग करने में मदद करती हैं।
प्रमुख प्रदर्शन कारक हार्डवेयर एन्कोडर है। iOS पर, VideoToolbox सॉफ़्टवेयर libx264 से 5–10 गुना तेज़ गति पर हार्डवेयर H.264 और H.265 एन्कोडिंग प्रदान करता है। Android पर, MediaCodec यदि उपलब्ध हो तो हार्डवेयर OMX घटकों का उपयोग करता है। हार्डवेयर एन्कोडिंग सक्षम करने से फ़्लैगशिप डिवाइस पर 10 मिनट के वीडियो का ट्रांसकोडिंग समय 30–40 मिनट (सॉफ़्टवेयर) से घटकर 3–5 मिनट (हार्डवेयर) हो जाता है।
मोबाइल ट्रांसकोडिंग के लिए, गुणवत्ता, आकार और प्रोसेसिंग समय के बीच संतुलन महत्वपूर्ण है। मोबाइल उपकरणों पर H.265 के लिए, 30 FPS पर 1080p वीडियो के लिए 4–8 Mbps की बिटरेट अनुशंसित है। libx265 में CRF मोड (कॉन्स्टेंट रेट फ़ैक्टर) सीधे गुणवत्ता सेट करने की अनुमति देता है, जहां 23–28 मध्यम फ़ाइल आकार पर अच्छी दृश्य गुणवत्ता प्रदान करता है। हार्डवेयर एन्कोडर के लिए, लक्ष्य बिटरेट के साथ CBR मोड का उपयोग करें क्योंकि CRF हार्डवेयर में समर्थित नहीं है।
मोबाइल उपकरण पर लगातार ट्रांसकोडिंग से महत्वपूर्ण ताप उत्पन्न होता है। 4K वीडियो के 5–7 मिनट के गहन एन्कोडिंग के बाद, प्रोसेसर का तापमान 50–55 डिग्री तक पहुंच सकता है, जिसके बाद थ्रॉटलिंग शुरू हो जाती है। समाधान ठहराव के साथ ट्रांसकोडिंग करना या फ्रेम दर को 30 FPS तक कम करना है। यदि ऐप्लिकेशन को बैच ट्रांसकोडिंग की आवश्यकता है (उदा., वीडियो एडिटर), तो कूलिंग अंतराल के साथ 2–3 मिनट के बैच में प्रोसेस करना बेहतर है। प्रोडक्शन परिदृश्यों के लिए, ट्रांसकोडिंग को सर्वर साइड पर स्थानांतरित करना और क्लाउड सेवाओं का उपयोग करना इष्टतम है।
अक्सर पूछे जाने वाले प्रश्न
एन्कोडिंग बिना संपीड़ित डेटा को लक्ष्य कोडेक में संपीड़ित करना है। ट्रांसकोडिंग में डिकोडिंग और एन्कोडिंग दोनों शामिल हैं: यह पहले मौजूदा संपीड़ित स्ट्रीम को डिकोड करता है, फिर इसे फिर से एन्कोड करता है। सरल एन्कोडिंग इनपुट के रूप में बिना संपीड़ित डेटा लेती है (उदा., कैमरे से), जबकि ट्रांसकोडिंग पहले से संपीड़ित फ़ाइल लेती है।
अधिकतम संगतता के लिए — H.264। बेहतर संपीड़न के लिए — H.265 (HEVC)। यदि उपकरण हार्डवेयर H.265 एन्कोडिंग (iPhone 8+, Snapdragon 845+ वाला Android) का समर्थन करता है, तो यह समान गुणवत्ता पर आधा फ़ाइल आकार प्रदान करता है। AV1 एन्कोडिंग मोबाइल उपकरणों पर हार्डवेयर त्वरण के साथ भी अभी भी बहुत धीमी है।
सख्ती से कहें तो, लॉसी कोडेक के बीच स्विच करते समय दोषरहित ट्रांसकोडिंग असंभव है। यदि दोनों कोडेक लॉसी हैं, तो ट्रांसकोडिंग की प्रत्येक पीढ़ी गुणवत्ता खराब करती है। दोषरहित ट्रांसकोडिंग केवल दोषरहित प्रारूपों (FFV1, H.264 Lossless) के बीच या पुनः एन्कोडिंग के बिना कंटेनर बदलने (ट्रांसमक्सिंग) पर संभव है।
हां, यदि हार्डवेयर डिकोडर और एन्कोडर का उपयोग किया जाता है और लक्ष्य रिज़ॉल्यूशन 1080p से अधिक नहीं है। VideoToolbox (iOS) या MediaCodec (Android) वाले उपकरणों पर, रीयल-टाइम H.264→H.265 ट्रांसकोडिंग 1–3 सेकंड की देरी से संभव है। 4K रीयल-टाइम के लिए, Apple A17 Pro, Snapdragon 8 Gen 2 या उससे ऊपर जैसे शक्तिशाली SoC की आवश्यकता है।
लॉसी ट्रांसकोडिंग संपीड़न कलाकृतियों को संचित करती है। यदि स्रोत फ़ाइल पहले से भारी संपीड़ित थी (1080p के लिए 2–3 Mbps बिटरेट), पुनः संपीड़न नुकसान को दोगुना कर देता है। अनुशंसा है कि केवल उच्च बिटरेट (20+ Mbps) वाली मास्टर कॉपी से ट्रांसकोड करें और न्यूनतम नुकसान के लिए CRF 18–23 का उपयोग करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें