视频直播类的东西

本文详述了Android平台上视频音频的采集方法,包括Camera2接口的使用、音频采集流程、码率帧率分辨率的概念及设置,以及视频处理、编码、推流和拉流的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 怎么采集视频、音频Android直播中怎么采集视频、音频)?

采集:采集视频的话5.0之前一般用Camera接口,之后用Camera2接口

使用:使用也很简单,通过 HandlerThread类创建一个专门的Hander 类型的线程用于Camera的具体操作。

       在CameraManager中找到一个合适的 Camera 设备,得到设备号。通过 CameraID 得到该设备的各种参数,调用CameraManager的openCamera()方法打开指定摄像头。该方法的第一个参数代表要打开的摄像头ID;第二个参数 callback用于监听摄像头的状态;第三个参数代表执行callback的Handler,如果程序希望直接在当前线程中执行callback,则可将handler参数设为null。

       当摄像头被打开之后,系统就会回CameraDevice.StateCallback 类中的 onOpened方法,在该方法中 APP 可获取 CameraDevice 对象。拿到CameraDevice设备后,调用它的createCaptureRequest(int templateType)方法创建CaptureRequest.Builder对象。CaptureRequest.Builder它主要包括两方面的作用,一是可以把预览或录制的Surface给它,这样每个Surface就可以从Camera拿到采集到的图片原始数据,这是一个典型的观察者模式。二是可以给Camera设备设置自动对焦,光圈大小等Camera设备参数。

传入的templateType参数包括下面三种类型:

TEMPLATE_PREVIEW(预览)

 

TEMPLATE_RECORD(拍摄视频)

 

TEMPLATE_STILL\_CAPTURE(拍照)

       然后调用CameraDevice的createCaptureSession()方法来创建CameraCaptureSession。该方法的第一个参数是一个List集合,封装了所有需要从该摄像头获取图片的Surface;第二个参数 StateCallback用于监听CameraCaptureSession的创建过程;第三个参数代表执行callback的Handler,如果程序希望直接在当前线程中执行callback,则可将handler参数设为null。

      如果 CameraCaptureSession 创建成功,系统会回调 StateCallback 的 onConfigured*方法。在该方法中我们可以拿到创建好的 CameraCaptureSession对象。再调用CameraCaptureSession对象的setRepeatingRequest()方法,向Camera发送命令请求。 第一个参数是由前面的 createCaptureRequest 创建的 CaptureRequest.Builder对象生成的。第二个参数callback就是Camera捕获时的回调对象。第三个参数代表执行callback的Handler,如果程序希望直接在当前线程中执行callback,则可将handler参数设为null。

       通过以上的步骤,就可以从Camera设备中获取到视频了。还可以通过Android的MediaRecorder类将获取到的视频录制下来进行回看。 Camera2 完全采用了异步的架构模式。Android中一般摄像头的格式是NV21或者是NV12,它们都是YUV420sp的一种。Y表示明亮度,也就是灰度值,U和V则表示色度,即影像色彩饱和度,用于指定像素的颜色,一般用libyuv把摄像头的NV21数据转化为YUV420P的标准数据,然后用X264把YUV420P流数据转化为h264数据,从而为推流做准备

音频如何采集? 

在实例化AudioRecord的时候需要指定采集源设定为麦克风,然后指定采样率。我们公司采用兼容性非常强的44100Hz也就是每秒采集44100次,接着是配置音频通道,我们团队采用了AudioFormat.CHANNEL_IN_MONO代表单通道,当然也是支持双通道立体声采集的,只需传入AudioFormat.CHANNEL_IN_STEREO即可,然后再设置采样的数据格式,也就是每个采样值所占空间的大小,我们选择了16位也就是2byte,最后再配置上缓冲器大小,这个值一般不是写死的可以通过AudioRecord.getMinBufferSize 来获取一个最小值。 接着只需要调用 AudioRecord.read 即可获取采集到的 PCM 音频。PCM就是咱们的原始音频,可以做各种处理,如果做直播,就是fdc-aac吧PCM搞成AAC。

码率是什么?

码率:影响体积,与体积成正比(码率越大,体积越大;码率越小,体积越小)。

       码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。也就是取样率(并不等同与采样率,采样率的单位是Hz,表示每秒采样的次数),单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍生出来cbr(固定码率)与vbr(可变码率),“码率”就是失真度,码率越高越清晰,反之则画面粗糙而多马赛克。码率计算公式: 码率=采样率 x 位深度 x 声道,文件大小(kb) = 码率 x 时长,我们公司一般设置目标码率为1200Kbps、最小码率为400Kbps、初始码率900Kbps。

帧率是什么?

