ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android播放透明视频(转载)

2021-08-03 23:00:16  阅读:139  来源: 互联网

标签:视频 透明 特效 alpha Android 播放 android


话不多说,开局一张图,内容全靠“编”:

 


播放透明视频

随着业务场景的增多,更多的特效用原生绘制、GIF的方式都不能很好的满足需求了,这就带来了一个新的方式:用视频特效来代替。特别是在视频(直播)行业中,各种特效炫酷又精美,能很好的表达用户的想法。但是这也带来了一个问题:虽然播放视频非常简单,但是同时要把视频下面的UI也展示出来就没那么简单了,这就需要视频有透明效果,这样才能不遮挡底层UI。既然写了这篇博客,自然有很简单的方式来实现这种透明视频的播放了,那就是用第三方库《wlmedia》,几句代码就能实现透明视频的播放。

一、先来大致说一下透明视频播放原理(只是单纯的调用库也不好):

视频播放一般都会把视频数据(大部分是yuv)转换为rgba来渲染(播放),实际情况我们也是这么做的,拿到rgba颜色数据之后通过OpenGL绘制到surface上面,此时渲染出来的视频就是正常的(不透明的),因为我们默认alpha通道为1(1完全不透明,0完全透明)。当我们需要达到透明效果时就需要控制alpha通道的值,在渲染像素点的颜色时并考虑当前像素点的透明度,这样渲染出来的颜色值就是带透明度的,这样透明视频的播放就可以实现了。

二、播放透明视频的方式:

1、过滤某一范围的颜色值(最简单,适用于任一视频,但效果不佳,类似于电影绿布效果):

比如我们把特效视频背景设置成黑色 [r(0) g(0) b(0)],然后特效用其他颜色来实现(尽量不要包含黑色),这样我们渲染时就可以判断当前像素的rgb分量值是否接近0,如果接近0,那么就把此像素的alpha值设置成0(完全透明),这样这个像素点就不会显示出来,达到了透明的效果;反之若此像素的rgb分量值与0相差比较大,此时设置alpha的值为1(完全不透明),这样这个像素点就显示出来了,我们的特效也就显示出来了。

2、制作包含alpha分量值的视频(复杂,视频需定制):

这种视频常见的制作效果是alpha值和特效左右平分,alpha值用黑白特效视频制作(纯黑色为0-完全透明,纯白色为1-完全不透明,其余颜色介于(0~1-部分透明)之间),当渲染视频时,首先去拿特效的rgb值,然后再通过rgb的坐标位置去拿alpha值,这样结合起来就可以实现透明效果,当然播放时我们只需要裁剪播放特效视频那一部分区域。比如:特效rgb值是 rgb(100)红色,此时这个值对应的alpha的值的rgb值为(0.5,0.5,0.5),这样我们就取到了透明度alpha=0.5,最终渲染像素点时的rgba值就是rgba(1,0,0,0.5)成了半透明的红色。

三、SDK调用方式:

虽然原理和实现讲了,但是要完全实现效果出来还是有一定的难度,下面我们就开的调用wlmedia的库了,简直so easy!

1、gradle中导入库:目前最新版本 1.1.3

implementation 'ywl.ywl5320:wlmedia:1.1.3'
2、设置布局:

//位于所有布局上层
<com.ywl5320.wlmedia.surface.WlSurfaceView
android:id="@+id/wlsurfaceview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="invisible"/>

//和普通view一样可随意设置位置
<com.ywl5320.wlmedia.surface.WlTextureView
android:id="@+id/wltextureView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="invisible"/>
3、开始播放(关键代码)

WlSurfaceView wlSurfaceView = findViewById(R.id.wlsurfaceview);
wlSurfaceView.enableTransBg(true); //设置surface背景透明
WlMedia wlMedia = new WlMedia();
wlSurfaceView.setWlMedia(wlMedia);
wlMedia.setSourceType(WlSourceType.NORMAL);
wlMedia.setCodecType(WlCodecType.CODEC_MEDIACODEC);
wlMedia.setLoopPlay(false);
wlMedia.setVideoClearColor(0, 0, 0, 0); //设置surface颜色透明
wlMedia.enableTransVideo(WlVideoTransType.VIDEO_TRANS_LEFT_ALPHA); //设置alpha通道类型(左边)
wlMedia.prepared();

以上就是播放透明视频的原理和方法,不止在android中,其他平台也是一样的,原理才是核心。

Demo下载地址:GitHub:alphavideo
注:部分视频素材来自AlphaPlayer

标签:视频,透明,特效,alpha,Android,播放,android
来源: https://www.cnblogs.com/grimm/p/15096805.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有