android rtmp推流直播学习(一)----视频采集
16lz
2022-07-08
android直播离不开源数据采集,在此就对于视频采集的方法稍作记录
1.权限
android 开启视频采集需要摄像头权限
同事需要声明依赖的外部的硬件或软件,使用摄像头时必须开启设备的摄像头
所以需要配置:
2.初始化Camera
Camera是android获取摄像头源数据的类,使用方式
a.初始化:
Camera mCamera = Camera.open();
打开Camera 的方法有两种方式,一种是无参的Camera.open(),有源码:
public static Camera open() { int numberOfCameras = getNumberOfCameras(); CameraInfo cameraInfo = new CameraInfo(); for (int i = 0; i < numberOfCameras; i++) { getCameraInfo(i, cameraInfo); if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) { return new Camera(i); } } return null; }
可以看出默认是初始化后置摄像头,如果检测不到后置摄像头,初始化失败
另一种是传入设想头参数:
CameraInfo.CAMERA_FACING_BACK //后置摄像头CameraInfo.CAMERA_FACING_FRONT//前置摄像头
b.设置摄像头采集分辨率
现获取相机参数设置生效类
Camera.Parameters parameters = mCamera.getParameters();
设置采集分辨率
parameters.setPreviewSize(int width, int height)
这里需要注意,分辨率的宽高不是随便设置的,只能设置此机器支持的分辨率,如何获取此机器的分辨率:
List sizes = parameters.getSupportedPreviewSizes(); for(Camera.Size size :sizes){ int width = size.width; int height = size.height; }
c.设置视频采集格式
android视频采集格式一般为nv21,及yuv420sp,方便转换成可编码的yuv420p格式数据,两者的差别可查看:http://www.jianshu.com/p/7dcaec0b2286
设置方法:
parameters.setPreviewFormat(ImageFormat.NV21);
将设置的相机参数生效:
mCamera.setParameters(parameters);
d.旋转查看
当设置SurfaceHolder查看摄像头图像时会发现采集的摄像头数据是旋转过得
Screenshot_2017-11-02-17-59-38-53.png此时想要以采集的角度正确查看需要旋转:
private static void setCameraDisplayOrientation(Activity activity, int cameraId, Camera camera) { Camera.CameraInfo info = new Camera.CameraInfo(); Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay() .getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); }
SurfaceHolder设置方式:
mCamera.setPreviewDisplay(SurfaceHolder holder)
e.获取采集数据接口
mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] bytes, Camera camera) { } });
源数据将通过此接口获取
f.开启摄像头
当前面的参数都设置完后,通过此方法开启摄像头:
mCamera.startPreview();
Screenshot_2017-11-02-18-02-21-79.png 软编码+硬编码+ffmpeg+rtmp推流demo
更多相关文章
- android EditText设置不可写
- android“设置”里的版本号
- 在Fragment中设置控件点击方法,执行失败。
- Android(安卓)闹钟管理类的使用
- Android设置通知栏/状态栏透明改变通知栏颜色和app最上部分颜色
- android 设置中划线 下划线等
- Andorid Dialog 示例【慢慢更新】
- android图表ichartjs
- Android(安卓)闹钟管理类的使用