这是我的场景:
- 从网上下载 avi 电影
- 打开位图资源
- 将此位图叠加在影片底部的所有背景帧上
- 将视频保存在外部存储上
- 视频长度通常为 15 秒
这可以使用 MediaMuxer 来实现吗?很高兴收到有关此事的任何信息
我一直在寻找http://bigflake.com/mediacodec/#DecodeEditEncodeTest(感谢@fadden),它在那里说:
“在 Nexus 5 上解码帧并将其复制到 ByteBuffer
glReadPixels()
中大约需要 8 毫秒,速度足以跟上 30fps 输入的速度,但是将其作为 PNG 保存到磁盘所需的额外步骤非常昂贵(大约半秒) "
所以几乎 1 秒/帧是不可接受的。从我的想法来看,一种方法是将每个帧保存为 PNG,打开它,在其上添加位图叠加,然后保存。然而,这将花费大量时间来完成。
我想知道是否有办法做这样的事情:
- 从外部存储打开视频文件
- 开始解码
- 每个解码的帧都将随着内存中的位图覆盖而改变
- 帧被发送到编码器。
在iOS上,我看到有一种方法可以获取原始音频+原始视频+图像并将它们添加到容器中,然后对整个内容进行编码......
我应该切换到 ffmpeg 吗?ffmpeg 的稳定性和兼容性如何?我是否冒着与 android 4.0+ 设备的兼容性问题的风险?有没有办法使用 ffmpeg 来完成这个?我是这个领域的新手,还在做研究。
多年后的编辑:
问题已经过去了很多年,而且 ffmpeg 在许可方面并不是很容易添加到商业软件中。这是如何演变的?使用默认 sdk 的较新版本的 android 在这方面的能力更强?
稍后再编辑
我因发布信息作为答案而获得了一些反对票,因此我将编辑原始问题。这是一个很棒的库,从我的测试来看,它确实将水印应用于视频,并使用进度回调进行处理,从而更容易向用户显示进度,并且还使用默认的 android sdks。https://github.com/MasayukiSuda/Mp4Composer-android
该库使用 Android MediaCodec API 生成 Mp4 电影并应用过滤器、缩放和旋转 Mp4。
示例代码,可能如下所示:
new mp4Composer(sourcePath, destinationPath)
.filter(new GlWatermarkFilter(watermarkBitmap)
.listener(){
@Override
private void onProgress(double value){}
@Override
private void onCompleted(double value){
runOnUiThread( () ->{
showSneakbar
}
}
@Override
private void onCancelled(double value){}
@Override
private void onFailed(Exception e){}
}).start();
在模拟器上进行测试,似乎在 android 8+ 上运行良好,而在旧版本上会生成黑色视频文件。但是,在真实设备上进行测试时似乎可以正常工作。