Android视频的操作_android下载视频流程

1.3 Mediaplayer + SurfaceView + MediaController

MediaController是Android系统自带的控制器。其实就是前两种的结合。此处不再赘述。

二、图像和视频的采集

视频的采集需要调用硬件摄像头,对应的API是Camera。使用Camera又分为两类:

  • Android 5.0以下:Camera
  • Android 5.0以上:Camera2

Camera相关API也体现了Android生态碎片化的特点,有时候还会遇到各家手机厂商对Camera2的支持程度也各不相同,这就导致开发者在相机开发中要花费很大精力来处理兼容性问题。

2.1 相机的使用和开发流程
  • 检测并访问相机资源:检查手机是否存在相机资源,如果存在则请求访问相机资源。
  • 创建预览界面:创建继承自SurfaceView并实现SurfaceHolder接口的拍摄预览类。有了拍摄预览类,即可创建一个布局文件,将预览画面与设计好的用户界面控件融合在一起,实时显示相机的预览图像。
  • 设置拍照监听器:给用户界面控件绑定监听器,使其能响应用户操作, 开始拍照过程。
  • 处理:拍照并保存文件,将拍摄获得的图像转换成位图文件,最终输出保存成各种常用格式的图片或者可以采集视频信息。
  • 释放相机资源:相机是一个共享资源,当相机使用完毕后,必须正确地将其释放,以免其它程序访问使用时发生冲突。
2.2 相机开发注意事项

从API到硬件,再到厂商的兼容性问题,相机开发中需要格外注意的几个点首先要有心理准备。

  • API兼容性问题:Android 5.0以下的API是Camera,Android5.0以上是Camera2;4.0以下只能使用SurfaceView,4.0以上多了选择TextureView;Android 权限升级后使用相机资源时的动态权限适配问题。
  • 硬件设备兼容性问题:前文已经提到过,,Camera/Camera2里的各种特性在有些手机厂商的设备实现方式和支持程度是不一样的,这个需要做兼容性测试,坑要一点点填。
  • 应用开发时业务场景下的硬件资源的管理问题。比如应用进入到后台或者锁屏等操作,相机资源该如何管理和操作。应用界面该如何绘制和管理等。
2.3 Camera和Camera2
Camera

Camera API中主要涉及以下几个关键类:

  • Camera:操作和管理相机资源,支持相机资源切换,设置预览和拍摄尺寸,设置光圈、曝光等相关参数。
  • SurfaceView:用于绘制相机预览图像,提供实时预览的图像。
  • SurfaceHolder:用于控制Surface的一个抽象接口,它可以控制Surface的尺寸、格式与像素等,并可以监视Surface的变化。
  • SurfaceHolder.Callback:用于监听Surface状态变化的接口。Callback中有三个函数:
    • surfaceCreated: 当Surface第一次创建的时候调用,可以在这个方法里调用camera.open()、camera.setPreviewDisplay()来实现打开相机以及连接Camera与Surface 等操作。
    • surfaceChanged:当Surface的size、format等发生变化的时候调用,可以在这个方法里调用camera.startPreview()开启预览。
    • surfaceDestroyed:当Surface被销毁的时候调用,可以在这个方法里调用camera.stopPreview(),camera.release()等方法来实现结束预览以及释放。

相机的分类和操作:

  • 分类:前置和后置
    • Camera.CameraInfo.CAMERA_FACING_FRONT:前置
    • Camera.CameraInfo.CAMERA_FACING_BACK:后置
  • open:打开相机
  • getParameters:获取相机参数
    • FLASH_MODE_AUTO:自动模式,当光线较暗时自动打开闪光灯;
    • FLASH_MODE_OFF:关闭闪光灯
    • FLASH_MODE_ON:拍照时闪光灯
    • FOCUS_MODE_AUTO:自动对焦模式
    • FOCUS_MODE_FIXED:固定焦距模式
    • SCENE_MODE_NIGHT:夜间场景;
  • takePicture:拍照
    • ShutterCallback:拍照的瞬间被回调,播放拍照音效;
    • PictureCallback raw:未经压缩的图像数据
    • PictureCallback postview:postview类型的图像数据
    • PictureCallback jpeg:经过JPEG压缩的图像数据
  • release():释放相机资源
Camera2

Camera2 API中主要涉及的关键API:

  • CameraManager:摄像头管理器,用于打开和关闭系统摄像头
  • CameraCharacteristics:描述摄像头的各种特性,可通过CameraManager的getCameraCharacteristics(id)方法获取
  • CameraDevice:系统摄像头,类似于早期的Camera
  • CameraCaptureSession:Session类,当使用拍照、预览等功能时,需要先创建该类的实例,然后通过该实例里的方法进行控制(例如:拍照 capture())
  • CaptureRequest:拍照、预览等操作都需要先传入CaptureRequest参数,具体的参数控制也是通过其成员变量来设置
  • CaptureResult:描述拍照完成后的结果。

以上的核心API,Camera2的运行原理如下图所示

通过管道将安卓设备和摄像头之间联通起来,系统向摄像头发送 Capture 请求,摄像头会返回 CameraMetadata,中间的通信建立在CameraCaptureSession的会话中。

Camera2的使用流程大致如下:

  • 工作线程:创建一个专门的线程用于Camera的具体操作,可以使用HandlerThread,Android提供的具备Handler的Thread,用于通信。

  • 预览画面:可以是SurfaceView或者TextureView,用于显示采集的数据画面。

  • 获取Camera设备:使用CameraManager找到合适的Camera设备,得到相关参数,调整预览画面等操作。

  • 开启设备:调用CameraManager的openCamera,打开指定摄像头

    • cameraId:摄像头id
    • CameraDevice.StateCallback:相机回调状态
    • handler:消息数据处理
  • CameraDevice:通过StateCallback获取到设备Camera对象

  • Camera与视图绑定:调用CameraDevice.createCaptureRequest方法,用于将Surface和Camera进行绑定,让Surface可以接收Camera的数据。

  • 建立会话:调用CameraDevice的createCaptureSession方法创建session对象,创建成功后会回调StateCallback接口方法onConfigured,表明会话已经建立。

  • 发送请求:在创建好的会话中通过setRepeatingRequest发送请求,即向Camera发送命令。

2.4 视频的采集

路线既可以调用系统实现,也可以自定来实现。

Intent

我们都知道Intent是Android中的组件之间的通信工具,如果想要调用系统的录像功能,可以设置Intent意图,如下所示:

Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 5);//限制时长 s
intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 1024*1024);//限制大小 
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);//设置质量
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);//设置输出位置
startActivityForResult(intent, 1);
​

另外在onActivityResult中接收:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode==RESULT_OK){
        Uri uri = data.getData();
        //视频地址
        String videoPath = getPathFromUri(this,uri);
    }
}
​
public static String getPathFromUri(Context mContext,Uri contentUri){
    String[] proj = { MediaStore.Images.Media.DATA };
    CursorLoader loader = new CursorLoader(mContext, contentUri, proj, null, null, null);
    Cursor cursor = loader.loadInBackground();
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}
MediaRecorder

如果需要自定义录制视频,需要使用前文讲到的MediaRecorder类来辅助完成。结合Camera2来进行实现。

其操作方法与预览和拍照过程相似,此处直接以案例进行演示和讲解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值