美文网首页
Android WebRTC开发中的音视频采集

Android WebRTC开发中的音视频采集

作者: dora丶Android | 来源:发表于2018-09-15 04:21 被阅读0次

语音通话和视频通话,我的实现方式是使用WebRTC。WebRTC它是基于P2P的一项技术。

底层封装了UDP/IP协议栈。UDP是不可靠的协议,它和TCP不同的是,不会对数据包进行排序和校对。这样就导致了UDP可能会丢包,但是UDP的性能是要高于TCP的。正因为如此,才会成为WebRTC的首选,但不是唯一。TURN则是使用了TCP/IP协议栈。人的大脑一秒种播放大于等于24帧画面就不会感觉到卡顿,所以如果是30帧的帧频,一秒钟丢1~5帧人脑很难感觉到。因此实时获取到最新的数据,比保证数据的完整性更为重要。顺便说一下,Android4.0(代号Ice Cream Sandwich)以后的浏览器都默认启用了WebRTC,且能够与其他基于WebRTC的程序互相通信。要实现语音通话和视频通话,首先就要对音视频数据进行采集。音频采集来自麦克风,视频采集来自摄像头。我们先不急于弄清楚怎么实现采集。我们最好先做下接口的设计。不管是音频还是视频的采集,整个流程如下,首先开始采集(Start collecting),然后有可能有暂停采集(Pause collecting),有暂停就会有继续采集(Resume collecting),最后还有停止采集(Stop collecting)。我们定义一个接口Collector,专门用来采集数据。

Android WebRTC开发中的音视频采集

接下来我们完成实现类。

音频采集器

Android WebRTC开发中的音视频采集

视频采集器

Android WebRTC开发中的音视频采集

下面我们具体实现Android平台的音频采集。我使用的是android.media.AudioRecord这个类。这个类扯出来一个android.media.AudioParam类,音频参数。

通过AudioRecord.getMinBufferSize(int,int,int)方法来获取最小缓冲区的大小。

Android WebRTC开发中的音视频采集

int sampleRateInHz:采样率(单位赫兹hz)

int channelConfig:通道配置

int audioFormat:音频格式

sampleRateInHz,第一个参数,采样率主流的是44.1khz,所以我们就使用44100。

channelConfig,第二个参数,如果是1个声道,我们就用AudioFormat.CHANNEL_IN_MONO(单声道),如果大于等于2个声道,我们就用AudioFormat.CHANNEL_IN_STEREO(立体声)。

AudioFormat我们使用AudioFormat.ENCODING_PCM_16BIT。

audioFormat,第三个参数,可以使用AudioFormat.ENCODING_PCM_16BIT。

拿到了最小缓冲区的大小后,我们开始构建AudioRecord对象了。

Android WebRTC开发中的音视频采集

接下来我们就正式开始录音了。音频录制肯定在子线程,不能阻塞主线程,造成主线程卡顿。

Android WebRTC开发中的音视频采集

接下来我们实现Android平台视频的采集。视频录制Android不允许没有预览界面的视频录制,所以

我们要进行视频数据的采集,就必须要写一个SurfaceView,我们重点实现视频的采集过程,所以界面布局暂且忽略。我们只需要通过surfaceView.getHolder(),就可以拿到SurfaceView的助手类SurfaceHolder就可以完成控制了。

Android WebRTC开发中的音视频采集

给holder添加回调准备工作就全都做好了。

下面我们考虑下录制的问题。我们首先需要打开摄像头,摄像头安卓手机定义了前置和后置摄像头。我们还需要界面的预览,我们定义两个方法,startPreview()和stopPreview()。

//开始预览

private void startPreview(){

try{

mCamera = Camera.open(0);//0代表后置摄像头,1代表前置摄像头

mCamera.setPreviewDisplay(holder);

//获取预览图像数据,*4代表使用RGB8888,也就是用4个字节表示一个像素点,还有

什么RGB565、RGB444等等

buffers = new byte[videoParams.getWidth() * videoParam.getHeight()*4]

mCamera.addCallbackBuffer(buffers);//重点,调用此方法,才会开始第一次回调数据接收,本类实现了PreviewCallback接口

mCamera.setPreviewCallbackWithBuffer(this);

mCamera.startPreview();

}catch(IOException e){

e.printStackTrace();

}

}

PreviewCallback接口的回调函数

@Override

public void onPreviewFrame(byte[] data, Camera camera){

if(mCamera != null){

mCamera.addCallbackBuffer(buffers);//再触发下一次回调,这样才能不断地接收到数据

}

if(isRecording){

//TO DO 在这里调用native的编码方法,讲视频像素数据进行编码操作

}

}

现在我们已经完成了音频和视频录制的全过程,可以进入到下一步,编码操作了。

相关文章

网友评论

      本文标题:Android WebRTC开发中的音视频采集

      本文链接:https://www.haomeiwen.com/subject/lnczgftx.html