MediaExtractorCompat क्लास, प्लैटफ़ॉर्म की MediaExtractor क्लास की जगह इस्तेमाल की जा सकती है. साथ ही, यह एक जैसे एपीआई और फ़ंक्शन उपलब्ध कराती है. इससे डेटा सोर्स से, डीमक्स किए गए मीडिया डेटा को एक्सट्रैक्ट करने में मदद मिलती है. यह डेटा आम तौर पर एन्कोड किया गया होता है.
यह कंटेनर फ़ाइल (जैसे कि MP4 या MKV) को उसके अलग-अलग ट्रैक में बांटता है. जैसे, वीडियो, ऑडियो, और सबटाइटल. इसके बाद, एक्सट्रैक्टर इन ट्रैक से मिले रॉ और एन्कोड किए गए डेटा को सैंपल के क्रम के तौर पर पढ़ता है. जैसे, कंप्रेस किया गया कोई वीडियो फ़्रेम या ऑडियो का ब्लॉक. इसके बाद, इन्हें डिकोडर को भेजा जाता है.
इस्तेमाल के सामान्य उदाहरणों में ये शामिल हैं:
- ट्रांसकोडिंग या रीमक्सिंग: किसी ट्रैक से कोड किए गए सैंपल को पढ़ना, ताकि कोडेक को बदला जा सके (ट्रांसकोडिंग) या स्ट्रीम को नए कंटेनर में फिर से पैक किया जा सके (रीमक्सिंग). जैसे, MP4 फ़ाइल को MKV में बदलना.
- चुनिंदा कॉन्टेंट निकालना: किसी एक ट्रैक को अलग करके सेव करना. जैसे, किसी वीडियो फ़ाइल से ऑडियो स्ट्रीम निकालना.
- लो-लेवल डीबगिंग: फ़ाइल में मौजूद गड़बड़ी, टाइमस्टैंप से जुड़ी समस्याएं या अन्य समस्याओं को ठीक करने के लिए, अलग-अलग सैंपल की जांच करना.
- कस्टम प्लेयर बनाना: खास इस्तेमाल के मामलों के लिए, मीडिया पाइपलाइन पर पूरा कंट्रोल रखने वाला कस्टम प्लेयर बनाना.
खास जानकारी
यहां दिए गए कोड सैंपल में, MediaExtractorCompat का इस्तेमाल करने का तरीका बताया गया है:
Kotlin
fun extractSamples(context: Context, mediaPath: String) { val extractor = MediaExtractorCompat(context) try { // 1. Setup the extractor extractor.setDataSource(mediaPath) // Find and select available tracks for (i in 0 until extractor.trackCount) { val format = extractor.getTrackFormat(i) extractor.selectTrack(i) } // 2. Process samples val buffer = ByteBuffer.allocate(10 * 1024 * 1024) while (true) { // Read an encoded sample into the buffer. val bytesRead = extractor.readSampleData(buffer, 0) if (bytesRead < 0) break // Access sample metadata val trackIndex = extractor.sampleTrackIndex val presentationTimeUs = extractor.sampleTime val sampleSize = extractor.sampleSize extractor.advance() } } catch (e: IOException) { handleFailure(e) } finally { // 3. Release the extractor extractor.release() } }
Java
public void extractSamples(Context context, String mediaPath) { MediaExtractorCompat extractor = new MediaExtractorCompat(context); try { // 1. Setup the extractor extractor.setDataSource(mediaPath); // Find and select available tracks for (int i = 0; i < extractor.getTrackCount(); i++) { MediaFormat format = extractor.getTrackFormat(i); extractor.selectTrack(i); } // 2. Process samples ByteBuffer buffer = ByteBuffer.allocate(10 * 1024 * 1024); while (true) { // Read an encoded sample into the buffer. int bytesRead = extractor.readSampleData(buffer, 0); if (bytesRead < 0) { break; } // Access sample metadata int trackIndex = extractor.getSampleTrackIndex(); long presentationTimeUs = extractor.getSampleTime(); long sampleSize = extractor.getSampleSize(); extractor.advance(); } } catch (IOException e) { handleFailure(e); } finally { // 3. Release the extractor extractor.release(); } }