Untitled

 avatar
unknown
plain_text
5 months ago
2.5 kB
4
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