Android:如何使用mediacodec将两个重叠的视频保存为一个?

时间:2015-04-01 08:44:36

标签: android video ffmpeg android-mediaplayer mediacodec

我想在android上做类似于this的事情。

我想从文件加载视频并通过一些转换显示两次(主要是调整大小)。我想将其编码为一个视频文件。

是否可以在原生android中执行此操作?使用mediacodec或以任何其他方式?

我知道有一个ffmpeg,但我在编译它和使用Xamarin时遇到了麻烦。

3 个答案:

答案 0 :(得分:1)

MMSF允许您在屏幕上显示两次视频。 MediaCodec用于所有视频解码操作。不需要特殊的解码/额外库。 MMSF仅使用现有的Android Java API(MediaCodec / GLES)。将片段显示到多个地理测量的目标可以在片段着色器中相对容易地完成。 MMSF样本#2说明了如何显示多个视频,但可以进行调整以使单个视频显示1次或更多次到屏幕。在片段FragmentShader.java中,您可能希望将纹理采样器更改为来自同一源而非唯一采样器的所有样本。例如,texture2D(sTexture2,texCoord)将变为texture2D(sTexture,texCoord)等等。这将导致同一视频多次应用于不同的几何体。也可以通过修改gles2layout.java来更改平铺几何体以满足您的特定需求,或者您可以完全替换实现并简单地提供您自己的顶点数据。这将产生重叠效应。各个像素处理算法&缩放操作/变换也可以应用于几何体或使用fragement / vertex着色器来实现其他处理目标,并且可以使用每顶点颜色作为特定几何体的目标,作为应用效果的指示。另一个非常简单的方法是通过纹理坐标映射的一些创造性使用。希望这有帮助,祝你好运!

答案 1 :(得分:1)

尝试使用Google的ExoPlayer library。对于活动布局,使用带有两个TextureView的FrameLayout,一个大,一个小,顶部较小,以产生重叠效果。

ExoPlayer demo code is here

此外,ExoPlayer是MediaCodec(API 16)之上的一个层,这意味着这将返回到JellyBean 4.1。

<强> 更新

在两个TextureView中播放两个视频,您可以将输出录制到视频文件中。

高级概述:

(我稍后会尝试提供更好的代码示例)

初始化

  • 准备基于位图的画布
  • 准备MediaEncoder
  • 准备MediaMuxer

在周期性循环中(即每30毫秒一次):

  • 将根视图绘制到Canvas
  • 将位图排队到MediaEncoder
  • Mux to MP4

答案 2 :(得分:0)

要在测试中放置多个重叠的视频帧,您可以使用多媒体示例框架: https://software.intel.com/sites/landingpage/mmsf/documentation/mmsf_android_example2.html

enter image description here

要从纹理创建视频文件,您可以尝试使用英特尔INDE Media for Mobile中的GLCapture。教程在这里:https://software.intel.com/en-us/articles/intel-inde-media-pack-for-android-tutorials-video-capturing-for-opengl-applications,样本在这里:https://github.com/INDExOS/media-for-mobile。唯一的问题是GLCapture不支持文件中的音频,因此如果您需要音频,则可能需要通过MediaCodec方式。