采集视频(CameraAPI)和MediaCodec的简单使用

Capture video (Camera API) and simple use of MediaCodec

最近我在使用 MediaRecorder 捕获视频并在输出中处理它们。然而,事实证明,存在安全限制,这不允许我从 MediaRecorder 捕获输出流(问题出现在下面的 link 中):

"Seekable" file descriptor to use with MediaRecorder Android 6.0 (API 23)

所以我不得不详细说明另一个解决方案,并决定与 Camer API 合作并在那里获取流。所以第一种方法是使用 onPreviewFrame,捕捉文件中的帧并转换颜色和格式 (MediaCodec)。幸运的是,可以通过从例如 SuraceTexture 获取视频来规避颜色转换问题,如在 bigflakes 项目中:

https://bigflake.com/mediacodec/CameraToMpegTest.java.txt

我在 Android Java 中并不是一个新手,但这真的让我不知所措。我不想要现成的收据,接下来的整个星期我都可以坐下来工作并破解该代码,但首先我的问题是:你们如何理解 MediaCodec 从例如SurfaceTexture,然后将其放入 MediaMuxer,其次,您能否推荐一些教程,从该主题的最简单项目开始,然后逐渐扩展代码?

我真的尝试在 bigflakes 项目上工作,但我很无助,因为缺少 onCreate 方法.. 最精彩的部分是在他开始渲染视频时开始的。

Bigflakes MediaCodec page contains mostly tests for MediaCodec, if you still insist on using that as a reference then start from encodeCameraToMpeg() in CameraToMpegTest, also take a look at EncodeAndMux 了解如何设置 MediaCodec encoder

有关工作视频捕获示例,请查看 Google 示例存储库中提供的 taehwandev's MediaCodecExample. For an example on how to decode your recorded video, take a look at the BasicMediaDecode

将 MediaCodec 与 Camera1 API 一起使用的优势在于您将能够支持 API 级别 18 及更高级别的设备。如果您只针对 API 级别 21 及以上,那么 Camera2 应该可以,这里有一个 Android Camera2Video Sample 供您在需要时参考。

最后,看看新的 CameraX API 可能也是值得的,虽然它不应该用于生产,但这是 android 的方向相机 API 正朝着。因此,可能值得一看 official documentation and going through a guide or two (eg: Exploring CameraX) 以提前了解基本概念。

注意 - 不要在生产代码中使用 CameraX API,因为 CameraX 库处于 alpha 阶段,其 API 表面尚未最终确定。我只是将它作为一个选项提供,供您密切关注以供将来参考。