Android MediaRecorder用于录制Surface(而不是Camera)

9
我正在查看Android SDK的MediaRecorder类,并想知道它是否可以用于记录由Surface制作的视频。 例如:我想将我在Surface上显示的内容(一个视频游戏?)录制到文件中。 正如我在标题中所说的:我不想录制任何来自相机的内容。
我认为通过覆盖大部分类是可能的,但我非常希望得到一些想法...... 此外,我不确定相机类在MediaRecorder中如何使用,以及我应该从我的Surface获取什么来替换它。
谢谢您的关注!
PS:我正在查看MediaRecorder使用的本地代码,也许会启发其他人: http://www.netmite.com/android/mydroid/frameworks/base/media/jni/

你解决了这个问题吗?能从Surface录制视频吗?如果可以,你能给一些想法吗? - Gopal Gopi
你解决了这个问题吗? - hungtdo
嘿,我正在尝试解决这个问题。如果解决了,我会让你知道。 - Vikash Kumar Verma
5个回答

5

4
Android 4.3 (API 18)新增了一些功能,正好满足您的需求。具体来说,可以通过Surface向MediaCodec提供数据,并且可以通过MediaMuxer将编码后的视频存储为.mp4文件。这里提供了一些示例代码(点击此处),包括一个Breakout游戏的补丁程序,可以在您玩游戏时记录游戏过程。

1

很遗憾,在Java层面上是不可能的。相机和媒体录制器之间的所有通信都发生在本地代码层,没有办法将非相机数据注入到该管道中。

虽然Android 4.1添加了Media Codec APIs,允许访问设备的视频编码器,但没有易于使用的方法来获取结果编码流并将其保存为标准视频文件。您需要找到一个库来完成这个任务或自己编写一个。


好的,Java层不可能实现,但我可以使用NDK。问题是,我昨天开始看MediaRecorder源代码类,但我仍然无法弄清楚它在哪个部分接收相机帧。我认为我在使用中漏掉了一些东西,因为每个函数似乎都几乎为空(请参见第一篇帖子中的链接)。 - Gyome

1
这是一篇关于如何在EGLSurface上进行绘制并使用MediaCodec生成视频的文章。

https://www.sisik.eu/blog/android/media/images-to-video

这里使用了OpenGL ES,但是您可以让MediaCodec提供一个表面(surface),然后从中获取画布(canvas)进行绘制,无需使用OpenGL ES。

1

如果您熟悉NDK(C / C ++,JNI等)和Android(权限等),则可以从AOSP框架/ av / media的不同文件夹中跟踪兔子洞。

这需要深入了解,而且我不确定在非root设备上能走多远。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接