Software decoding — सॉफ़्टवेयर लाइब्रेरीज़ के माध्यम से केंद्रीय प्रोसेसर (CPU) द्वारा मीडिया डेटा को डीकंप्रेस करने की प्रक्रिया, बिना SoC के हार्डवेयर ब्लॉक का उपयोग किए। सॉफ़्टवेयर डिकोडर क्रॉस-प्लेटफ़ॉर्म लाइब्रेरीज़ के रूप में कार्यान्वित किए जाते हैं: FFmpeg libavcodec और AV1 के लिए dav1d के साथ। FFmpeg दस्तावेज़ीकरण (2026) के अनुसार, libavcodec 200 से अधिक कोडेक को सपोर्ट करता है, जो software decoding को दुर्लभ प्रारूपों को चलाने का एकमात्र तरीका बनाता है।
मुख्य बिंदु
Software decoding मीडिया डेटा को डीकंप्रेस करने की एक विधि है जिसमें सभी कम्प्यूटेशनल संचालन सामान्य-उद्देश्य वाले CPU कोर पर किए जाते हैं। हार्डवेयर डिकोडिंग के विपरीत, जहां प्रत्येक कोडेक के लिए एक समर्पित भौतिक ब्लॉक होता है, सॉफ़्टवेयर डिकोडर सामान्य कोड है जो प्रोसेसर निर्देशों का उपयोग करके समान एल्गोरिदम निष्पादित करता है।
सॉफ़्टवेयर डिकोडर C/C++ में विशिष्ट CPU आर्किटेक्चर के लिए अनुकूलन के साथ लिखे जाते हैं: मोबाइल उपकरणों के लिए ARM NEON SIMD निर्देश, डेस्कटॉप के लिए Intel SSE/AVX। FFmpeg से libavcodec लाइब्रेरी में विभिन्न प्लेटफ़ॉर्म के लिए अनुकूलित असेंबली कोड की दसियों हज़ार पंक्तियाँ हैं, जो सॉफ़्टवेयर डिकोडिंग को शक्तिशाली CPU पर AV1 जैसे भारी प्रारूपों के लिए भी अच्छा प्रदर्शन प्राप्त करने की अनुमति देती है।
सॉफ़्टवेयर डिकोडिंग का मुख्य लाभ बहुमुखी प्रतिभा है। यदि हार्डवेयर डिकोडर केवल 4–5 मुख्य प्रारूपों (H.264, H.265, VP9, AV1) का समर्थन करता है, तो FFmpeg 200 से अधिक कोडेक को डिकोड कर सकता है: आधुनिक AV1 और H.265 से लेकर पुरातन Sorenson Spark, RealVideo और Motion JPEG तक। यह सॉफ़्टवेयर डिकोडिंग को गैर-मानक मीडिया डेटा के साथ काम करने वाले अनुप्रयोगों के लिए एक अपरिहार्य उपकरण बनाता है — जैसे पेशेवर वीडियो संपादक, वीडियो निगरानी सिस्टम और विशेष प्लेयर।
सॉफ़्टवेयर डिकोडिंग हार्डवेयर डिकोडिंग के समान चरणों का पालन करती है, लेकिन सामान्य-उद्देश्य वाले CPU पर। प्रत्येक चरण को फ़ंक्शन के रूप में कार्यान्वित किया जाता है जो प्रत्येक मैक्रोब्लॉक या फ्रेम के लिए क्रमिक रूप से कॉल किए जाते हैं। मुख्य अंतर लचीलापन है: डेवलपर पाइपलाइन को संशोधित कर सकता है, डिकोडिंग चरणों के बीच फ़िल्टर और पोस्ट-प्रोसेसिंग जोड़ सकता है।
एक सामान्य सॉफ़्टवेयर डिकोडर में मॉड्यूल होते हैं जो अलग-अलग एल्गोरिदम चरणों को लागू करते हैं। एंट्रॉपी डिकोडिंग मॉड्यूल बिटस्ट्रीम पढ़ता है और क्वांटाइज़्ड DCT गुणांक को पुनर्स्थापित करता है। H.264 के लिए, यह मॉड्यूल CABAC (संदर्भ-अनुकूली द्विआधारी अंकगणितीय कोडिंग) लागू करता है — सशर्त शाखाओं वाला एक जटिल एल्गोरिदम जिसे हार्डवेयर में तेज़ करना मुश्किल है लेकिन अच्छे शाखा भविष्यवक्ता वाले CPU पर कुशलतापूर्वक चलता है।
व्युत्क्रम क्वांटीकरण मॉड्यूल गुणांक को क्वांटीकरण चरण से गुणा करता है, और व्युत्क्रम DCT मॉड्यूल असतत कोसाइन ट्रांसफ़ॉर्म लागू करता है। व्युत्क्रम DCT का सॉफ़्टवेयर कार्यान्वयन तेज़ चेन एल्गोरिदम या लोफ़लर एल्गोरिदम का उपयोग करता है, जो 8x8 ब्लॉक के लिए गुणा-संचय संचालन की संख्या को 4096 से घटाकर 256 कर देता है। NEON SIMD निर्देश (ARM) या SSE (x86) प्रति निर्देश 4–8 गुणांक संसाधित करने की अनुमति देते हैं, जो स्केलर कोड की तुलना में 4–8 गुना त्वरण प्रदान करते हैं।
मोशन कम्पन्सेशन मॉड्यूल सबसे अधिक मेमोरी-गहन है। यह गति वैक्टर के अनुसार संदर्भ फ्रेम से क्षेत्रों को निकालता है और सबपिक्सेल इंटरपोलेशन लागू करता है। H.265 के लिए, इंटरपोलेशन सटीकता 1/8 पिक्सेल तक पहुँचती है, जिसके लिए लूमा के लिए 8-टैप FIR फ़िल्टर और क्रोमा के लिए 4-टैप की आवश्यकता होती है। सॉफ़्टवेयर कार्यान्वयन को कैश से बड़ी मात्रा में संदर्भ फ्रेम डेटा लोड करना पड़ता है, जो CPU पर उच्च रिज़ॉल्यूशन डिकोड करते समय मोशन कम्पन्सेशन को एक बाधा बनाता है।
आधुनिक मोबाइल प्रोसेसर, जैसे Apple A17 या Qualcomm Snapdragon 8 Gen 2, में 6–8 कोर होते हैं जो बिना फ्रेम ड्रॉप के 1080p H.264 की सॉफ़्टवेयर डिकोडिंग के लिए पर्याप्त प्रदर्शन रखते हैं। हालांकि, 4K सामग्री के लिए, विशेष रूप से H.265 और AV1 प्रारूपों में, CPU पर सॉफ़्टवेयर डिकोडिंग संघर्ष कर सकती है: सभी कोर पर सामान्य लोड 70–90% तक पहुँच जाता है, जो मल्टीटास्किंग के लिए महत्वपूर्ण है। बड़े कोर (Apple Performance, Qualcomm Kryo Prime) छोटे ऊर्जा-कुशल कोर की तुलना में ~4–5 गुना प्रदर्शन प्रदान करते हैं, लेकिन आनुपातिक रूप से अधिक ऊर्जा की खपत करते हैं।
सॉफ़्टवेयर डिकोडर बाज़ार में कई प्रमुख लाइब्रेरीज़ हैं, प्रत्येक अपने क्षेत्र के लिए अनुकूलित है। डिकोडर का चयन आवश्यक प्रारूपों, प्लेटफ़ॉर्म और लाइसेंसिंग बाधाओं पर निर्भर करता है।
FFmpeg उद्योग में सॉफ़्टवेयर डिकोडिंग का डी-फैक्टो मानक है। libavcodec लाइब्रेरी में सभी प्रमुख और अधिकांश दुर्लभ कोडेक के लिए डिकोडर शामिल हैं, सभी कंटेनर (MP4, MKV, AVI, MOV, WebM) का समर्थन करती है, और सभी प्लेटफ़ॉर्म पर चलती है। FFmpeg LGPL/GPL के तहत लाइसेंस प्राप्त है, जिसके लिए वाणिज्यिक उपयोग के लिए लाइसेंस शर्तों का अनुपालन आवश्यक है। मोबाइल उपकरणों पर, FFmpeg का उपयोग रैपर के माध्यम से किया जाता है: iOS और Android के लिए ffmpeg-kit, React Native के लिए mobile-ffmpeg।
Dav1d VideoLAN (VLC के डेवलपर्स) से एक सॉफ़्टवेयर AV1 डिकोडर है, जो SIMD अनुकूलन के साथ C में लिखा गया है। इसका मुख्य लक्ष्य हार्डवेयर समर्थन के बिना CPU पर AV1 का सबसे तेज़ संभव सॉफ़्टवेयर डिकोडिंग है। Dav1d Alliance for Open Media के संदर्भ libaom डिकोडर से 30–50% तेज़ है, आक्रामक अनुकूलन के लिए धन्यवाद: मैनुअल कैश प्रबंधन, पोस्ट-प्रोसेसिंग फ़िल्टर के लिए JIT संकलन, और महत्वपूर्ण फ़ंक्शन का वेक्टरीकरण।
मोबाइल उपकरणों पर, dav1d फ्लैगशिप SoCs (Apple A16+, Snapdragon 8 Gen 2+) पर वास्तविक समय में 1080p AV1 डिकोड कर सकता है, लेकिन 4K के लिए एक शक्तिशाली CPU की आवश्यकता होती है। उदाहरण के लिए, Apple M1 पर, सॉफ़्टवेयर dav1d 4K AV1 के लिए ~60 FPS प्राप्त करता है, जबकि Snapdragon 8 Gen 2 पर ~35 FPS तक पहुँचता है। मोबाइल उपकरणों पर स्थिर 4K AV1 प्लेबैक के लिए, हार्डवेयर समर्थन अभी भी अनुशंसित है।
| डिकोडर | प्रारूप | प्लेटफ़ॉर्म | लाइसेंस |
|---|---|---|---|
| libavcodec | 200+ कोडेक | सभी | LGPL/GPL |
| dav1d | AV1 | सभी | BSD 2-Clause |
| libaom | AV1 | सभी | BSD 2-Clause |
| MediaFoundation | H.264, H.265 | Windows | मालिकाना |
सॉफ़्टवेयर और हार्डवेयर डिकोडिंग के बीच चुनाव संगतता और दक्षता के बीच एक समझौता है। नीचे दी गई तालिका प्रमुख विशेषताओं की विस्तृत तुलना प्रस्तुत करती है।
| पैरामीटर | Software Decoding | Hardware Decoding |
|---|---|---|
| समर्थित प्रारूप | 200+ कोडेक | 4–6 कोडेक |
| बिजली की खपत | 1.5–5 W | 0.2–0.8 W |
| अनुकूलन | पाइपलाइन पर पूर्ण नियंत्रण | केवल API के माध्यम से |
| विलंबता | 30–80 ms | 5–15 ms |
| ऊष्मा अपव्यय | उच्च (45–50 C) | निम्न (35–40 C) |
| कोडेक अपडेट | लाइब्रेरी अपडेट के माध्यम से | केवल नए SoC के साथ |
सॉफ़्टवेयर डिकोडिंग अधिकतम लचीलापन प्रदान करती है: डेवलपर एल्गोरिदम को संशोधित कर सकता है, कस्टम फ़िल्टर जोड़ सकता है, और कस्टम प्रोसेसिंग पाइपलाइन लागू कर सकता है। उदाहरण के लिए, वीडियो संपादन अनुप्रयोगों में, प्रत्येक डिकोडिंग चरण को रंग सुधार या प्रभाव ओवरले के लिए GPU पर रीडायरेक्ट किया जा सकता है — यह केवल डिकोडिंग पर सॉफ़्टवेयर नियंत्रण के साथ संभव है।
हालांकि, लचीलेपन की कीमत बिजली की खपत है। 3000–5000 mAh बैटरी वाले मोबाइल उपकरणों के लिए, निरंतर सॉफ़्टवेयर डिकोडिंग देखने के समय को 10–15 घंटे (हार्डवेयर) से घटाकर 2–4 घंटे कर देती है। 45–50 डिग्री तक CPU गर्म होना भी थ्रॉटलिंग का कारण बन सकता है — ओवरहीटिंग को रोकने के लिए प्रोसेसर आवृत्ति में कमी, जिससे फ्रेम ड्रॉप और उपयोगकर्ता अनुभव में गिरावट आती है।
आइए दोनों मोबाइल प्लेटफ़ॉर्म पर सॉफ़्टवेयर डिकोडिंग के व्यावहारिक कार्यान्वयन को देखें। iOS पर, सॉफ़्टवेयर डिकोडिंग FFmpeg के माध्यम से उपयोग की जाती है, और Android पर — Java/Kotlin रैपर के साथ उसी लाइब्रेरी के माध्यम से।
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
}
class SoftwareDecoder {
AVCodecContext* codecCtx;
public:
bool init(const char* filename) {
AVFormatContext* fmtCtx = nullptr;
avformat_open_input(&fmtCtx, filename, nullptr, nullptr);
avformat_find_stream_info(fmtCtx, nullptr);
int videoStream = av_find_best_stream(
fmtCtx, AVMEDIA_TYPE_VIDEO, -1, -1, nullptr, 0
);
AVCodec* decoder = avcodec_find_decoder(
fmtCtx->streams[videoStream]->codecpar->codec_id
);
codecCtx = avcodec_alloc_context3(decoder);
avcodec_parameters_to_context(codecCtx,
fmtCtx->streams[videoStream]->codecpar);
avcodec_open2(codecCtx, decoder, nullptr);
return true;
}
AVFrame* decodePacket(AVPacket* packet) {
avcodec_send_packet(codecCtx, packet);
AVFrame* frame = av_frame_alloc();
int ret = avcodec_receive_frame(codecCtx, frame);
return (ret >= 0) ? frame : nullptr;
}
};
कोड सॉफ़्टवेयर डिकोडिंग के लिए एक न्यूनतम FFmpeg पाइपलाइन प्रदर्शित करता है। avformat_open_input फ़ाइल खोलता है और कंटेनर प्रारूप निर्धारित करता है, avcodec_find_decoder किसी भी कोडेक के लिए स्वचालित रूप से उपयुक्त डिकोडर ढूंढता है। decodePacket विधि नई API (avcodec_send_packet / avcodec_receive_frame) का उपयोग करती है, जो रीयल-टाइम अनुप्रयोगों के लिए AV_CODEC_FLAG_LOW_DELAY फ़्लैग सक्षम के साथ मल्टीथ्रेडेड डिकोडिंग का समर्थन करती है।
class SoftwareDecoder(private val context: Context) {
fun decodeVideo(inputPath: String, outputFolder: String) {
val cmd = "-i $inputPath -vf fps=1 $outputFolder/frame_%04d.jpg"
FFmpegExecutor(context).executeCommand(cmd) { rc ->
Log.d("Decoder", "Finished with rc: $rc")
}
}
fun getFrameCount(filePath: String): Int {
val probe = MediaMetadataRetriever()
probe.setDataSource(filePath)
val duration = probe.extractMetadata(
MediaMetadataRetriever.METADATA_KEY_DURATION
)?.toIntOrNull() ?: 0
val fps = probe.extractMetadata(
MediaMetadataRetriever.METADATA_KEY_VIDEO_FRAME_COUNT
)?.toIntOrNull() ?: 0
probe.release()
return fps
}
}
Kotlin उदाहरण वीडियो से प्रति सेकंड एक फ्रेम निकालने के लिए FFmpegExecutor का उपयोग करता है। पैरामीटर -vf fps=1 एक फ़िल्टर बनाता है जो 60 में से 59 फ्रेम को छोड़ देता है, जिससे CPU लोड कम हो जाता है। यह दृष्टिकोण मोबाइल अनुप्रयोगों में पूर्वावलोकन और प्लेसहोल्डर बनाने के लिए उपयोगी है। रीयल-टाइम सॉफ़्टवेयर डिकोडिंग के लिए, JNI के माध्यम से सीधे निम्न-स्तरीय libavcodec API का उपयोग करने की अनुशंसा की जाती है।
#include <dav1d/dav1d.h>
int decode_av1_frame(const uint8_t* data, size_t size) {
Dav1dContext* ctx = nullptr;
Dav1dSettings settings = { 0 };
dav1d_default_settings(&settings);
settings.n_threads = 4;
dav1d_open(&ctx, &settings);
Dav1dData dav1d_data = { 0 };
dav1d_data_wrap(&dav1d_data, data, size, nullptr, nullptr);
Dav1dPicture pic = { 0 };
if (dav1d_send_data(ctx, &dav1d_data) == 0) {
dav1d_get_picture(ctx, &pic);
}
dav1d_close(&ctx);
return pic.p.w;
}
Dav1d एक न्यूनतम API प्रदान करता है: dav1d_open निर्दिष्ट संख्या में थ्रेड के साथ एक डिकोडर संदर्भ बनाता है, dav1d_send_data संपीड़ित बिटस्ट्रीम स्वीकार करता है, dav1d_get_picture YUV420 प्रारूप में डिकोड किया गया फ्रेम लौटाता है। मोबाइल उपकरणों के लिए, इष्टतम थ्रेड संख्या (n_threads) प्रदर्शन CPU कोर की संख्या घटा एक है, ताकि UI थ्रेड के लिए संसाधन छोड़े जा सकें। Dav1d मेमोरी प्रबंधन और GPU में फ्रेम स्थानांतरित करते समय अनावश्यक प्रतिलिपियों से बचने के लिए Dav1dPicAllocator का भी समर्थन करता है।
उच्च बिजली की खपत के बावजूद, सॉफ़्टवेयर डिकोडिंग कई परिदृश्यों में अपरिहार्य है जहां हार्डवेयर डिकोडिंग आवश्यक कार्यक्षमता प्रदान नहीं कर सकती है। इन परिदृश्यों को समझने से डेवलपर्स को आर्किटेक्चरल निर्णय लेने में मदद मिलती है।
हार्डवेयर डिकोडर केवल आधुनिक प्रारूपों का समर्थन करते हैं। यदि एप्लिकेशन पुरातन रिकॉर्डिंग, वीडियो निगरानी (MJPEG, H.263), पेशेवर कोडेक (ProRes, DNxHD, CineForm), या तृतीय-पक्ष स्रोतों से सामग्री के साथ काम करता है — FFmpeg के माध्यम से सॉफ़्टवेयर डिकोडिंग ही एकमात्र विकल्प होगा। ProRes हार्डवेयर समर्थन वाले Apple A13+ चिप्स को छोड़कर सभी उपकरणों पर केवल सॉफ़्टवेयर द्वारा डिकोड किया जाता है। H.263 के लिए, किसी भी आधुनिक SoC पर कोई हार्डवेयर समर्थन नहीं है — केवल सॉफ़्टवेयर डिकोडिंग।
सॉफ़्टवेयर डिकोडिंग प्रत्येक फ्रेम प्रोसेसिंग चरण तक पूर्ण पहुँच प्रदान करती है। यह उन अनुप्रयोगों के लिए महत्वपूर्ण है जिन्हें आउटपुट से पहले सीधे डिकोड किए गए डेटा पर फ़िल्टर (ब्लर, शोर में कमी, शार्पनिंग) लागू करने की आवश्यकता होती है। FFmpeg फ़िल्टर जटिल श्रृंखलाएँ बनाने की अनुमति देते हैं: डिकोडिंग -> रंग सुधार -> स्केलिंग -> उपशीर्षक ओवरले -> एन्कोडिंग — सभी एक ही लाइब्रेरी के भीतर विभिन्न API के बीच डेटा स्थानांतरित किए बिना।
अनुशंसित मीडिया प्लेयर आर्किटेक्चर हाइब्रिड है: हार्डवेयर डिकोडिंग प्राथमिक के रूप में, सॉफ़्टवेयर डिकोडिंग फ़ॉलबैक के रूप में। प्लेबैक से पहले, एप्लिकेशन दिए गए कोडेक के लिए हार्डवेयर डिकोडर की उपलब्धता की जाँच करता है। यदि कोई डिकोडर नहीं मिलता है, तो FFmpeg के माध्यम से सॉफ़्टवेयर डिकोडिंग शुरू की जाती है। यह रणनीति मुख्य प्रारूपों के लिए प्रदर्शन का त्याग किए बिना अधिकतम संगतता सुनिश्चित करती है। उपलब्धता की जाँच प्रत्येक लॉन्च पर की जानी चाहिए, क्योंकि विभिन्न SoC रिवीज़न के कारण एक ही मॉडल के उपकरणों पर भी हार्डवेयर समर्थन भिन्न हो सकता है।
अक्सर पूछे जाने वाले प्रश्न
CPU एक सामान्य-उद्देश्य वाला प्रोसेसर है जो कई अलग-अलग कार्य करता है। डिकोडिंग के लिए, यह साझा कम्प्यूटेशनल इकाइयों और कैश मेमोरी का उपयोग करता है, जो एक ही कार्य करते समय भी ऊर्जा की खपत करते हैं। हार्डवेयर डिकोडर एक निश्चित पाइपलाइन के साथ एक अत्यधिक विशिष्ट सर्किट है, जहां प्रत्येक ट्रांजिस्टर केवल डिकोडिंग के लिए समर्पित होता है, जो बिजली की खपत को मौलिक रूप से कम करता है।
H.264/H.265 के लिए — SIMD अनुकूलन सक्षम के साथ FFmpeg से libavcodec. AV1 के लिए — dav1d, जो संदर्भ libaom से 30–50% तेज़ है। मोबाइल उपकरणों पर, dav1d का प्रदर्शन फ्लैगशिप SoCs (A16+, Dimensity 9200+) पर रीयल-टाइम 1080p AV1 डिकोडिंग की अनुमति देता है।
हाँ, FFmpeg दोनों प्लेटफ़ॉर्म पर पोर्ट किया गया है। iOS के लिए, ffmpeg-kit का उपयोग करें — सभी कोडेक और प्रारूपों के समर्थन के साथ एक तैयार बिल्ड। Android के लिए — mobile-ffmpeg या NDK के माध्यम से FFmpeg बनाएँ। वाणिज्यिक वितरण के लिए GPL/LGPL लाइसेंसिंग प्रतिबंधों को ध्यान में रखें।
रीयल-टाइम डिकोडिंग का मतलब है कि CPU स्क्रीन पर फ्रेम प्रदर्शित होने से तेज़ी से फ्रेम डिकोड कर सकता है (आमतौर पर 30 या 60 FPS)। 1080p H.264 के लिए, एक आधुनिक मोबाइल CPU इसे आसानी से संभाल लेता है, एक प्रदर्शन कोर का लगभग 30–50% उपयोग करता है। 4K H.265 के लिए, CPU पर रीयल-टाइम केवल फ्लैगशिप SoCs पर सभी कोर पर 70–90% लोड के साथ संभव है।
FFmpeg के माध्यम से thread_count फ़्लैग के साथ मल्टीथ्रेडेड डिकोडिंग (फ्रेम-स्तरीय समानता) का उपयोग करें, skip_frame को B-frames पर सेट करें (यदि परिदृश्य के लिए स्वीकार्य हो), डिकोडिंग से पहले scale फ़िल्टर के माध्यम से रिज़ॉल्यूशन कम करें। dav1d के साथ AV1 के लिए, n_threads = CPU कोर की संख्या घटा एक का उपयोग करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें