在android中添加水印位图:4.3的MediaMuxer或ffmpeg

这是我的情景:

  • 从网上下载avi电影
  • 打开位图资源
  • 在背景中的所有帧上将此位图叠加在电影的底部
  • 将video保存在extarnal存储上
  • video长度通常为15秒

这可能是使用MediaMuxer实现的吗? 很高兴收到有关此事的任何信息

我一直在寻找http://bigflake.com/mediacodec/#DecodeEditEncodeTest (谢谢@fadden),它说:

“解码帧并将其复制到带有glReadPixels()的ByteBuffer,在Nexus 5上大约需要8ms,速度足够快以跟上30fps的输入速度,但将其作为PNG保存到磁盘所需的额外步骤很昂贵(大约一半)一秒)”

所以几乎1秒/帧是不可接受的。 根据我的想法,一种方法是将每个帧保存为PNG,打开它,在其上添加位图叠加然后保存它。 然而,这将花费大量时间来完成。

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

  1. 从外部存储打开video文件
  2. 开始解码它
  3. 每个解码帧将通过内存中的位图叠加进行更改
  4. 帧被发送到编码器。

在iOS上,我看到有一种方法可以将原始音频+原始video+图像添加到一个容器中,然后对整个事物进行编码……

我应该切换到ffmpeg吗? ffmpeg的稳定性和兼容性如何? 我冒着与Android 4.0+设备兼容性问题的风险吗? 有没有办法用ffmpeg来实现这个? 我是这个领域的新手,还在做研究。


多年后编辑:
自问题出现以来已经过去了很多年,并且ffmpeg在许可方面很难添加到商业软件中。 这是如何演变的? 较新版本的android在默认的sdk上更有能力吗?

Solutions Collecting From Web of "在android中添加水印位图:4.3的MediaMuxer或ffmpeg"

我对MediaMuxer知之甚少,但ffmpeg确实支持覆盖function。 FFMPEG有各种filter,其中一个是叠加filter。 我的理解是你想要在video上叠加图像(即png),ffmpeg肯定是一个有用的框架来完成这项工作。 您可以设置输出格式,您可以设置要过度显示的图像的坐标。

例如

 ffmpeg -i input.avi -i logo.png -filter_complex 'overlay=10:main_h-overlay_h-10' output.avi 

上面的命令在左下角的input.avivideo文件中添加了overlays logo.png。

有关filter的更多信息,请访问以下网站:

https://www.ffmpeg.org/ffmpeg-filters.html#overlay-1

如果这是您的问题的解决方案,您需要与上述命令等效的C代码。 您还需要查看ffmpeg的性能,因为它是一个纯软件框架。

希望我能正确理解你的问题,这有帮助。

如果你需要在Android设备上没有ffmpeg的情况下这样做:

从以下url开始: https : //github.com/google/grafika

Playvideo(PlayMovieActivity.java)Record Gl App(RecordFBOActivity.java)示例之间的问题答案。

脚步:

  1. 将mInputWindowSurface设置为video编码器输入曲面。

  2. 使用MoviePlayer将video流中的帧解码为video(外部)纹理。

  3. 在Surface上绘制此video纹理。

  4. 在video纹理上的同一个Surface上绘制水印。

  5. 通知MediaCodec表面已准备好进行编码:

     mVideoEncoder.frameAvailableSoon(); mInputWindowSurface.setPresentationTime(timeStampNanos); 

    然后转到第2步。

不要忘记调整解码速度。 只需删除SpeedControlCallback ,在示例中设置为解码60 FPSvideo。

这种方式的优点:

  1. Media Codec使用硬件解码器/编码器进行video处理。

  2. 您可以更改结果video的比特率。

您可以尝试使用INDE Media Pack – https://software.intel.com/en-us/articles/intel-inde-media-pack-for-android-tutorials

它具有代码转换\ remuxingfunction,如MediaComposer类和几个样本效果,如JpegSubstituteEffect – 它显示了如何用jpg文件中的图片替换video帧和TextOverlayEffect来覆盖video帧上的文本等。它可以很容易地增强到水印效果

在此处输入图像描述

这对我有用:

 ffmpeg -i input.avi -i logo.png -filter_complex 'overlay=10:main_h-overlay_h-10' -strict -2 output.avi 

ffmpeg建议使用-strict -2 inorder以允许使用实验编解码器。 没有包含,上面接受的答案不起作用。