本文共 6320 字,大约阅读时间需要 21 分钟。
MediaExtractor ???????????????????????????????????????
setDataSource ?????????????????getTrackCount() ??????????????video/ ? audio/????????????? selectTrack ???readSampleData ??????????????????advance ??????????release ???????MediaMuxer ??????????????????????????????
addTrack ??????????????????writeSampleData ????????????????release ???????????????????????
bufferInfo ???????? size?offset ? presentationTimeUs????????? presentationTimeUs????????????????presentationTimeUs ???????????????? PTS??????? I ?????MediaFormat ?? FRAME_RATE ???????????????????????? PTS ??????????????
FRAME_RATE?????????????????? 30 ?/?????????? 1000ms / 30 ? 33.333ms????????????
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)public static void trackExtractor(String inPath, String outPath, boolean isVideo) { MediaExtractor mediaExtractor = new MediaExtractor(); try { mediaExtractor.setDataSource(inPath); } catch (IOException e) { e.printStackTrace(); } MediaMuxer mediaMuxer = null; try { mediaMuxer = new MediaMuxer(outPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); } catch (IOException e) { e.printStackTrace(); } int trackIndex = 0; int trackCount = mediaExtractor.getTrackCount(); for (int i = 0; i < trackCount; i++) { MediaFormat trackFormat = mediaExtractor.getTrackFormat(i); String mime = trackFormat.getString(MediaFormat.KEY_MIME); if (mime.startsWith("video/") && isVideo) { trackIndex = mediaMuxer.addTrack(trackFormat); mediaExtractor.selectTrack(i); break; } else if (mime.startsWith("audio/") && !isVideo) { trackIndex = mediaMuxer.addTrack(trackFormat); mediaExtractor.selectTrack(i); break; } } mediaMuxer.start(); ByteBuffer buffer = ByteBuffer.allocate(1024 * 1000); MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); long videoSampleTime = getSampleTime(mediaExtractor, buffer); while (true) { int readSampleDataSize = mediaExtractor.readSampleData(buffer, 0); if (readSampleDataSize < 0) { break; } bufferInfo.size = readSampleDataSize; bufferInfo.offset = 0; bufferInfo.flags = mediaExtractor.getSampleFlags(); bufferInfo.presentationTimeUs += videoSampleTime; mediaMuxer.writeSampleData(trackIndex, buffer, bufferInfo); mediaExtractor.advance(); } mediaExtractor.release(); mediaMuxer.stop(); mediaMuxer.release();} @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)public static void trackMuxer(String videoPath, String audioPath, String outPath) { MediaExtractor videoExtractor = new MediaExtractor(); try { videoExtractor.setDataSource(videoPath); } catch (IOException e) { e.printStackTrace(); } MediaExtractor audioExtractor = new MediaExtractor(); try { audioExtractor.setDataSource(audioPath); } catch (IOException e) { e.printStackTrace(); } MediaMuxer mediaMuxer = null; try { mediaMuxer = new MediaMuxer(outPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); } catch (IOException e) { e.printStackTrace(); } int videoTrackIndex = -1; int audioTrackIndex = -1; MediaFormat videoFormat = null; MediaFormat audioFormat = null; int videoTrackCount = videoExtractor.getTrackCount(); for (int i = 0; i < videoTrackCount; i++) { videoFormat = videoExtractor.getTrackFormat(i); String mime = videoFormat.getString(MediaFormat.KEY_MIME); if (mime.startsWith("video/")) { videoTrackIndex = i; break; } } int audioTrackCount = audioExtractor.getTrackCount(); for (int i = 0; i < audioTrackCount; i++) { audioFormat = audioExtractor.getTrackFormat(i); String mime = audioFormat.getString(MediaFormat.KEY_MIME); if (mime.startsWith("audio/")) { audioTrackIndex = i; break; } } videoExtractor.selectTrack(videoTrackIndex); audioExtractor.selectTrack(audioTrackIndex); MediaCodec.BufferInfo videoBufferInfo = new MediaCodec.BufferInfo(); MediaCodec.BufferInfo audioBufferInfo = new MediaCodec.BufferInfo(); ByteBuffer byteBuffer = ByteBuffer.allocate(1024 * 1000); long videoSampleTime = getSampleTime(videoExtractor, byteBuffer); while (true) { int readVideoSampleSize = videoExtractor.readSampleData(byteBuffer, 0); if (readVideoSampleSize < 0) { break; } videoBufferInfo.size = readVideoSampleSize; videoBufferInfo.presentationTimeUs += videoSampleTime; videoBufferInfo.offset = 0; videoBufferInfo.flags = videoExtractor.getSampleFlags(); mediaMuxer.writeSampleData(videoTrackIndex, byteBuffer, videoBufferInfo); videoExtractor.advance(); } long audioSampleTime = getSampleTime(audioExtractor, byteBuffer); while (true) { int readAudioSampleSize = audioExtractor.readSampleData(byteBuffer, 0); if (readAudioSampleSize < 0) { break; } audioBufferInfo.size = readAudioSampleSize; audioBufferInfo.presentationTimeUs += audioSampleTime; audioBufferInfo.offset = 0; audioBufferInfo.flags = audioExtractor.getSampleFlags(); mediaMuxer.writeSampleData(audioTrackIndex, byteBuffer, audioBufferInfo); audioExtractor.advance(); } mediaMuxer.stop(); mediaMuxer.release(); videoExtractor.release(); audioExtractor.release();} ??????? PTS ??????
private static long getSampleTime(MediaExtractor mediaExtractor, ByteBuffer buffer) { long videoSampleTime; mediaExtractor.readSampleData(buffer, 0); long firstVideoPTS = mediaExtractor.getSampleTime(); mediaExtractor.advance(); mediaExtractor.readSampleData(buffer, 0); long secondVideoPTS = mediaExtractor.getSampleTime(); videoSampleTime = Math.abs(secondVideoPTS - firstVideoPTS); return videoSampleTime;} ????????????????? PTS??????????????
转载地址:http://vcfz.baihongyu.com/