首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用camera2和mediacodec api录制和保存视频?

使用camera2和mediacodec API录制和保存视频的步骤如下:

  1. 首先,需要获取相机的权限。在AndroidManifest.xml文件中添加相机权限的声明:
代码语言:txt
复制
<uses-permission android:name="android.permission.CAMERA" />
  1. 创建一个CameraManager对象来管理相机设备。通过CameraManager的getCameraIdList()方法获取可用的相机设备列表。
代码语言:txt
复制
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String[] cameraIds = cameraManager.getCameraIdList();
  1. 选择一个合适的相机设备,并打开相机。
代码语言:txt
复制
String cameraId = cameraIds[0]; // 选择第一个相机设备
cameraManager.openCamera(cameraId, cameraStateCallback, null);
  1. 在CameraDevice.StateCallback的回调方法中,可以获取到已打开的相机设备。通过CameraDevice的createCaptureSession()方法创建一个会话。
代码语言:txt
复制
CameraDevice.StateCallback cameraStateCallback = new CameraDevice.StateCallback() {
    @Override
    public void onOpened(@NonNull CameraDevice camera) {
        // 相机已打开,可以进行下一步操作
        cameraDevice = camera;
        createCaptureSession();
    }

    @Override
    public void onDisconnected(@NonNull CameraDevice camera) {
        // 相机断开连接
        camera.close();
        cameraDevice = null;
    }

    @Override
    public void onError(@NonNull CameraDevice camera, int error) {
        // 相机打开错误
        camera.close();
        cameraDevice = null;
    }
};

private void createCaptureSession() {
    List<Surface> surfaces = new ArrayList<>();
    surfaces.add(previewSurface); // 预览的Surface
    surfaces.add(encoderSurface); // 编码的Surface

    cameraDevice.createCaptureSession(surfaces, captureSessionStateCallback, null);
}
  1. 在CameraCaptureSession.StateCallback的回调方法中,可以获取到已创建的会话。通过会话创建一个预览请求。
代码语言:txt
复制
CameraCaptureSession.StateCallback captureSessionStateCallback = new CameraCaptureSession.StateCallback() {
    @Override
    public void onConfigured(@NonNull CameraCaptureSession session) {
        // 会话已创建,可以进行预览
        cameraCaptureSession = session;
        createPreviewRequest();
    }

    @Override
    public void onConfigureFailed(@NonNull CameraCaptureSession session) {
        // 会话创建失败
    }
};

private void createPreviewRequest() {
    try {
        CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        builder.addTarget(previewSurface);

        cameraCaptureSession.setRepeatingRequest(builder.build(), null, null);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}
  1. 创建一个MediaCodec编码器,并配置编码器的参数。
代码语言:txt
复制
MediaCodec encoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, width, height);
format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval);
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
  1. 创建一个Surface作为编码器的输入Surface,并将其设置为预览请求的目标Surface。
代码语言:txt
复制
Surface encoderSurface = encoder.createInputSurface();
builder.addTarget(encoderSurface);
  1. 开始录制视频。
代码语言:txt
复制
encoder.start();
  1. 在预览请求的回调方法中,将预览数据传递给编码器进行编码。
代码语言:txt
复制
cameraCaptureSession.setRepeatingRequest(builder.build(), new CameraCaptureSession.CaptureCallback() {
    @Override
    public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
        // 获取预览数据
        Image image = result.get(CaptureResult.STATISTICS_PREVIEW_DATA);
        ByteBuffer buffer = image.getPlanes()[0].getBuffer();

        // 将数据传递给编码器
        int inputBufferIndex = encoder.dequeueInputBuffer(-1);
        if (inputBufferIndex >= 0) {
            ByteBuffer inputBuffer = encoder.getInputBuffer(inputBufferIndex);
            inputBuffer.clear();
            inputBuffer.put(buffer);
            encoder.queueInputBuffer(inputBufferIndex, 0, buffer.limit(), 0, 0);
        }

        image.close();
    }
}, null);
  1. 在编码器的输出缓冲区可用时,将编码后的视频数据保存到文件。
