在Android Q中,可以使用MediaMuxer类来合并音频和视频文件。以下是一个示例代码:
import android.media.MediaCodec;
import android.media.MediaExtractor;
import android.media.MediaFormat;
import android.media.MediaMuxer;
import java.io.IOException;
public class MediaUtils {
public static void mergeAudioVideo(String audioPath, String videoPath, String outputPath) {
MediaMuxer mediaMuxer = null;
MediaExtractor audioExtractor = null;
MediaExtractor videoExtractor = null;
try {
mediaMuxer = new MediaMuxer(outputPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
// Extract audio data
audioExtractor = new MediaExtractor();
audioExtractor.setDataSource(audioPath);
int audioTrackIndex = selectTrack(audioExtractor, "audio/");
audioExtractor.selectTrack(audioTrackIndex);
MediaFormat audioFormat = audioExtractor.getTrackFormat(audioTrackIndex);
int audioTrack = mediaMuxer.addTrack(audioFormat);
// Extract video data
videoExtractor = new MediaExtractor();
videoExtractor.setDataSource(videoPath);
int videoTrackIndex = selectTrack(videoExtractor, "video/");
videoExtractor.selectTrack(videoTrackIndex);
MediaFormat videoFormat = videoExtractor.getTrackFormat(videoTrackIndex);
int videoTrack = mediaMuxer.addTrack(videoFormat);
mediaMuxer.start();
// Write audio data
ByteBuffer buffer = ByteBuffer.allocate(64 * 1024);
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
bufferInfo.presentationTimeUs = 0;
while (true) {
int sampleSize = audioExtractor.readSampleData(buffer, 0);
if (sampleSize < 0) {
break;
}
bufferInfo.offset = 0;
bufferInfo.size = sampleSize;
bufferInfo.flags = audioExtractor.getSampleFlags();
bufferInfo.presentationTimeUs = audioExtractor.getSampleTime();
mediaMuxer.writeSampleData(audioTrack, buffer, bufferInfo);
audioExtractor.advance();
}
// Write video data
buffer.clear();
bufferInfo = new MediaCodec.BufferInfo();
bufferInfo.presentationTimeUs = 0;
while (true) {
int sampleSize = videoExtractor.readSampleData(buffer, 0);
if (sampleSize < 0) {
break;
}
bufferInfo.offset = 0;
bufferInfo.size = sampleSize;
bufferInfo.flags = videoExtractor.getSampleFlags();
bufferInfo.presentationTimeUs = videoExtractor.getSampleTime();
mediaMuxer.writeSampleData(videoTrack, buffer, bufferInfo);
videoExtractor.advance();
}
mediaMuxer.stop();
mediaMuxer.release();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (audioExtractor != null) {
audioExtractor.release();
}
if (videoExtractor != null) {
videoExtractor.release();
}
if (mediaMuxer != null) {
mediaMuxer.release();
}
}
}
private static int selectTrack(MediaExtractor extractor, String mimeType) {
int numTracks = extractor.getTrackCount();
for (int i = 0; i < numTracks; i++) {
MediaFormat format = extractor.getTrackFormat(i);
if (format.getString(MediaFormat.KEY_MIME).startsWith(mimeType)) {
return i;
}
}
return -1;
}
}
使用上述示例代码,你可以调用mergeAudioVideo
方法来合并音频和视频文件。其中,audioPath
是音频文件的路径,videoPath
是视频文件的路径,outputPath
是合并后的文件输出路径。