Untitled
unknown
plain_text
a year ago
2.5 kB
5
Indexable
try {
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(videoPath);
extractor.selectTrack(batch.videoTrackIndex);
extractor.seekTo(batch.startTimeUs, MediaExtractor.SEEK_TO_PREVIOUS_SYNC);
MediaFormat format = extractor.getTrackFormat(batch.videoTrackIndex);
String mimeType = format.getString(MediaFormat.KEY_MIME);
MediaCodec codec = MediaCodec.createDecoderByType(mimeType);
codec.configure(format, null, null, 0);
codec.start();
ByteBuffer inputBuffer = ByteBuffer.allocateDirect(format.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE));
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
File batchDir = new File(OUTPUT_DIR, "result");
if (!batchDir.exists()) batchDir.mkdirs();
while (true) {
int sampleSize = extractor.readSampleData(inputBuffer, 0);
long sampleTime = extractor.getSampleTime();
if (sampleSize < 0 || sampleTime >= batch.endTimeUs) {
break;
}
int inputIndex = codec.dequeueInputBuffer(10000);
if (inputIndex >= 0) {
ByteBuffer codecInputBuffer = codec.getInputBuffer(inputIndex);
if (codecInputBuffer != null) {
codecInputBuffer.put(inputBuffer);
}
codec.queueInputBuffer(inputIndex, 0, sampleSize, sampleTime, 0);
extractor.advance();
}
int outputIndex = codec.dequeueOutputBuffer(bufferInfo, 10000);
while (outputIndex >= 0) {
ByteBuffer outputBuffer = codec.getOutputBuffer(outputIndex);
if (outputBuffer != null) {
saveFrameToCache(outputBuffer, bufferInfo, batchDir);
}
codec.releaseOutputBuffer(outputIndex, false);
outputIndex = codec.dequeueOutputBuffer(bufferInfo, 10000);
}
}
extractor.release();
codec.stop();
codec.release();
} catch (Exception e) {
e.printStackTrace();
}Editor is loading...
Leave a Comment