代码语言:txt
复制
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = encoder.dequeueOutputBuffer(bufferInfo, 0);
while (outputBufferIndex >= 0) {
    ByteBuffer outputBuffer = encoder.getOutputBuffer(outputBufferIndex);
    // 将编码后的数据保存到文件
    saveToFile(outputBuffer, bufferInfo);

    encoder.releaseOutputBuffer(outputBufferIndex, false);
    outputBufferIndex = encoder.dequeueOutputBuffer(bufferInfo, 0);
}
  1. 停止录制视频并释放资源。
代码语言:txt
复制
encoder.stop();
encoder.release();
cameraCaptureSession.close();
cameraDevice.close();

以上是使用camera2和mediacodec API录制和保存视频的基本步骤。具体实现中还需要处理异常、设置视频的分辨率、码率等参数,以及添加适当的错误处理和释放资源的代码。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

给Android工程师的音视频开发学习指南

,并保存。...在 Android 系统下有三套 API 可以进行视频采集,它们是 Camera Camera2还有CameraX 。...音频一样,也有高层低层的 API,高层就是 Camera MediaRecorder,可以快速实现编码,低层就是直接使用 Camera,然后将采集的数据进行滤镜、降噪等前处理,处理完成后由 MediaCodec...数据编码 4.1 音频编码 Android 中利用 AudioRecord 可以录制声音,录制出来的声音是 PCM 声音,使用三个参数来表示声音,它们是:声道数、采样位数采样频率。...对音频进行编码也可以分为软编硬编两种。软编则下载相应的编码库,写好相应的 JNI,然后传入数据进行编码。硬编则是使用 Android 自身提供的 MediaCodec

1.2K40

视频学习路线(二)

初级 主要学习 Java 层面的一些 API 调用; 比如使用 AudioRecord 进行录音得到 PCM ,使用 AudioTrack 播放 PCM 音频、使用Camera2 采集摄像头数据; 使用...MediaExtractor MediaMuxer API 解析封装 mp4 文件; 使用 MediaCodec 进行硬件编解码等。...中级进阶 主要学习Android音视频NDK开发,OpenlSLOpenGL开源库的使用完成具体demo博客发布,其中包括的内容有: NDK 开发中 Native 与 Java 交互; Android...NDK 开发中快速定位 crash 问题; Android NDK 编译方式; Android OpenSL 录制 PCM 音频数据; Android OpenSL 播放 PCM 数据; Android...OpenGL 视频渲染 高级 学习音视频开源库FFmpeg的编译使用 ,完成demo内容包括: Android FFmpeg 集成编译; Android FFmpeg音视频编码; Android

1.1K70

Android使用MediaRecorder类实现视频音频录制功能

一、前期基础知识储备 Android提供了MediaRecorder这一个类来实现视频音频的录制。...由官方配图可知,MediaRecorder用于录制视频时需要调用一系列的API来设置录制相关的配置,而且调用方法的顺序是固定的,必须按照这个顺序进行API调用才能正确利用手机摄像头实现录像功能。...二、上代码,具体实现录制视频视频播放功能 这里调用MediaRecorder的API实现视频录制功能并借用MediaPlayer多媒体播放类实现录制好的视频播放。...mRecordBtn开始录制再次点击停止录制; private void initBtnClick() { StartRecording(); mPlayBtn.setOnClickListener...= null){ mMediaPlayer.release(); mMediaPlayer = null; } } } 三、延伸知识,运行时权限申请工具类 调用手机系统内置的摄像头进行视频录制时及录制视频后将视频保存在本地都需要申请系统权限

3K20

如何高效录制分享教学视频?我尝试了芦笋

