کلاس MediaExtractorCompat جایگزین آمادهای برای کلاس MediaExtractor پلاتفرم است و میاناهای برنامهسازی کاربردی و عملکرد یکسانی ارائه میدهد. این
دادهها استخراج دادههای رسانهای غیرچندگانه، معمولاً کدبندیشده، را از منبع داده تسهیل میکند.
این ویژگی فایل محتوی (مانند MP4 یا MKV) را به قطعههای جداگانه آن، مانند ویدیو، صدا، و زیرنویس، تقسیم میکند. سپس استخراجکننده دادههای خام و کدبندیشده را از این قطعهها بهصورت توالی نمونهها (برای مثال، یک قاب ویدیویی فشرده یا بلوک صوتی) میخواند و سپس آنها را به یک کدگشا ارسال میکند.
موارد استفاده رایج عبارتاند از:
- تراتبدیل یا ریمیکس: خواندن نمونههای کدبندیشده از یک قطعه برای تغییر کدک (تراتبدیل) یا بستهبندی مجدد جاریسازیها در یک محفظه جدید (ریمیکس)، مانند تبدیل فایل MP4 به MKV.
- استخراج محتوای انتخابی: جداسازی و ذخیره یک قطعه، مانند استخراج یک جاریسازی صوتی از یک فایل ویدیویی.
- اشکالزدایی سطح پایین: بررسی نمونههای فردی برای اشکالزدایی خرابی فایل، مشکلات مُهر زمان، یا مشکلات دیگر.
- ساخت پخشکنندههای سفارشی: برای موارد استفاده خاص، ساخت پخشکننده سفارشی با کنترل کامل بر خط لوله رسانه.
نمای کلی
نمونه کد زیر نحوه استفاده از MediaExtractorCompat را نشان میدهد:
کاتلین
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() } }
جاوا
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(); } }