Camera 视频采集,H264 编码保存

一. 前言

上篇文章《AAC 音频编码保存和解码播放》 讲述了通过 AudioRecord 录制音频数据,并通过 AAC 编码保存为 AAC 文件。这里的 aac 既是一种编码方式,也是一种容器,因此可以直接播放。本篇文章讲讲述如何使用 Camera 采集音频音频数据,并通过 H264 编码保存为 .h264 文件,因为 .h264 不是标准的容器,所以不能直接播放,但是可以通过 ffmpeg 播放。

二. Camera 的预览和数据采集
1. Camera 的预览

Camera 的预览需要使用 SurfaceView (TextureView 也可以),SurfaceView 和 Surface , SurfaceHolder 搭配使用,它们的关系如下:

  • Surface:是内存中一段绘图缓冲区,可以独立地绘制图像。
  • SurfaceView:拥有 Surface 的 View。
  • SurfaceHolder: Surface 的持有,管理类,SurfaceView 通过 SurfaceHoler 管理 Surface。SurfaceHolder 有个接口 SurfaceHolder.Callback ,可以监听 Surface 的状态(创建,改变和销毁)。
2. Camera 的创建

Camera 的创建需要设定一些参数。

// cameraFacing 表示打开前置摄像头还是后置摄像头
Camera.open(cameraFacing);

// 设置预览输出的格式 , 这里是 NV21 所有的相机都支持, 是 YUV420 的一种
mParameters = camera.getParameters();
mParameters.setPreviewFormat(ImageFormat.NV21);

//设置预览的大小,Camera 预览的大小(分辨率)只支持内置的几种 getSupportedPreviewSizes 
Camera.Size previewSize = getBestSize(DEFAULT_WIDTH, DEFAULT_HEIGHT, mParameters.getSupportedPreviewSizes());
mParameters.setPreviewSize(previewSize.width, previewSize.height);

//如果使用截图接口,还需要设置截图大小(分辨率)
Camera.Size pictureSize = getBestSize(DEFAULT_WIDTH, DEFAULT_HEIGHT, mParameters.getSupportedPictureSizes());
mParameters.setPictureSize(pictureSize.width, pictureSize.height);

//设置支持的聚焦模式
if (supportFocus(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
    mParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
}
private boolean supportFocus(String focus) {
    List<String> focusModes = mCamera.getParameters().getSupportedFocusModes();
    if (focusModes.contains(focus)) {
        return true;
    }
    return false;
}

//设置帧率
int defminFps = 0;
int defmaxFps = 0;
List<int[]> supportedPreviewFpsRange = mParametergetSupportedPreviewFpsRange();
for (int[] fps : supportedPreviewFpsRange) {
    if (defminFps <= fps[PREVIEW_FPS_MIN_INDEX] && defmaxFps <fps[PREVIEW_FPS_MAX_INDEX]) {
        defminFps = fps[PREVIEW_FPS_MIN_INDEX];
        defmaxFps = fps[PREVIEW_FPS_MAX_INDEX];
    }
}
mParameters.setPreviewFpsRange(defminFps, defmaxFps);


//由于相机预览默认是横屏的,还需要根据实际情况设置为竖屏或者横屏

private void setCameraDisplayOrientation(Activity activity) {
        Camera.CameraInfo info = new Camera.CameraInfo();
        Camera.getCame
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值