这篇博客应该是相当有分量的博客了。篇幅会比较长,因为内容很多。我尽力的想写的详细,而又不至于繁琐。这之间的程度是很难把握的,话不多说 进入主题。首先,在这之前,需要对几个类,以及他们的方法的有所了解。
视频录制原理
MediaCodec
谷歌对这个类的描述如下,MediaCodec类可用于访问底层媒体编解码器,即编码器/解码器组件。它是Android底层多媒体支持基础架构的一部分(通常与MediaExtractor、MediaSync、MediaMuxer、MediaCrypto、MediaDrm、Image、Surface和AudioTrack一起使用)。重点是 编码解码器,因为系统产生的数据 ,都是原始的数据,需要他进行处理。
原理
下面这张图,只需要粗略看一看,你只需要知道 MediaCodec 有两个ByteBuffer,一个是输入,一个是输出。这也很好理解。毕竟编码解码器,肯定是要你给它旧数据,它编码解码完,还给你一个新数据。两个ByteBuffer 就相当于两个篮子,接受发送数据。
安卓_视频录制原理与实现_内容1.png视频录制实现
返回要用有效数据填充的输入缓冲区的索引,如果当前没有可用的缓冲区,则返回-1。如果timeoutUs == 0,该方法将立即返回;如果timeoutUs < 0,则无限期等待输入缓冲区的可用性;如果timeoutUs > 0,则等待“timeoutUs”微秒。
public int dequeueInputBuffer (long timeoutUs)
这个方法呢,就是返回 输入缓冲区的索引(mediaCodec可以通过索引找到缓冲区)。也就是上面的ByteBuffer。
通过上面的索引,找到输入缓冲区。
public ByteBuffer getInputBuffer (int index)
注意,上面这个是input
返回输出缓冲区队列索引,最多阻塞“timeoutUs”微秒。返回已成功解码的输出缓冲区和INFO_*常量之一的索引。info 就是描述输出缓冲区数据的,例如时间,大小
public int dequeueOutputBuffer (MediaCodec.BufferInfo info, long timeoutUs)
通过上面的索引,找到输出缓冲区。
public ByteBuffer getOutputBuffer (int index)
注意,上面这个是output
释放输出缓冲区 ,这个也好理解,你从输出缓冲区取完数据了,得要把缓冲区清空,放回去,取下一次的数据
public void releaseOutputBuffer (int index, boolean render)
网友评论