کلاس MediaExtractorCompat جایگزینی برای کلاس MediaExtractor پلتفرم است و APIها و عملکردهای یکسانی را ارائه میدهد. این کلاس استخراج دادههای رسانهای demux شده، معمولاً کدگذاری شده، را از یک منبع داده تسهیل میکند.
این ابزار یک فایل کانتینر (مانند 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(); } }