Android上透明视频的实现

17

有没有办法让Android播放具有透明区域的视频?当我尝试在VideoView中播放包含透明区域的WebM视频时,视图的背景仍然是黑色的。我希望在透明区域能够看到父视图的背景而不是黑色。

目前唯一有效的解决方案是将视频帧制作成可绘制动画,但这不太节省内存。


所以你想让你的活动背景透明,只有VideoView对用户可见?你尝试过什么了吗?也许我有一个解决方案... - Mike
1
不,我想要播放一个有透明区域的视频,这样父视图的背景就可以透过视频看到。 - hleinone
你可以使用MediaCodec将帧解码为SurfaceTexture,然后使用GLES渲染纹理。这需要视频编解码器将解码到支持透明度的纹理格式。我不知道它是否支持。 - fadden
你实现了这个吗? - Taranmeet Singh
不,我最终将其作为可绘制动画完成,并降低了可绘制分辨率和帧速率。 - hleinone
3个回答

4
我认为这个可以解决你的问题 尝试这个 https://github.com/pavelsemak/alpha-movie 这是演示例子,
<RelativeLayout
                android:id="@+id/mainContent"
                android:layout_width="match_parent"
                android:layout_height="200dp">

                <ImageView
                    android:id="@+id/imageView"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:scaleType="fitXY"
                    android:src="@drawable/bg1" />

                <com.alphamovie.lib.AlphaMovieView
                    android:id="@+id/alpha_video_view"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_centerInParent="true"
                    app:accuracy="0.7"
                    app:alphaColor="#000000"/>

            </RelativeLayout>

3
我认为实现这个功能的最佳方法是使用OpenGL ES - 通过表面渲染视频,并编写一个小型着色器来去除您想要删除的颜色区域。 您可以在网上找到几个使用此技术的示例,也许这个链接可以提供一些启动帮助: First steps in creating a chroma key effect using android camera

1
我在 Krishna 的回答基础上创建了一个 alpha-movie 的分支,可以播放带有 Alpha 数据的透明视频,每个帧都需要单独包含这些数据。
这意味着您可以将透明的 webm 视频转换为普通的 mp4 格式,并与 AlphaMovieView 一起使用。与色度键方法相比,它能够产生准确的透明度,允许部分透明度,并且不需要手动设置 Alpha 颜色。但是,您需要处理透明视频。

An example of an "alpha packed" video

  1. 将以下内容添加到您的项目中以安装软件包。源代码在此处: https://github.com/nopol10/alpha-movie
    // project's (top level) build.gradle
    repositories {
        // ...
        mavenCentral()
    }


    // module's build.gradle
    dependencies {
        // ...
        implementation 'io.github.nopol10:alpha-movie:1.3.4'
        // ...
    }
  1. 下载ffmpeg。建议使用最新版本,并确保其中包含libvpx。
  2. 在终端运行以下命令:ffmpeg -vcodec libvpx -i input_video.webm -vf "split [a], pad=iw*2:ih [b], [a] alphaextract, [b] overlay=w" -x264opts keyint=30 -y output_video.mp4。将input_video.webmoutput_video.mp4替换为所需的输入文件和输出文件名。
  3. 将生成的mp4文件放置于Android项目的assets文件夹中。
  4. 将以下内容添加到您的布局xml中:
<com.alphamovie.lib.AlphaMovieView
    android:id="@+id/video_player"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    custom:packed="true"
/>
  1. Add this to your activity/fragment
alphaMovieView = (AlphaMovieView) findViewById(R.id.video_player);
alphaMovieView.setVideoFromAssets("output_video.mp4");
  1. 结果:演示应用程序的截图

这种方法受到AVProVideo中的功能启发。


如果视频不在应用程序内怎么办?这意味着应用程序将需要使用ffmpeg创建一个新视频?但那样会涉及到不同的许可证,并且变得更大,对吗?难道没有一种解决方案可以直接使用WEBM,并处理WEBM已经支持的透明度吗?或者可能是我没有理解存储库?根据我所看到的,它仅处理MP4,就好像它支持alpha通道一样。这是正确的吗?请解释。 - android developer
要使用此功能,您必须执行额外的预生成和捆绑视频的步骤,使用任何工具,其中之一是ffmpeg,以上面显示的视觉格式(第一个截图)。 如果您想使用此解决方案播放外部视频(例如通过URL),该视频必须具有相同的视觉格式,以便捆绑着色器产生正确的输出和透明度。 这不应该是一个简单的解决方案,可以让您直接播放带有透明度的webm。我也对拥有这样的解决方案感兴趣,这样我就不必这样做了。如果您找到了解决方案,请告诉我。 - Copripop
那么你的意思是我必须使用一些库来创建一个新视频?没有办法只是透明地播放它,因为WEBM支持它吗?Chrome有这个功能,而Android没有?我已经创建了一个请求来支持它:https://issuetracker.google.com/issues/220464193。请考虑点赞。 - android developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接