IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Camera性能分析 - 第22讲 录像使用PersistentInputSurface -> 正文阅读

[移动开发]Android Camera性能分析 - 第22讲 录像使用PersistentInputSurface

本讲是Android Camera性能分析专题的第22讲 ?,我们介绍录像使用PersistInputSurface,包括如下内容:

  1. 为什么要使用PersistentInputSurface
  2. 使用PersistentInputSurface的步骤
  3. GeekCamera2 录像使用PersistInputSurface实战
  4. 录像使用PersistInputSurface Trace简单分析

视频在线观看:

加入知识星球与更多Camera同学交流
– 星球名称:深入浅出Android Camera
– 星球ID: 17296815
– Wechat: 极客笔记圈

为什么要使用PersistentInputSurface

  1. App完全掌控录像Surface的生命周期,可以避免如下难以处理的问题

    • 当Video Encoder发生错误时(比如Storage满了,无法正常写入),会先release recording Surface再返回错误给Camera App,而此时可能Camera Framework正在送Buffer给Recording Surface,Surface如果被突然销毁,Camera Framework会抛Exception
  2. 当重复录像时,第二次录像可以省掉MediaRecorder.prepare时间

    • 理论上可行,留给同学们去验证

使用PersistentInputSurface的步骤

可以分为如下步骤:

Surface persistSurface = MediaCodec.createPersistentInputSurface()
MediaRecorder.setInputSurface(persistSurface)
MediaRecorder.prepare()
createCaptureSession with persist input surface
persistSurface.release()
  1. 通过MediaCodec.createPersistentInputSurface()创建一个Surface,此时Surface的属性,比如宽、高、format、Usage等都未指定
  2. 将创建好的Persistent Input Surface通过MediaRecorder.setInputSurface设置给MediaRecorder
  3. 调用MediaRecorder的prepare方法,这样该Surface就可以拿去用了
  4. 创建Camera Capture Session时可以使用该Surface了
  5. 当退出Video模式时(切其他模式或进入Setting去切录像分辨率),销毁Persistent Input Surface,否则每次录像可以重用该Surface

该Surface的生命周期完全可以由App来控制

GeekCamera2 录像使用PersistentInputSurface实战

具体见视频讲解,核心函数如下:

public void copyToMediaRecorder(MediaRecorder media_recorder, boolean slow_motion, Surface persistSurface) {
    if( MyDebug.LOG )
        Log.d(TAG, "copyToMediaRecorder: " + media_recorder + toString());
    if( record_audio && !slow_motion) {
        if( MyDebug.LOG )
            Log.d(TAG, "record audio");
        media_recorder.setAudioSource(this.audioSource);
    }
    media_recorder.setVideoSource(this.videoSource);
    // n.b., order may be important - output format should be first, at least
    // also match order of MediaRecorder.setProfile() just to be safe, see https://stackoverflow.com/questions/5524672/is-it-possible-to-use-camcorderprofile-without-audio-source
    media_recorder.setOutputFormat(this.fileFormat);
    if (slow_motion) {
        media_recorder.setVideoFrameRate(30);
    } else {
        media_recorder.setVideoFrameRate(this.videoFrameRate);
    }
    media_recorder.setCaptureRate(this.videoCaptureRate);
    media_recorder.setVideoSize(this.videoFrameWidth, this.videoFrameHeight);
    media_recorder.setVideoEncodingBitRate(this.videoBitRate);
    media_recorder.setVideoEncoder(this.videoCodec);
    if( record_audio && !slow_motion) {
        media_recorder.setAudioEncodingBitRate(this.audioBitRate);
        media_recorder.setAudioChannels(this.audioChannels);
        media_recorder.setAudioSamplingRate(this.audioSampleRate);
        media_recorder.setAudioEncoder(this.audioCodec);
    }
    if( MyDebug.LOG )
        Log.d(TAG, "done: " + media_recorder);

    if (persistSurface != null) {
        media_recorder.setInputSurface(persistSurface);
    }
}

注意,使用Persistent Input Surface后不能再从MediaRecorder去getSurface()了。

录像使用PersistentInputSurface Trace简单分析

从GeekCamera App的进程我们能看到GraphicBufferSource的Trace

?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:53:17  更:2022-10-08 20:53:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 5:05:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码