3

我正在尝试从 android 中的一系列图像创建视频。我遇到过这三个选项 MediaCodec、ffmpeg 使用 ndk 和 jcodec。有人可以让我知道其中哪一个是最好和最简单的。我没有找到任何合适的文档,所以有人可以发布他们的工作示例吗?

4

3 回答 3

4

如果您通常谈论 API 4.3+,您需要从编码器获取输入表面,将图像复制到表面附带的纹理,放置正确的时间戳并将其发送回编码器。然后去做

fps (frames per second) * resulted video duration in seconds

次。编码器后的编码器比特流应该去复用器,所以最后你会得到 mp4 文件。它需要相当多的编码:)

我建议您尝试免费的英特尔媒体包:https ://software.intel.com/en-us/articles/intel-inde-media-pack-for-android-tutorials

它有一个示例 - JpegSubstituteEffect,它允许从图像创建视频。这个想法是拍摄一个虚拟视频(黑色视频和安静的音频)并通过处理图像来替换所有黑色帧。它可以很容易地增强为从一系列图像创建视频。我知道 Google Play 中有几个应用程序使用 Media Pack 制作相同的内容

于 2014-07-21T13:44:09.003 回答
3

我尝试了适用于 Android 的 JCodec 1.7。与其他两个选项相比,这非常简单并且有效。android 包中有一个 SequenceEncoder 类,它接受 Bitmap 实例并将它们编码为视频。我最终将这个类克隆到我的应用程序中以覆盖一些设置,例如 fps。JCodec 的问题在于性能很差——编码单个 720x480 像素帧只需要大约 45 秒。我想制作全高清的延时视频,最初认为任何编码器都​​会这样做,因为我不希望对帧进行编码需要超过一秒(我的应用程序中帧之间的最小间隔为 3 秒)。正如您所猜测的那样,每帧 45 秒 JCodec 并不合适。

我正在监视您的问题,以寻找可能有帮助的其他答案。

MediaCodec/MediaMuxer 的方式看起来不错,但它非常复杂。我需要了解很多关于 OpenGL ES、视频格式和一些 Android 巫术的知识才能做到这一点。哦,这仅适用于最新的手机 4.3+。这对谷歌来说是真正的耻辱,因为他们声名鹊起。我发现了一些关于该主题的 Stackoverflow 讨论。存在两个子路径 - OpenGL 方式与设备无关。还有另一种方法涉及将 RGB 位图数据转码为 YUV。YUV 的问题在于它有 3 种风格,具体取决于设备硬件 - 平面、半平面和半平面压缩(我不确定未来是否会出现第 4 种方式,所以......)。

这里有几个关于 OpenGL 方式的有用链接

CTS 测试 - https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java

许多 CTS 喜欢测试 - http://bigflake.com/mediacodec/#EncodeDecodeTest

其中两个似乎相关且有用

EncodeAndMuxTest - http://bigflake.com/mediacodec/EncodeAndMuxTest.java.txt CameraToMpegTest - http://bigflake.com/mediacodec/CameraToMpegTest.java.txt(我相信这是最接近我需要的,只需要了解所有 OpenGL voodoo 并让我的位图作为填充整个帧的纹理,即投影、相机和不发挥作用的东西)

ffmpeg 路由似乎也不够直接。C++ 中的某些东西接受来自 Java 的东西......我想首先需要将 Bitmap 一些奇怪的转换为 byte[]/ByteBuffer - cpu 密集且缓慢。我实际上有 JPEG byte[] 但不确定这对 ffmpeg 库是否会派上用场。我不确定 ffmpeg 是否正在利用 GPU 或其他硬件加速,因此它很可能会以每帧 10 秒的速度结束并真正烘烤手机。

于 2014-08-01T16:15:47.087 回答
0

FFmpeg 可以实现这个任务。您首先需要在 Android 中编译 ffmpeg 库(请参阅这篇文章“如何在您自己的 FFmpeg 构建中使用 Vitamio ”)

您可以参考 FFmpeg 中的示例来了解如何实现您的任务。

在 Android 中用 C++ 实现你的任务;然后使用 JNI 将 C++ 代码集成到您的 Android 应用程序中。

于 2014-07-22T23:05:32.197 回答