有没有办法让Android播放带有透明区域的视频?当我尝试在 VideoView 中播放包含透明区域的 WebM 视频时,视图的背景仍然是黑色。而不是黑色,我希望在透明区域上看到父视图的背景。
到目前为止,我发现的唯一可行的解决方案是从视频帧中创建一个可绘制的动画,这不是很节省内存。
我认为这将解决你的问题试试这个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>
我能想到的最好的方法是使用 OpenGL ES——你通过一个表面渲染视频,然后编写一个小的着色器来移除你想要移除的颜色区域。你可以在网上找到这个技术的几个例子,也许这个链接可以提供一些启动: First steps in create a chroma key effect using android camera
除了 Krishna 的回答之外,我还创建了一个 alpha-movie 分支,它播放透明视频,每个帧中分别包含 alpha 数据。
这意味着您将能够将透明webm视频转换为普通 mp4 以与 AlphaMovieView 一起使用。与色度键方法相反,它产生准确的透明度,允许部分透明度,并且不依赖于您必须手动设置 alpha 颜色。但是,您需要对透明视频进行预处理。
// project's (top level) build.gradle
repositories {
// ...
mavenCentral()
}
// module's build.gradle
dependencies {
// ...
implementation 'io.github.nopol10:alpha-movie:1.3.4'
// ...
}
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.webm和output_video.mp4替换为所需的输入文件和输出文件名。<com.alphamovie.lib.AlphaMovieView
android:id="@+id/video_player"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
custom:packed="true"
/>
alphaMovieView = (AlphaMovieView) findViewById(R.id.video_player);
alphaMovieView.setVideoFromAssets("output_video.mp4");
此方法的灵感来自AVProVideo中的功能。