کلاس 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) {
throw RuntimeException(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) {
throw new RuntimeException(e);
} finally {
// 3. Release the extractor
extractor.release();
}
}