android - 在android : 4. 3的MediaMuxer或ffmpeg中的视频上添加水印位图

标签 android ffmpeg mp4 android-mediacodec mediamuxer

这是我的场景:

  • 从网络下载 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,打开它,在其上添加位图叠加,然后保存。然而,这将花费大量时间来完成。

我想知道是否有办法做这样的事情:

  1. 从外部存储打开视频文件
  2. 开始解码
  3. 每个解码的帧都会随着内存中的位图覆盖而改变
  4. 帧被发送到编码器。

在 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/

相关文章:

android - 粘性事件应该在应用程序关闭后保留 GreenRobot Eventbus

android - 文本未显示在按钮小部件上

android - 向对话框添加肯定按钮

ffmpeg - 在级联视频上添加 Logo

video - 具有多个 mp4 文件的 ffmpeg 分段到 HLS 流

Android MediaPlayer Streaming setDataSource FileNotFoundException : No content provider

video - 如何使用 ffmpeg 从网络摄像头访问压缩流

macos - Ffmpeg 支持来自 OS X 的带有音频的 rtmp 广播

ffmpeg - 将 mkv 转换为 mp4 vs ogv vs webm

ffmpeg - 从 MP3 创建碎片化的 MP4