Android 以字节[]保存Camera2输出流

Android 以字节[]保存Camera2输出流,android,android-camera,Android,Android Camera,我支持视频聊天功能的应用程序。我使用的是Camera2用于API>=21。照相机工作。现在我需要从设备的摄像头接收数据并将其写入字节[],然后将数组传递给本机方法以处理和传输图像。用C++编写的视频传输功能。我的任务-以字节[]正确录制视频(因为此参数接受本机方法,即在视频显示器上执行所有后续操作) 如果我开始添加内容,相机就会停止工作。 请帮助我正确、轻松地执行此任务。我尝试使用MediaRecorder,但它不在字节[]中写入数据。我观看了standart Google的例子,比如Camer

我支持视频聊天功能的应用程序。我使用的是
Camera2
用于
API>=21
。照相机工作。现在我需要从设备的摄像头接收数据并将其写入字节[],然后将数组传递给本机方法以处理和传输图像。用C++编写的视频传输功能。我的任务-以字节[]正确录制视频(因为此参数接受本机方法,即在视频显示器上执行所有后续操作)

如果我开始添加内容,相机就会停止工作。 请帮助我正确、轻松地执行此任务。我尝试使用
MediaRecorder
,但它不在字节[]中写入数据。我观看了standart Google的例子,比如
Camera2Basic
,Camera2Video。我试图在本教程中实现类似的
MediaRecorder
。但它不起作用。
ImageReader
据我所知,仅用于图像。
MediaCodec
-太复杂了,我真的不懂。 要从我的设备的摄像头获取图像并将其记录到字节[]中,最好的方法是什么。如果可能的话,给我一个代码样本或者一个我能看到的资源。谢谢

您想使用;它旨在取代旧的camera API预览回调(以及拍摄JPEG或RAW图像,这是另一种常用方法)

使用该格式

ImageReader的图像使用ByteBuffer而不是byte[],但是您可以直接通过JNI传递ByteBuffer,并通过使用获取指向图像每个平面的void*指针。这比首先复制到字节[]要高效得多


编辑:更多详细信息:

这是假设您有自己的软件视频编码/网络传输库,并且不想使用Android的硬件视频编码器。(如果需要,则需要使用MediaCodec类)

  • 设置预览视图(SurfaceView或TextureView),将其大小设置为所需的预览分辨率
  • 创建具有YUV_420_888格式和所需记录分辨率的ImageReader。接一个电话
  • 打开相机设备(可以与前面的步骤并行完成)
  • 从视图和ImageReader中获取曲面,并使用它们创建曲面
  • 创建会话后,使用模板_录制(优化录制用例的设置)和请求
  • 生成请求并将其设置为
  • 相机将开始将缓冲区推入预览和图像阅读器。每当新帧准备就绪时,您将得到一个onImageAvailable回调。获取,获取构成YCbCr映像的三个字节缓冲区,并通过JNI将它们传递给本机代码
  • 处理完图像后,请确保。为了提高效率,ImageReader中有固定数量的图像,如果不返回它们,相机将暂停,因为它将没有可写入的缓冲区。如果需要并行处理多个帧,则可能需要增加ImageReader构造函数的maxImages参数

  • 你看过分配吗@萨姆纳-我试过这个。它不起作用,我也不明白如何处理TextureView。示例不使用它您能给我一个关于JNI处理的见解吗,我不确定在本机代码中如何处理ByteBuffers,您链接到了NewDirectByteBuffer函数。我需要使用BaseVideoCapturer.provideByteArrayFrame将视频帧作为字节[]传递给opentok