当前位置:网站首页> 开发 > 多媒体 > 浏览文章

如何在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();
    }
}

在这个视频解码器中,

相关内容