我从640x480 (对我来说足够)的 android 相机中获取相机预览帧,并对它们进行一些修改。但现在我需要将它们编码为新MP4
文件(带音频)。
这怎么可能?由于许可证不太好,我无法使用ffmpeg
,但我找到Stagefright
了应该能够做到这一点的框架。但是我没有找到任何官方文档或教程来做我需要做的事情。
请问有没有办法用这个框架做到这一点?我不需要代码,我会很高兴为我指出正确的方向。
我从640x480 (对我来说足够)的 android 相机中获取相机预览帧,并对它们进行一些修改。但现在我需要将它们编码为新MP4
文件(带音频)。
这怎么可能?由于许可证不太好,我无法使用ffmpeg
,但我找到Stagefright
了应该能够做到这一点的框架。但是我没有找到任何官方文档或教程来做我需要做的事情。
请问有没有办法用这个框架做到这一点?我不需要代码,我会很高兴为我指出正确的方向。
有一种情况可以实现所描述的用例。考虑这样一种情况,其中Camera
输出被馈送到OpenGL
库中,其中一些效果应用于需要记录的预览帧。
那么在这种情况下,您可以使用传统MediaRecorder
的 withGrallocSource
而不是CameraSource
. 设置如下所示:
MediaRecorder
设置为GrallocSource
. 用于记录的输入表面由实现 a 的Camera
+OpenGL
组合操作提供SurfaceTextureClient
。一个很好的例子可以在SurfaceMediaSource_test
模块中找到。
如果您必须支持 API 9 及更高版本, stagefright非常好。但正如你所见,这个框架不是官方的。您可以使用platform/frameworks/av中的示例代码,风险自负。
google 源包括 CameraSource,它直接将相机帧提供给编码器。虽然这种方法可能更有效(像素根本不会复制到用户空间),但它不允许操作。可以修改 C++ 源代码,但我强烈建议使用 Java 访问相机,并通过 JNI 将预览帧传递给 stagefrght (OpenMAX) 编码器。在某些设备上,这可能会迫使您使用软件编码器。您必须将视频帧转换为编码器的 YUV 平面格式。请参阅libyuv以获得优化的转换器。
如果您可以限制对 API 16 及更高版本的支持,则使用官方 Java MediaCdec API会更安全。