ffmpeg摄像头Android,Android平台下使用FFmpeg进行RTMP推流(摄像头推流)

简介

今天要给大家介绍如何在Android平台下获取采集的图像,并进行编码推流。同时项目工程也是在之前的代码基础上新增功能

ffmpeg摄像头Android,Android平台下使用FFmpeg进行RTMP推流(摄像头推流)_第1张图片

QQ截图20171124114855.png

打开摄像头并设置参数

具体代码查看CameraActivity.java

private Camera getCamera() {

Camera camera;

try {

//打开相机,默认为后置,可以根据摄像头ID来指定打开前置还是后置

camera = Camera.open(1);

if (camera != null && !isPreview) {

try {

Camera.Parameters parameters = camera.getParameters();

//对拍照参数进行设置

for (Camera.Size size : parameters.getSupportedPictureSizes()) {

LogUtils.d(size.width + " " + size.height);

}

LogUtils.d("============");

for (Camera.Size size : parameters.getSupportedPreviewSizes()) {

LogUtils.d(size.width + " " + size.height);

}

parameters.setPreviewSize(screenWidth, screenHeight); // 设置预览照片的大小

parameters.setPreviewFpsRange(30000, 30000);

parameters.setPictureFormat(ImageFormat.NV21); // 设置图片格式

parameters.setPictureSize(screenWidth, screenHeight); // 设置照片的大小

camera.setParameters(parameters);

//指定使用哪个SurfaceView来显示预览图片

camera.setPreviewDisplay(sv.getHolder()); // 通过SurfaceView显示取景画面

camera.setPreviewCallback(new StreamIt()); // 设置回调的类

camera.startPreview(); // 开始预览

//Camera.takePicture()方法进行拍照

camera.autoFocus(null); // 自动对焦

} catch (Exception e) {

e.printStackTrace();

}

isPreview = true;

}

} catch (Exception e) {

camera = null;

e.printStackTrace();

Toast.makeText(this, "无法获取前置摄像头", Toast.LENGTH_LONG);

}

return camera;

}

Camera.open(int cameraId)

这里是创建一个Camera对象对应具体的硬件摄像头,如果摄像头已经被其他app打开,就会抛出RuntimeException异常。

cameraId是camera的Id。我们可以通过getNumberOfCameras()

获取摄像头的数量,那id的范围就是0~(getNumberOfCameras()-1)。一般情况下传0就直接获取到后置摄像头,1就获取到前置摄像头。当然有些设备可能有些不同。

Camera.Parameters

这个类用于存储和设置摄像头的参数信息,当然Camera有很多默认参数,所以我们只需要通过camera.getParameters()获取该对象,然后并设置我们需要修改的属性即可。我们看一些常见的属性设置

setPreviewSize

设置预览图像的大小

setPictureSize

设置照片的大小

setPreviewFpsRange

设置Fps,帧率。但我发现并没有什么卵用。每次修改后采集的频率还是没变,擦!

setPictureFormat

设置采集到图像的像素格式,Android推荐NV21。那我们就用这个,这个参数很重要,后面编码我们会详细讲解。

最后不要忘了调用setParameters进行设置。否则你就白忙活了。

预览和获取采集图像数据预览

第一个问题,用什么来承载预览图像。Android提供了SurfaceView和GLSurfaceView。这里为了方便大家上手,我们先选择使用SurfaceView稍微简单一点,对SurfaceView大家不熟的可以查找相关资料。接下来就是使用SurfaceView

布局中添加SurfaceView。这里我做了一个继承类MySurfaceView

获取SurfaceHolder并设置回调

SurfaceView里有一个SurfaceHolder用来控制SurfaceView的相关操作。比如设置SurfaceView的Callback,用来监听SurfaceView的创建,变化和销毁。这里只需要实现SurfaceHolder.Callback的接口

@Override public void surfaceCreated(SurfaceHolder holder) { setStartPreview(mCamera, mHolder); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { setStartPreview(mCamera, mHolder); } @Override public void surfaceDestroyed(SurfaceHolder holder) { releaseCamera(); }

然后设置到SurfaceHolder中mHolder.addCallback(this)

SurfaceView与Camera关联

因为我们

你可能感兴趣的:(ffmpeg摄像头Android,Android平台下使用FFmpeg进行RTMP推流(摄像头推流))