刚刚实现了音视频合成的需求,趁热打铁记录一下遇到的问题
需求描述:
将给定的音频及视频合成一个视频,如果音频时长小于视频,则重复播放;如果大于视频时长则截取到视频结束。
采用的是MediaMuxer、MediaCodec原生方案。
MediaCodec主要处理音频格式的问题,音频可能有mp3 m4a等一些格式,解析得到的音频编码有一个是安卓不支持的编码格式,如audio/mpeg,添加音轨时就会抛出异常。所以这里统一用MediaCodec解析成audio/aac格式,解析方法参考了网上的解析
/**** @param audioPath* @param audioStartTimeUs -1 表示不截取* @param audioEndTimeUs -1 表示不截取* @return*/public String audioToAAC(String audioPath,long audioStartTimeUs,long audioEndTimeUs){long a=System.currentTimeMillis();int audioExtractorTrackIndex=-1;int audioMuxerTrackIndex=-1;int channelCount=1;int sourceSampleRate = 0;String newAudioAAc = "";long sourceDuration=0;try {File tempFlie = new File(audioPath);String tempName = tempFlie.getName();String suffix = tempName.substring(tempName.lastIndexOf(".") + 1);
// newAudioAAc= tempFlie.getParentFile().getAbsolutePath() + "/" + tempName.replace(suffix, "aac");newAudioAAc= Objects.requireNonNull(tempFlie.getParentFile()).getAbsolutePath() + "/" + tempName.replace(suffix, "aac");
// muxer = new MediaMuxer(newAudioAAc, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);Log.i(TAG,"audioPath=="+audioPath+",newAudioAAC=="+newAudioAAc+",newAudioAAc=="+newAudioAAc);//音频信息获取MediaExtractor audioExtractor = new MediaExtractor();audioExtractor.setDataSource(audioPath);int trackCount = audioExtractor.getTrackCount();MediaFormat sourceFormat=null;String sourceMimeType="";int timeOutUs=300;for (int i = 0; i < trackCount; i++) {sourceFormat = audioExtractor.getTrackFormat(i);sourceMimeType = sourceFormat.getString(MediaFormat.KEY_MIME);channelCount=sourceFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT);sourceSampleRate = sourceFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);sourceDuration = sourceFormat.getLong(MediaFormat.KEY_DURATION);if (sourceMimeType.startsWith("audio/")) { //找到音轨Log.i(TAG,"sourceMimeType=="+sourceMimeType+",channelCount=="+chann