我正在尝试从android中的一系列图像创建视频。 我使用ndk和jcodec遇到了这三个选项MediaCodec,ffmpeg。有人可以让我知道哪一个是最好和最容易的。我没有找到任何适当的文档,所以有人可以发布他们的工作示例吗?
答案 0 :(得分: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进行相同的操作
答案 1 :(得分:2)
我尝试使用JCodec 1.7 for Android。与其他两个选项和作品相比,这非常简单。 android包中有类SequenceEncoder,它接受Bitmap实例并将它们编码为视频。我最终将此类克隆到我的应用中以覆盖某些设置,例如FPS。 JCodec的问题在于性能令人沮丧 - 编码单个720x480像素帧仅需45秒。我想在全高清时可以做截图视频,并且最初认为任何编码器都会这样做,因为我没想到编码帧需要花费超过一秒的时间(我的应用中帧之间的最小间隔是3秒)。正如你猜测每帧45秒JCodec不合适。
我正在监控您的问题以寻找可能有用的其他答案。
MediaCodec / MediaMuxer方式似乎还可以,但它非常复杂。我需要学习很多关于OpenGL ES,视频格式和一些Android voodoo来实现这一目标。哦,这只适用于最新的4.3+手机。对于谷歌来说,这是他们声名鹊起的真正耻辱。我在这个主题上找到了一些Stackoverflow讨论。存在两个子路径 - OpenGL方式与设备无关。还有另一种方法涉及将RGB位图数据转码为YUV。与YUV的关系是它有3种口味,具体取决于设备HW - 平面,半平面和半平面压缩(我不确定未来是否会出现第4种方式......)。
以下是OpenGL方式的几个有用链接
很多CTS都喜欢测试 - http://bigflake.com/mediacodec/#EncodeDecodeTest
其中两个似乎相关且有用
EncodeAndMuxTest - http://bigflake.com/mediacodec/EncodeAndMuxTest.java.txt CameraToMpegTest - http://bigflake.com/mediacodec/CameraToMpegTest.java.txt(我相信这最接近我需要的东西,只需要了解所有的OpenGL伏都教并让我的Bitmap作为纹理填满整个帧,即投影,相机和什么不起作用)
ffmpeg路线似乎也不够直接。 C ++中的东西接受来自Java的东西...我想首先需要将Bitmap奇怪地转换为byte [] / ByteBuffer - cpu密集和慢。我实际上有JPEG byte []但不确定这对ffmpeg库会派上用场。我不确定ffmpeg是否正在利用GPU或其他硬件加速功能,因此它最终可以达到每帧10秒并且真正烘焙手机。
答案 2 :(得分:0)
FFmpeg可以实现此任务。您首先需要在Android中编译ffmpeg库(请参阅此文章“How to use Vitamio with your own FFmpeg build”)
您可以参考FFmpeg中的示例来确定如何实现您的任务。
在Android中用C ++实现你的任务;然后使用JNI将C ++代码集成到您的Android应用程序中。