Android-音视频(8):完成音频和视频的混合录制

1.介绍


之前我们介绍了音频的录制用到了AudioRecord,视频的预览及返回数据用到了Camera,混合器是用到了MediaMuxer,编解码器是用到了MediaCodec

但是之前的内容都是分开测试的,这一次,我们将用这些东西完成对音频和视频的混合录制,并生成mp4文件。

其实这一次综合运用虽然成功了,代码也能运行。但是有一个废弃的demo却在测试的时候闪退,并没有成功运行,也没有找到原因。所以这篇文章就只记录了这个成功的例子。闪退的例子代码并没有写入这里。

2.思路及流程说明


录制一个音视频文件肯定需要音频数据和视频数据来源,有了数据来源后需要经过编码,将编码后的音频和视频数据需要送给混合器混合生成文件(且在混合之前需要把音频和视频轨道都添加之后,才能开始混合)。

代码中有3个线程类:

MediaMuxerThread :混合器线程

VideoEncoderThread:视频数据编码线程

AudioEncoderTread:音频数据编码线程

流程介绍:

  1. MediaMuxerThread 中 MediaMuxer 混合器初始化,但是未开始混合。等待轨道添加。
  2. MainActivity 中的 Camera 开启并回调视频数据,VideoEncoderThread 用容器存起来这个数据,然后While循环取数据开始编码,并且让 MediaMuxer 混合器记录视频轨道。此时并没有把编码好的数据送到MediaMuxerThread的容器存储。
  3. AudioEncoderTread中 AudioRecord回调音频数据,然后While循环每audioRecord.read(buf,size)读取到数据,就开始编码,并且让MediaMuxer混合器记录音频轨道。此时并没有把编码好的数据送到MediaMuxerThread的容器存储。
  4. 如果音频和视频轨道都添加成功了,MediaMuxer就开启混合
  5. 如果在VideoEncoderThread和AudioEncoderThread的While循环中,检测到MediaMuxer已经开启了混合,此时,两个循环中就会各自把编码好的数据送到MediaMuxerThread的容器存储。
  6. MediaMuxerThread中的While循环检测到混合数据不为空,就会循环取数据开始混合。最终生成文件myav.mp4
  • 视频的数据帧格式为NV21,在编码之前会转化为NV12,然后再编码为avc格式。
  • 音频的数据帧格式为pcm-16bit,编码后为aac(代码中为mp4a-latm,aac的一种)格式。

注意点:

因为牵涉多线程间的数据传输,所以要用到线程安全类和一些同步符号。

3.代码


https://github.com/520xchly/TestToMp4

猜你喜欢

转载自blog.csdn.net/qq_38261174/article/details/82947055