帧率:影响画面流畅度,与画面流畅度成正比(帧率越大,画面越流畅;帧率越小,画面越有跳动感)。

       帧率就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,如果码率为变量,则帧率也会影响体积,帧率越高,每秒钟经过的画面越多,需要的码率也越高,体积也越大。

分辨率是什么?

分辨率:影响图像大小,与图像大小成正比(分辨率越高,图像越大;分辨率越低,图像越小。)

不同分辨率我们公司设置的码率也不同:

360p 800 200 600

480p 1000 300 700

540p 1200 400 900 (主流)

720p 1500 600 1200

怎么处理视频?

GPUImage、OpenGL

阿里SDK

七牛SDK

怎么推流?

用FFMpeg写推流器推流

用阿里SDK推流

用七牛SDK推流

       用FFMpeg写推流器推流实际就是通过JNI调用FFMpge的native函数,initRtmpData初始化RMTP,建立RTMP与RTMP服务器连接,sendRtmpVideoSpsPPS发送SPS,PPS数据,包括长度、数据、时间戳。H.264码流中 SPS是序列参数集Sequence Parameter Set,H.264码流中 PPS是图像参数集Picture Parameter Set,之后sendRtmpVideoData发送视频数据。

     sendRtmpAudioSpec发送AAC Sequence HEAD 头数据,sendRtmpAudioData发送AAC音频数据,releaseRtmp释放链接,用阿里SDK写推流其实就是用户APP向APPServer发起请求,获取推流URL。AppServer根据规则拼接推流URL返回给APP。APP赋值推流URL到推流SDK,使用推流SDK发起推流。推流SDK将直播流推送到CDN。

     具体我们可以先初始化AlivcLivePushConfig配置推流数据,mAlivcLivePushConfig.setResolution设置分辨率,我们公司随主流直播配置,设置分辨率为540P,当然阿里SDK最大支持720P,mAlivcLivePushConfig.setEnableBitrateControl设置码率自适应,也可以不设置,因为默认true,千万别搞成false,当然我们可以设置QM_RESOLUTION_FIRST 清晰度优先模式或者QM_FLUENCY_FIRST 流畅度优先模式,mAlivcLivePushConfig.setEnableAutoResolution分辨率自适应默认false,这个千万别搞成true,基本上所有的播放器都会卡死,不过阿里云播放器可以适配这种模式,mAlivcLivePushConfig.setAudioProfile 设置音频编码格式,我们公司用的AAC当然还有一些其他设置比如mAlivcLivePushConfig.setPreviewOrientation可以可设置home键向左或向右横屏默认为竖屏。

   当然了,人脸识别和美颜阿里SDK也封进去了:

mAlivcLivePusher.setCustomDetect回调人脸识别

mAlivcLivePusher.setCustomFilter回调美颜

mAlivcLivePushConfig.setBeautyLevel还可以开启高级美颜开启之后就可以用

mAlivcLivePushConfig.setBeautyBigEye()设置大眼模式

mAlivcLivePushConfig.setBeautyWhite()设置美白什么的,数值都是0-100

我们公司还做了图片推流配置:

mAlivcLivePushConfig.setPausePushImage在图片上提醒用户“主播离开片刻,稍后回来”。

mAlivcLivePushConfig.setNetworkPoorPushImage还有网络较差的时候的静态占位图

mAlivcLivePushConfig.addWaterMark(waterPath, X, Y, 宽)添加水印图片

      我们公司还支持手机外接设备直播,有些设备摄像头的连续对焦支持不好,这就需要sdk提供传感器感应移动实时对焦mAlivcLivePushConfig.setFocusBySensor(true);还设置了摄像头旋转角度,设置完就可以使用AlivcLivePusher推流器开始推流了

mAlivcLivePusher.init();初始化

mAlivcLivePusher.startPush(mPushUrl);开始推流

        我们公司还有录屏直播,就是直播手机操作,mAlivcLivePushConfig.setMediaProjectionPermissionResultData(resultData)开启权限就可以用MediaProjection录屏了,如果是直播游戏还可以通过

mAlivcLivePusher.startCameraMix(x, y, w, h);//开启摄像头混流

mAlivcLivePusher.stopCameraMix();//停止摄像头混流

       期间还遇到一个问题,就是上线之后,突然各种推流中断,因为我们的推流URL中带有auth_key,阿里对URL做校验了直接给中断了,后来我们在onPushURLAuthenticationOverdue这个回调中传了新的URL,七牛的SDK与阿里大致相仿,之前也做过。

怎样拉流?

基于FFMpgeijkplayer直接给URL播放

阿里SDK直接给URL

七牛SDK直接给URL

当然还要考虑到画面预览模式、播放控制器、播放器参数、生命周期监控、断流错误信息反馈

怎么编码、解码?

可以参考:           编码和封装

 

后续会继续补充~~~

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值