Untitled
unknown
plain_text
2 years ago
4.8 kB
10
Indexable
public static void mergeVideos(String filePath1, String filePath2, String outputFile) throws IOException {
MediaMuxer mediaMuxer = null;
MediaExtractor videoExtractor1 = new MediaExtractor();
MediaExtractor videoExtractor2 = new MediaExtractor();
try {
mediaMuxer = new MediaMuxer(outputFile, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
// Trích xuất và ghi track video từ video đầu tiên
videoExtractor1.setDataSource(filePath1);
int videoTrackIndex1 = selectTrack(videoExtractor1, "video/");
MediaFormat videoFormat1 = videoExtractor1.getTrackFormat(videoTrackIndex1);
videoExtractor1.selectTrack(videoTrackIndex1);
int muxerVideoTrackIndex1 = mediaMuxer.addTrack(videoFormat1);
// Trích xuất và ghi track audio từ video đầu tiên (nếu có)
int audioTrackIndex1 = selectTrack(videoExtractor1, "audio/");
int muxerAudioTrackIndex1 = -1;
if (audioTrackIndex1 >= 0) {
MediaFormat audioFormat1 = videoExtractor1.getTrackFormat(audioTrackIndex1);
videoExtractor1.selectTrack(audioTrackIndex1);
muxerAudioTrackIndex1 = mediaMuxer.addTrack(audioFormat1);
}
// Trích xuất và ghi track video từ video thứ hai
videoExtractor2.setDataSource(filePath2);
int videoTrackIndex2 = selectTrack(videoExtractor2, "video/");
MediaFormat videoFormat2 = videoExtractor2.getTrackFormat(videoTrackIndex2);
videoExtractor2.selectTrack(videoTrackIndex2);
int muxerVideoTrackIndex2 = mediaMuxer.addTrack(videoFormat2);
// Trích xuất và ghi track audio từ video thứ hai (nếu có)
int audioTrackIndex2 = selectTrack(videoExtractor2, "audio/");
int muxerAudioTrackIndex2 = -1;
if (audioTrackIndex2 >= 0) {
MediaFormat audioFormat2 = videoExtractor2.getTrackFormat(audioTrackIndex2);
videoExtractor2.selectTrack(audioTrackIndex2);
muxerAudioTrackIndex2 = mediaMuxer.addTrack(audioFormat2);
}
mediaMuxer.start();
// Ghi dữ liệu video và audio từ video đầu tiên
long lastVideoPresentationTimeUs = writeSampleData(videoExtractor1, mediaMuxer, muxerVideoTrackIndex1, muxerAudioTrackIndex1, 0);
// Nếu video đầu tiên không có âm thanh, ghi lại thời gian cuối cùng của track video
long lastAudioPresentationTimeUs = (muxerAudioTrackIndex1 >= 0) ? lastVideoPresentationTimeUs : 0;
if (muxerAudioTrackIndex1 >= 0) {
lastAudioPresentationTimeUs = writeSampleData(videoExtractor1, mediaMuxer, muxerVideoTrackIndex1, muxerAudioTrackIndex1, 0);
}
// Ghi dữ liệu video và audio từ video thứ hai
writeSampleData(videoExtractor2, mediaMuxer, muxerVideoTrackIndex2, muxerAudioTrackIndex2, lastVideoPresentationTimeUs);
} finally {
if (mediaMuxer != null) {
try {
mediaMuxer.stop();
mediaMuxer.release();
} catch (Exception e) {
logger.severe(e.toString());
}
}
videoExtractor1.release();
videoExtractor2.release();
}
}
private static long writeSampleData(MediaExtractor extractor, MediaMuxer muxer, int videoTrackIndex, int audioTrackIndex, long startPresentationTimeUs) {
Log.d(TAG, "writeSampleData: check videoindex " + videoTrackIndex);
Log.d(TAG, "writeSampleData: check audioindex " + audioTrackIndex);
int bufferSize = determineBufferSize(extractor, videoTrackIndex);
ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
long lastPresentationTimeUs = startPresentationTimeUs;
while (true) {
bufferInfo.offset = 0;
bufferInfo.size = extractor.readSampleData(buffer, 0);
if (bufferInfo.size < 0) {
Log.d(TAG, "No more samples to read");
bufferInfo.size = 0;
break;
}
bufferInfo.presentationTimeUs = extractor.getSampleTime() + startPresentationTimeUs;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
bufferInfo.flags = mapExtractorFlagsToCodecFlags(extractor.getSampleFlags());
}
int trackIndex = extractor.getSampleTrackIndex();
if (trackIndex == videoTrackIndex) {
muxer.writeSampleData(videoTrackIndex, buffer, bufferInfo);
} else if (trackIndex == audioTrackIndex) {
muxer.writeSampleData(audioTrackIndex, buffer, bufferInfo);
}
lastPresentationTimeUs = bufferInfo.presentationTimeUs;
extractor.advance();
}
return lastPresentationTimeUs;
}
Editor is loading...
Leave a Comment