如何在Android应用程序中实现视频分辨率调整[页3]
来源:
时间: 2023-08-23
阅读:
scssprivate void decodeVideo(String videoPath, Surface surface, int targetWidth, int targetHeight) {
try {
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(videoPath);
MediaFormat format = null;
int videoTrackIndex = -1;
for (int i = 0; i < extractor.getTrackCount(); i++) {
format = extractor.getTrackFormat(i);
String mimeType = format.getString(MediaFormat.KEY_MIME);
if (mimeType.startsWith("video/")) {
videoTrackIndex = i;
break;
}
}
if (videoTrackIndex == -1) {
throw new RuntimeException("No video track found in " + videoPath);
}
extractor.selectTrack(videoTrackIndex);
MediaCodec decoder = MediaCodec.createDecoderByType(format.getString(MediaFormat.KEY_MIME));
decoder.configure(format, surface, null, 0);
decoder.start();
ByteBuffer[] inputBuffers = decoder.getInputBuffers();
ByteBuffer[] outputBuffers = decoder.getOutputBuffers();
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
long startTimeUs = -1;
while (true) {
int inputIndex = decoder.dequeueInputBuffer(10000);
if (inputIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputIndex];
int sampleSize = extractor.readSampleData(inputBuffer, 0);
if (sampleSize >= 0) {
long presentationTimeUs = extractor.getSampleTime();
decoder.queueInputBuffer(inputIndex, 0, sampleSize, presentationTimeUs, 0);
extractor.advance();
} else {
decoder.queueInputBuffer(inputIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
break;
}
}
int outputIndex = decoder.dequeueOutputBuffer(bufferInfo, 10000);
if (outputIndex == MediaCodec.INFO_TRY_AGAIN_LATER) {
continue;
} else if (outputIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
MediaFormat newFormat = decoder.getOutputFormat();
} else if (outputIndex >= 0) {
ByteBuffer outputBuffer = outputBuffers[outputIndex];
if (startTimeUs == -1) {
startTimeUs = bufferInfo.presentationTimeUs;
}
outputBuffer.position(bufferInfo.offset);
outputBuffer.limit(bufferInfo.offset + bufferInfo.size);
// 在这里进行视频分辨率调整
adjustVideoResolution(outputBuffer, targetWidth, targetHeight);
decoder.releaseOutputBuffer(outputIndex, true);
if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
break;
}
}
}
decoder.stop();
decoder.release();
extractor.release();
} catch (IOException e) {
e.printStackTrace();
}
}
在这个视频解码器中,