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

这是我的情况:

  • 从网上下载一个AVI电影
  • 打开一个位图资源
  • 在背景中的所有帧上将该位图覆盖在电影的底部
  • 将video保存在extarnal存储中
  • video长度通常是15秒

这可能实现使用MediaMuxer? 任何关于此事的信息都很乐意收到

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

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

所以几乎1秒/帧是不可接受的。 从我想的一种方法是将每个帧保存为PNG,打开它,添加位图覆盖,然后保存。 然而,这将需要很长时间才能完成。

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

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

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

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


多年后编辑:
自从这个问题已经过去了几年,ffmpeg在许可证方面不太容易添加到商业软件中。 这是怎么演变的? Android的更新版本更多的能力与默认的SDK?

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

我不太了解MediaMuxer,但ffmpeg确实支持覆盖function。 FFMPEG有各种滤波器,其中之一是覆盖滤波器。 我的理解是你想在video上叠加一个图像(即png),ffmpeg肯定是做这个工作的一个有用的框架。 你可以设置输出格式,你可以设置图像的坐标将被过度播放。

例如

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

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

有关filter的更多信息可在以下网站获得,

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

如果这是解决您的问题,则需要与上述命令相同的C代码。 您还需要查看ffmpeg的性能,因为它是纯粹的软件框架。

希望我已经正确理解你的问题,这有助于。

您可以尝试INDE媒体包 – https://software.intel.com/zh-cn/articles/intel-inde-media-pack-for-android-tutorials

它具有MediaComposer类和几个示例效果(如JpegSubstituteEffect)的代码转换\ remuxingfunction – 它显示了如何使用jpg文件和TextOverlayEffect中的图片替代video帧,以便在video帧上叠加文本等。可以很容易地增强水印效果

在这里输入图像说明

如果您需要在Android设备上不使用ffmpeg ,请执行以下操作:

https://github.com/google/grafika开始

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

脚步:

  1. 将mInputWindowSurface设置为video编码器input表面。

  2. 使用MoviePlayer作为video(外部)纹理解码来自videostream的帧。

  3. 在Surface上绘制这个video纹理。

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

  5. 通知MediaCodec准备编码
    ( mVideoEncoder.frameAvailableSoon();, mInputWindowSurface.setPresentationTime(timeStampNanos); ) …转到步骤2

不要忘记调整解码的速度。 只要去掉例子中设置的SpeedControlCallback解码60 FPSvideo。

这种方式的优点:

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

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

这对我来说是有效的:

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

ffmpeg推荐使用-strict -2来允许使用实验性编解码器。 如果没有包含,上面所接受的答案就失效了。