利用MediaMuxer將mp4中音視頻分離需要用到的類有MediaExtractor壹店,MediaFormat,以及主要的MediaMuxer.
MediaExtractor 主要是將mp4文件中的音視頻Track抽出來以供MediaMuxer使用车柠。例如:
MediaExtraor mediaExtraor=new MediaExtraor();
mVideoExtractor.setDataSource(inputFilePath);
for (int i = 0; i < mVideoExtractor.getTrackCount(); i++)
{ String mime = mVideoExtractor.getTrackFormat(i).getString(MediaFormat.KEY_MIME);
????if (mime.startsWith("video/")){
//視頻
mVideoFormat = mVideoExtractor.getTrackFormat(i);
int width = mVideoFormat.getInteger("width");
int height = mVideoFormat.getInteger("height");
video_frame_rate = mVideoFormat.getInteger(MediaFormat.KEY_FRAME_RATE);
long duration = mVideoFormat.getLong("durationUs");
//保存TrackIndex
indexVideo=i;
Log.i("Video", "width" + width + "\theight" + height + "\tduration" + duration + "\tvideo_frame_rate" + video_frame_rate + "\t" + mVideoFormat.toString()); // mVideoExtractor.selectTrack(indexVideo);
} else if (mime.startsWith("audio/")) {
//音頻Track
?}/
}
MeidaFormat 主要是一些存儲一些音視頻信息。例如:
//上面的粗體代碼 = =
mVideoFormat = mVideoExtractor.getTrackFormat(i);
感興趣的可以將獲取到的MediaFormat對象toString()看看洞坑。
下面開始分離視頻的主要代碼
MediaMuxer muxers =null;
try {
//path 輸出文件路徑 format MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4
muxers =new MediaMuxer(path, format);
? ? MediaFormat mediaFormat = mediaExtractor.getTrackFormat(indexVideo);
? ? int video_frame_rate = mediaFormat.getInteger(MediaFormat.KEY_FRAME_RATE);
? ? long size = mediaFormat.getLong("durationUs");
? ? long sum =0;
? ? mediaExtractor.selectTrack(indexVideo);
? ? muxers.addTrack(mediaFormat);
? ? if (muxers !=null) {
muxers.start();
? ? ? ? if (indexVideo != -1) {
MediaCodec.BufferInfo info =new MediaCodec.BufferInfo();
? ? ? ? ? ? info.presentationTimeUs =0;
? ? ? ? ? ? ByteBuffer byteBuffer = ByteBuffer.allocate(100 *1024);
? ? ? ? ? ? while (true) {
int sampleSize = mediaExtractor.readSampleData(byteBuffer, 0);
? ? ? ? ? ? ? ? if (sampleSize <0) {
break;
? ? ? ? ? ? ? ? }
//下一幀
mediaExtractor.advance();
? ? ? ? ? ? ? ? info.offset =0;
? ? ? ? ? ? ? ? info.size = sampleSize;
? ? ? ? ? ? ? ? info.flags = MediaCodec.BUFFER_FLAG_SYNC_FRAME;
? ? ? ? ? ? ? ? info.presentationTimeUs +=1000 *1000 / video_frame_rate;
? ? ? ? ? ? ? ? muxers.writeSampleData(indexVideo, byteBuffer, info);
? ? ? ? ? ? ? ? sum +=1000 *1000 / video_frame_rate;
? ? ? ? ? ? ? ? if (listener !=null) {
//進度顯示 用于回調(diào)呈現(xiàn)UI給用戶
float present = (float) ((sum *100.0) / size);
? ? ? ? ? ? ? ? ? ? listener.onProgress(present);
? ? ? ? ? ? ? ? }
}
}
}
}catch (IOException e) {
e.printStackTrace();
? ? if (listener !=null) {
listener.onFailure(e.getMessage());
? ? }
}
// 釋放MediaMuxer
muxers.stop();
muxers.release();
mediaExtractor.release();