录制教学视频,不只是我一个人的需求。许多老师也遇到类似的场景,打算录制视频给学生直观讲解。 可是,他们往往不知道如何开始。因为录制视频看似不难,里面却有不少坑。 陷阱 关于这些坑,咱们得一个个说。...咱们换成另一种老师们更常使用的形式如何? 上传到网盘(例如某某云盘),然后把获取到的链接给学生? 这里依然需要等候上传,时间依照你这边的网速而定。...录制 在芦笋里录制教学视频,你不需要去学习使用什么高级工具,琢磨如何把你的人像视频屏幕录制合并起来。因为这是默认的一个选项而已。 当然,录制的时候,你也可以选择只录制人像或者仅仅录屏。...预览确认剪好后,选择保存,搞定。 这时候,再看视频,长度已经发生了变化,不想要的内容都已删除。观众根本发现不了这里录制时出现过错误。...小结 本文我为你介绍了芦笋屏幕录制应用的基本功能,以及它如何帮助我低成本快速录制教学视频。如果你经常需要给别人讲解内容,或者异步视频沟通,这款工具也会帮你应对痛点。

1.7K10

【FFmpeg】音视频录制 ③ ( 使用 ffmpeg 录制 Screen Capturer Recorder 软件生成的虚拟音视频设备 | 录制桌面 | 录制音频 | 同时录制 音频视频数据 )

使用 Screen Capturer Recorder 软件生成 ffmpeg 可录制的音视频设备 ) 中 , 安装了 Screen Capturer Recorder 软件 , 在 Windows 系统中生成了...可以通过录制 这两个设备 以达到 录制 桌面 系统声音 的目的 ; 2、查看上述虚拟音视频设备 执行 ffmpeg -list_devices true -f dshow -i dummy 命令 ,...ffmpeg 命令 使用的输入格式为 DirectShow , 这是 Windows 系统中用于视频捕获音频捕获的框架 ; -i video="screen-capture-recorder"..., 帧数 , 大小 , 码率 等参数 ; 录制时 , 按下回车 , 在按下 Ctrl + C 组合键 , 即可停止录制 ; 使用 ffplay 命令 , 可正常播放该视频 , 使用 MediaInfo...filter_complex amix=inputs=2:duration=first:dropout_transition=2 参数 是 混音选项 , amix 参数 指定该设置是一个滤镜 , 用于混合音频视频

9610

使用StreamlitOpenAI API构建视频摘要

本文提供了使用StreamlitOpenAI创建的视频摘要应用程序的概述。该程序为视频的每个片段创建简洁的摘要,并总结视频的完整内容。...langchain 搭建环境 首先,需要设置我们的开发环境,可以使用以下代码片段将API密钥设置为环境变量: import os os.environ["OPENAI_API_KEY"] = '{...import datetime from html2image import Html2Image 处理用户输入YouTube视频检索 以下代码是Streamlit的按钮事件:我们提示用户输入一个..., on_click=send_click) 获取视频文本预处理 使用YouTubeTranscriptApi可以获得视频文本。然后将转录本格式化为JSON并保存到文件中。...通过使用query_engine从视频部分构造的提示来查询语言模型。

25520

录制剪辑视频如何解决占用空间过大的问题?

prompts: a big movie tape in the crowded lighting room 问题 最近做视频比较多。我一般采用手机录制,然后加上 B-roll 素材进行剪辑。...录制 8-10 分钟的视频,大概能有 1GB 左右的体积,输出后的视频也大概是这样的体量。我的电脑硬盘手机空间,于是都有些吃紧。而且这么大的视频,上传到视频网站,也需要等待更长时间。...我的主要目的,是把 10 分钟左右的视频,从 1 个多 GB,弄成几百兆,方便备份上传就可以了嘛。 验证 我突然想起来,自己平时也用 OBS 推流直播录制内容,感觉录制视频大小就比较迷你。...从这里可以看出,对于知识类直播或者视频录制,不影响观影体验的情况下,实际上设置到 3000Kbps,已经足够了。...主要是我缺乏光影使用的技能经验,所以每次录制出来的视频,看着都特别黑,需要用这功能「补一补」。不过我觉得默认参数稍微高了一些,所以每次都调低一点儿。免得出现在你面前的人物,长得不像我本人。

