【问题标题】:Video with transparency on AndroidAndroid 上的透明视频
【发布时间】:2014-12-05 15:55:52
【问题描述】:

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

到目前为止,我发现的唯一可行的解​​决方案是从视频帧中创建一个可绘制的动画,这不是很节省内存。

【问题讨论】:

  • 所以你希望你的活动背景是透明的,只有 VideoView 应该对用户可见?你尝试了什么?也许我有一个解决方案..
  • 不行,我要播放一个有透明区域的视频,这样可以通过视频看到父视图的背景。
  • 您可以使用 MediaCodec 将帧解码为 SurfaceTexture,然后使用 GLES 渲染纹理。这将要求视频编解码器解码为支持 alpha 的纹理格式。我不知道它是否会这样做。
  • 你做到了吗??
  • 不,我最终将它作为一个可绘制动画并降低了可绘制分辨率和帧速率。

标签: android webm vp8


【解决方案1】:

我认为这将解决您的问题 试试这个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>

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      除了 Krishna 的回答之外,我还创建了一个 alpha-movie 的分支,它播放透明视频,每个帧中分别包含 alpha 数据。

      这意味着您将能够将透明 webm 视频转换为普通 mp4 以用于 AlphaMovieView。与色度键方法相反,它产生准确的透明度,允许部分透明度,并且不依赖于您必须手动设置 alpha 颜色。但是,您需要对透明视频进行预处理。

      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. 将此添加到您的活动/片段中
      alphaMovieView = (AlphaMovieView) findViewById(R.id.video_player);
      alphaMovieView.setVideoFromAssets("output_video.mp4");
      
      1. 结果:

      此方法的灵感来自 AVProVideo 中的功能。

      【讨论】:

      • 如果视频不在应用程序中怎么办?这意味着应用程序必须使用 ffmpeg 创建新视频?但随后它转到不同的许可证,并且变得更大,不是吗?难道没有一个解决方案可以按原样使用 WEBM,并处理 WEBM 已经支持的透明度吗?或者也许我不了解存储库?据我所见,它只处理 MP4,就好像它支持 alpha 通道一样。这样对吗?请解释一下。
      • 要使用它,您必须使用任何工具执行一个额外的步骤,即以上述可视格式(第一个屏幕截图)预生成和捆绑视频,ffmpeg 就是其中之一。如果您想使用此解决方案以透明方式播放外部视频(例如通过 URL),则该视频必须具有与捆绑着色器相同的视觉格式才能产生正确的输出+透明度。这不应该是一个简单的解决方案,可以让您开箱即用地播放 webm。我也有兴趣,所以我不必这样做,如果您遇到解决方案,请告诉我
      • 所以你说我将不得不使用一些库来创建一个新视频?由于WEBM支持它,没有解决办法只用透明播放它吗? Chrome有这个能力,Android没有?我创建了一个支持它的请求:issuetracker.google.com/issues/220464193。请考虑主演。
      猜你喜欢
      • 1970-01-01
      • 2019-11-08
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      相关资源
      最近更新 更多