这是我的场景:
- 从网络下载 avi 电影
- 打开位图资源
- 将此位图叠加在影片底部的所有背景帧上
- 将视频保存在外部存储中
- 视频长度通常为 15 秒
这可以使用 MediaMuxer 来实现吗?很高兴收到有关此事的任何信息
我一直在寻找 http://bigflake.com/mediacodec/#DecodeEditEncodeTest (感谢@fadden),上面写着:
"Decoding the frame and copying it into a ByteBuffer with
glReadPixels()
takes about 8ms on the Nexus 5, easily fast enough to keep pace with 30fps input, but the additional steps required to save it to disk as a PNG are expensive (about half a second)"
所以几乎 1 秒/帧是 Not Acceptable 。从我的想法来看,一种方法是将每个帧保存为 PNG,打开它,在其上添加位图叠加,然后保存。然而,这将花费大量时间来完成。
我想知道是否有办法做这样的事情:
- 从外部存储打开视频文件
- 开始解码
- 每个解码的帧都会随着内存中的位图覆盖而改变
- 帧被发送到编码器。
在 iOS 上,我看到有一种方法可以获取原始音频 + 原始视频 + 图像并将它们添加到容器中,然后对整个内容进行编码......
我应该切换到 ffmpeg 吗? ffmpeg 的稳定性和兼容性如何?我是否冒着与 android 4.0+ 设备的兼容性问题的风险?有没有办法使用 ffmpeg 来完成这个?我是这个领域的新手,还在做研究。
多年后编辑:
这个问题已经过去了好几年,而且 ffmpeg 在许可方面并不是很容易添加到商业软件中。这是如何演变的?使用默认 sdk 的较新版本的 android 在这方面的能力更强?
稍后再编辑
我因发布信息作为答案而获得了一些反对票,因此我将编辑原始问题。这是一个很棒的库,从我的测试来看,它确实将水印应用于视频,并通过进度回调来实现,这使得向用户显示进度变得更加容易,并且还使用了默认的 android sdks。 https://github.com/MasayukiSuda/Mp4Composer-android
This library generate an Mp4 movie using Android MediaCodec API and apply filter, scale, and rotate 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+ 上可以正常工作,而在旧版本上会生成黑色视频文件。但是,在真实设备上测试时似乎可以正常工作。
最佳答案
我对 MediaMuxer 了解不多,但 ffmpeg 确实支持覆盖功能。 FFMPEG 有各种过滤器,其中之一是覆盖过滤器。我的理解是您想在视频上叠加图像(即 png),ffmpeg 肯定是完成这项工作的有用框架。您可以设置输出格式,您可以设置要过度播放的图像的坐标。
例如
ffmpeg -i input.avi -i logo.png -filter_complex 'overlay=10:main_h-overlay_h-10' output.avi
上面的命令在左下角的 input.avi 视频文件上添加了覆盖 logo.png。
有关过滤器的更多信息,请访问以下网站,
https://www.ffmpeg.org/ffmpeg-filters.html#overlay-1
如果这是您的问题的解决方案,您需要与上述命令等效的 C 代码。您还需要查看 ffmpeg 的性能,因为它是一个纯软件框架。
希望我正确理解了您的问题,这对您有所帮助。
关于android - 在android : 4. 3的MediaMuxer或ffmpeg中的视频上添加水印位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25358489/