1.7K30

【FFmpeg】音视频录制 ① ( 查询系统中 ffmpeg 可录制的音视频输入设备 | 使用 ffmpeg 命令录制视频数据 | 录制视频数据命令 |录制音频数据| 同时录制音频视频数据命令 )

一、查询系统中 ffmpeg 可录制的音视频输入设备 在 Windows 系统中 , 使用 ffmpeg 命令 录制视频 , 需要先获取 系统的 音视频设备 信息 , 录制视频 本质上是从 系统音视频设备...音频设备 DirectShow audio devices 的查询结果是 “立体声混音 (Realtek® Audio)” 可使用该设备录制音频 ; 二、使用 ffmpeg 命令录制视频数据 1、录制视频数据命令..., 上述命令参数解析 : -f gdigrab : 设置 录制视频 的 输入格式为 gdigrab , Windows 上使用该方式捕获视频 , Linux 中设置的是 -f x11grab 参数 ;...; 3、同时录制音频视频数据命令 执行 ffmpeg -f gdigrab -framerate 30 -offset_x 0 -offset_y 0 -video_size 1920x1080 -...视频 音频 到 输出文件中 , 录制视频的命令 与 上面的命令参数相同 , 只是在上述录制视频的基础上 , 增加了 -f dshow -i audio="立体声混音 (Realtek(R) Audio

14910

LiTr:适用于Android的轻量级视频音频转码器

从Android设备发布视频时,成员可以使用其设备摄像头应用程序录制视频,也可以从图库中选择已经拍摄好的视频。上传后,视频将被转换为消费格式,并作为更新显示在Feed中。...在这篇文章中,我将对该演讲进行高层概述,包括我们如何构建LiTr架构,如何使用它来转换媒体以及为什么我们选择MediaCodec来访问硬件编码器。请参阅此处以录制谈话内容。...成员通常选择共享可以在其设备上播放的视频,这意味着它们可以被解码。而且由于大多数Android设备都以H.264压缩方式录制视频,因此我们可以使用该编解码器对视频进行编码。...适用于Android的轻量级硬件加速视频/音频转码器,或简称LiTr。 媒体编解码器(MediaCodec) 为了访问编码器硬件,LiTr使用Android的MediaCodec API。...应该从实例化MediaTranscoder时使用的上下文访问源视频URI。转码时会保留源轨道计数和顺序。 视频将被转换为H.264,并以提供的文件路径保存在MP4容器中。

2.4K20

教程 | 如何使用Docker、TensorFlow目标检测APIOpenCV实现实时目标检测视频处理

选自TowardsDataScience 作者:Léo Beaucourt 机器之心编译 参与:李诗萌、路雪 本文展示了如何使用 Docker 容器中的 TensorFlow 目标检测 API,通过网络摄像头执行实时目标检测...此外,我还在项目中添加了视频后处理功能,这一功能也使用了多进程,以减少视频处理的时间(如果使用原始的 TensorFlow 目标检测 API 处理视频,会需要非常非常长的时间)。...用于数据科学的 Docker 鉴于大量文章对 TensorFlow 目标检测 API 的实现进行了说明,因此此处不再赘述。作为一名数据科学家,我将展示如何在日常工作中使用 Docker。...困难在于如何将网络摄像头视频流传送到 Docker 容器 中,并使用 X11 服务器恢复输出流,使视频得以显示出来。...视频处理 为了成功用网络摄像头实时运行目标检测 API,我用了线程多进程 Python 库。

2.8K60

关于Camera性能优化的一些建议

