Android 音视频学习:使用 Camera API 采集视频数据

这篇文章的主要学习内容是:使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView、TextureView 来预览 Camera 数据,取到 NV21 的数据回调。

Android 中预览相机画面主要用 SurfaceView 和 TextureView。

SurfaceView:SurfaceView 是一个有自己 Surface 的 View。界面渲染可以放在单独线程而不是主线程中。它更像是一个 Window,自身不能做变形和动画。

TextureView:TextureView 同样也有自己的 Surface。但是它只能在拥有硬件加速层的 Window 中绘制,它更像是一个普通 View,可以做变形和动画。

更多关于 SurfaceView 和 TextureView 的知识可以看这篇文章 Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView[1]。

Android 5.0 之前系统提供了 Camera API ,5.0 之后提供了 Camera2 API。

不同手机厂商对 Camera2 的支持程度各不相同,即便是 Android 5.0 以上的手机,也存在对 Camera2 支持非常差的情况,这个时候就要降级使用 Camera。

官方的开源库 cameraview [2] 给出的方案:

API Level Camera API Preview View
9-13 Camera1 SurfaceView
14-20 Camera1 TextureView
21-23 Camera2 TextureView
24 Camera2 SurfaceView

接下来,我们使用 SurfaceView 和 TextureView 实现相机预览的功能。

1、Camera

1.1 使用 SurfaceView

SurfaceView 用于展示相机画面,SurfaceView 持有 SurfaceHolder,我们通过 SurfaceHolder 中的回调可以知道 Surface 的状态(创建、变化、销毁)。

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

继承 SurfaceView,实现 SurfaceHolder.CallBack 接口。在 surfaceCreated 方法中打开相机预览,在 surfaceDestroyed 方法中关闭相机预览就可以了。Camera 的 open 方法有些耗时,为了避免阻塞 UI 线程,可以创建子线程打开相机。

public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
​
    private Camera mCamera;
​
    public CameraSurfaceView(Context context) {
        this(context, null);
    }
​
    public CameraSurfaceView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
​
    public CameraSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        getHolder().addCallback(this);
    }
​
    @Override
    public void surfaceCreated(final SurfaceHolder holder) {
​
        ThreadHelper.getInstance().runOnHandlerThread(new Runnable() {
            @Override
            public void run() {
                openCamera();
                startPreview(holder);
            }
        });
    }
​
    @Override
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android音视频开发是指在Android平台上进行音频和视频相关功能的开发。它涉及到音频的录制、播放,视频采集、编码、解码和播放等方面。 在Android音视频开发中,可以使用Android提供的多媒体框架来实现各种功能。以下是Android音视频开发的一些关键点: 1. 音频开发: - 音频录制:可以使用AudioRecord类进行音频的录制,通过设置音频源、采样率、声道数等参数来实现。 - 音频播放:可以使用MediaPlayer类或AudioTrack类进行音频的播放,通过设置音频文件路径或音频数据来实现。 2. 视频开发: - 视频采集:可以使用Camera类或Camera2 API进行视频采集,通过设置摄像头参数、预览尺寸等来实现。 - 视频编码:可以使用MediaCodec类进行视频的编码,通过设置编码器类型、编码参数等来实现。 - 视频解码:可以使用MediaCodec类进行视频的解码,通过设置解码器类型、解码参数等来实现。 - 视频播放:可以使用SurfaceView或TextureView进行视频的播放,通过设置视频文件路径或视频数据来实现。 3. 音视频处理: - 音频处理:可以使用AudioEffect类进行音频的处理,如混音、变声等。 - 视频处理:可以使用OpenGL ES进行视频的处理,如滤镜、特效等。 4. 直播和推流: - 直播:可以使用第三方库,如librtmp、FFmpeg等来实现音视频的直播功能。 - 推流:可以使用第三方库,如librtmp、FFmpeg等来实现音视频的推流功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值