一、前言
最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐方式,但是作为一个高技术的,我们除了看看,更重要的是学习技术,其实Android中的视频技术没什么说的,因为网上的资料很多,但是之前的视频技术大部分都出现在了视频播放,就是主流的视频播放器,那个最重要的一个技术就是视频的编解码,这个也会在后续文章中详细介绍视频的处理技术。但是现在直播的技术是在之前的视频技术上又有了一个要求就是视频录制,现在录制很多是借助于牛逼的硬件摄像头。但是除了这个技术,还有其他的我们使用移动设备也可以去解决这个问题。这个后续也会说道如何使用设备去录制视频。
二、知识概要
从这篇文章开始我们就来介绍一下关于Android中的视频处理,这里主要包括:Android中的摄像头技术,录制视频,视频播放器等知识点,本篇文章是介绍大体的知识点,为后续的章节知识点做铺垫,其实以前在学习Android中最怕就是图片和视频处理方面的技术,因为这些技术有一个基本的要求就是字节操作,考虑很多字节流处理,这个在Android中有一个类ByteBuffer,这个类将会贯穿我们后续所有章节的知识点,这个类也是我们下一篇文章的中点,在视频流处理中这个类将不可或缺的。
下面我们先来看一张Android中视频的处理大纲图解:
这张图片太大了,如果看的不够清楚可以下载,然后放大查看。下面就来一一介绍这张图中涉及到的知识点:
三、知识结构
第一、视频编码
Android中视频编码有两种方式,主要是两个核心的类,一个是MediaCodec和MediaRecorder,这两个类有什么区别呢?其实很好理解,他们都可以对视频进行编码,但是唯一不同的是MediaCodec更偏向原生,而MediaRecorder偏向的上层封装。
1、MediaCodec类
MediaCodec可以处理具体的视频流,主要有这几个方法:
getInputBuffers:获取需要编码数据的输入流队列,返回的是一个ByteBuffer数组
queueInputBuffer:输入流入队列
dequeueInputBuffer:从输入流队列中取数据进行编码操作
getOutputBuffers:获取编解码之后的数据输出流队列,返回的是一个ByteBuffer数组
dequeueOutputBuffer:从输出队列中取出编码操作之后的数据
releaseOutputBuffer:处理完成,释放ByteBuffer数据
看如下图:
这里看到:
视频流有一个输入队列,和输出队列,分别对应getInputBuffers和getOutputBuffers这两个方法获取这个队列,然后对于输入流这端有两个方法一个是queueInputBuffers是将视频流入队列,dequeueInputBuffer是从输入流队列中取出数据进行编解码操作,在输出端这边有一个dequeueOutputBuffer方法从输出队列中获取视频数据,releaseOutputBuffers方法将处理完的输出视频流数据ByteBuffer放回视频流输出队列中,再次循环使用。这样视频流输入端和输出端分别对应一个ByteBuffer队列,这些ByteBuffer可以重复使用,在处理完数据之后再放回去即可。
所以这里看到MediaCodec类处理视频的时候可以接触到视频流数据的,这里比如我们如果有一些特殊需求,比如视频的叠加技术,添加字幕等就可以在这里处理了。同时MediaCodec有一个方法:createInputSurface可以设置视频源输入Surface类型,同时也是可以通过configure方法设置视频输出Surface类型。
2、MediaRecorder类
MediaRecorder这个类相对于MediaCodec简单,因为他封装的很好,直接就是几个接口来完成视频录制,比如视频的编码格式,视频的保存路劲,视频来源等,用法简单,但是有一个问题就是不能接触到视频流数据了,处理不了原生的视频数据了。这个也是他和MediaCodec最大的区别,他完成不了视频的叠加技术的。
注意:
关于MediaRecorder这个类,其实他和Android中的一个命令是相对应的,就是:adb screenrecord。这个类还有一个地方需要注意的就是他有一个方法:setVideoSource,可以设置视频来源,代码后续文章会介绍,主要就两个来源:一个是来自于设备的摄像头Camera,一个是来自于Surfaceÿ