全局Surface设置 这是针对Camera2的优化,正常情况下,我们使用Camera2开启预览、拍照、录像,需要设置几个Surface?...void onConfigureFailed(@NonNull CameraCaptureSession session) { } }, mCameraHandler); 如果你想加入拍照录制视频...,你需要创建额外两个CaptureRequest,而且需要分别设置拍照的surface——ImageReader.getSurface录制视频的surface——MediaRecorder.getSurface...,需要借助系统API——MediaRecorder,创建特定的CaptureRequest来实现抓取视频帧的目的: private boolean prepareVideoRecorder() {...正常情况下,Surface用来Camera预览 如果点击拍照,将之前的预览帧保存为图片 如果点击录制,将Surface的视频帧编码放入Video Packet Queue中,等着封装时候Audio

2.2K10

LiTr:适用于Android的轻量级视频音频转码器

从Android设备发布视频时,成员可以使用其设备摄像头应用程序录制视频,也可以从图库中选择已经拍摄好的视频。上传后,视频将被转换为消费格式,并作为更新显示在Feed中。...在这篇文章中,我将对该演讲进行高层概述,包括我们如何构建LiTr架构,如何使用它来转换媒体以及为什么我们选择MediaCodec来访问硬件编码器。请参阅此处以录制谈话内容。...成员通常选择共享可以在其设备上播放的视频,这意味着它们可以被解码。而且由于大多数Android设备都以H.264压缩方式录制视频,因此我们可以使用该编解码器对视频进行编码。...适用于Android的轻量级硬件加速视频/音频转码器,或简称LiTr。 为了访问编码器硬件,LiTr使用Android的MediaCodec API。...应该从实例化MediaTranscoder时使用的上下文访问源视频URI。转码时会保留源轨道计数和顺序。 视频将被转换为H.264,并以提供的文件路径保存在MP4容器中。

3.3K20

视频 SDK 开发 (一) 开发一款短视频 SDK 需要具备哪些知识?

开发 (四) Camera + MediaCodec + OpenGL ES + OpenSL ES + FFmpeg MP4Muxer 实现音视频实时录制封装为 MP4 短视频 SDK 开发 (五)...:H.264视频码流解析 雷神-视音频数据处理入门:AAC音频码流解析 音视频学习 (七) 掌握音频基础知识并使用 AudioTrack、OpenSL ES 渲染 PCM 数据 音视频学习 (八) 掌握视频基础知识并使用...Android MediaCodec H264 硬编解码 ffmpeg_audio_encode_decode FFmpeg API 实现音频 AAC 软编解码 ffmpeg_video_encode_decode...FFmpeg API 实现视频 H264 软编解码 lame_ffmpeg_mp3_encode_decode MP3 编解码 JavaAVPlayer Java API 实现音视频播放(mp3/mp4...每次录制完成将录制的路径保存下来,最后将这些 MP4 的文件合并为一个 MP4 文件 「水印:」 拿着上一个视频处理的 纹理 ID ,在这基础上渲染一个 BItmap 即可 「背景音混音:」 可以参考如下实现代码

1.7K30

REST API 设计最佳实践:如何构建、设计使用 API

作为一名开发者,我很幸运能够在工作中使用一些仍然存在的SOAP服务。但是,我主要接触的是REST,这是一种基于资源的APIWeb服务开发架构风格。...在我的职业生涯中有很大一部分时间都参与了构建、设计使用API 的项目。我见过的大多数API 都“声称” 是 “符合REST原则”的——意味着遵循 REST 架构的原则和约束。..., 4xx 表示客户端错误 5xx 表示服务器错误 当然你还可以使用其他 HTTP 协议提供给 REST API 设计的功能 ,但这些都必须牢记在心里。...最简单类型的分页就是按页码进行分页,它由pagepage size确定。现在问题来了:如何将这样的功能融入REST API? 我的答案是:使用查询字符串(querystring)。...使用专门针对REST API的网络框架 作为最后一个最佳实践,让我们讨论这个问题:如何在您的API中实际应用最佳实践?大多数时候,您希望建立一个快速的API,以便一些服务可以相互交互。

33040

CameraX 1.1 有哪些新的特性发布?

何时使用 CameraX 或 Camera2,这取决于您期望更快的开发速度或是想要更高的自定义程度。...,而 Camera2 则需要应用来管理不同设备间的差异并测试其行为; CameraX 提升了代码开发速度,让您更专注于用户界面体验流程,而 Camera2 则用于更深入地开发以创造基于相机的定制功能;...CameraX 基于主要的使用场景来构建,比如实时预览相机、检索缓冲区以进行分析拍摄照片,在 CameraX 1.1 版本中还加入了视频拍摄功能。...视频拍摄 在 CameraX 1.1 版本中我们加入了视频拍摄功能,视频拍摄 API (尚处于 Alpha 阶段,细节可能会发生变化,但整体结构基本会保持不变) 提供了录制到文件等基本功能、可自动适配每台设备的...我们来看看如何使用 CameraX Extensions API: // 获取后置相机列表 val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

1.7K20

微信团队分享:微信Android版小视频编码填过的那些坑

API之一” 以微信的小视频为例,我们录制一个540p的mp4文件,对于Android来说,大体上是遵循这么一个流程: ?...大体上就是从摄像头输出的YUV帧经过预处理之后,送入编码器,获得编码好的h264视频流。 上面只是针对视频流的编码,另外还需要对音频流单独录制,最后再将视频音频流进行合成出最终视频。...3、MediaCodec 3.1 基本介绍 MediaCodecAPI 16之后Google推出的用于音视频编解码的一套偏底层的API,可以直接利用硬件加速进行视频的编解码。...在调用的时候,MediaCodec提供了同步异步两种调用方式,但是异步使用Callback的方式是在API 21之后才加入的。 以同步调用为例,一般来说调用方式大概是这样(摘自官方例子): ?...关于MediaCodec更复杂的使用例子,可以参照下CTS测试里面的使用方式: EncodeDecodeTest.java 从上面例子来看的确是非常原始的API,由于MediaCodec底层是直接调用了手机平台硬件的编解码能力

2.5K30

ShareREC for Android全系统录屏原理解析

幸而从5.1开始,系统又提供了MediaProjection API,通过再组合MediaRecorder或者MediaCodec API,开发者可以十分轻松地实现一个免root的全系统录屏工具,而ShareREC...方案一:使用MediaRecorder作为媒体输出 让我们先来看一下MediaProjection API是个什么东西。...此外,并不是一输入图片就立刻会有输出h264帧,MediaCodec一般会缓存3-7张图片。 最后是视频合并模块,ShareREC使用了mp4v2来实现。...但它的工作原理很简单,无非就是打开文件;在内存中保存视频轨道音频轨道的信息;接着一帧帧写入视频或者音频数据,不用在意写入顺序,可以混在一起;在完成合并时,将内存里面的音视频信息组合为mp4描述信息,追加到文件尾部...但使用时有一些可能需要注意的,包括多线程同步图片呈现时间的问题。

1.3K20

微信 Android 视频编码爬过的那些坑

上面只是针对视频流的编码,另外还需要对音频流单独录制,最后再将视频音频流进行合成出最终视频。 这篇文章主要将会对视频流的编码中两个常见问题进行分析: 视频编码器的选择(硬编 or 软编)?...如何对摄像头输出的YUV帧进行快速预处理(镜像,缩放,旋转)?...+x264/openh264 我们来逐个解析一下 MediaCodec MediaCodecAPI 16之后Google推出的用于音视频编解码的一套偏底层的API,可以直接利用硬件加速进行视频的编解码...调用的时候需要先初始化MediaCodec作为视频的编码器,然后只需要不停传入原始的YUV数据进入编码器就可以直接输出编码好的h264流,整个API设计模型来看,就是同时包含了输入端输出端的两条队列:...在调用的时候,MediaCodec提供了同步异步两种调用方式,但是异步使用Callback的方式是在API 21之后才加入的,以同步调用为例,一般来说调用方式大概是这样(摘自官方例子): 简单解释一下

9.2K55
领券