上篇文章,通过 MediaProjectionManager 结合 MediaRecorder 进行录屏并生成视频文件。新版本需求产品提了个:视频增加背景音乐,音频文件内置在 Apk 中。那么,怎么生成带音频的视频呢?
通过调研发现,在用 MediaPlayer 进行录屏时,可以添加音频源,但是基本是使用麦克风录音,无法指定音频文件。代码如下:
1 | /** |
使用此种方案,通过代码mMediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC)
指定麦克风音频源。可以在录屏开始时,使用 MediaPlayer 进行音乐播放,那么麦克风就可以录入音频了,可是如果此时背景很嘈杂,或者有人说话也会给录进去,需求是只能包含音频文件里的音频,不能有其他的声音,所以此种方案不可行。
所以换个思路:将无声视频与音频进行合成,生成一个有声视频。
调研了一波,发现了可用的代码,整理如下:
1 | /** |
注意代码中的videoSampleTime,如果不加这个,代码在部分机型上会合成失败。
这里重点关注下
bufferInfo.presentationTimeUs = mediaExtractor.getSampleTime()
因为mediaExtractor的提取顺序应该是dts的顺序不是pts的顺序,如果视频中存在b帧则getSampleTime不可能递增的,所以bufferInfo.presentationTimeUs=mediaExtractor.getSampleTime()可能会报错,前面说了这个值必须递增。如果不存在b帧,pts==dts,使用没问题。
参考: