MediaExtractorCompat 類別可直接取代平台的 MediaExtractor 類別,並提供相同的 API 和功能。可從資料來源擷取通常經過編碼的解多工媒體資料。
這項工具會將容器檔案 (例如 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) {
throw RuntimeException(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) {
throw new RuntimeException(e);
} finally {
// 3. Release the extractor
extractor.release();
}
}