前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为播放器外接一套渲染框架

为播放器外接一套渲染框架

作者头像
马上就说
发布2023-03-05 14:47:01
4530
发布2023-03-05 14:47:01
举报
文章被收录于专栏:码上就说码上就说

在一堆VideoEditor的技术文章中插入一篇播放器的文章,稍微有点违和,但是本文还是有必要讲讲的,因为它能给我们一点启示:原来播放器不是被动接收数据,还能主动进攻。我做播放器也很久了,今天不想谈播放器的性能优化和内部原理,谈谈播放器的渲染框架。

如果你有一定的音视频基础,其实从头开发一个播放器并非难事,自己从头开发的播放器可定制化程度就非常高,基本上没有你做不到的,只有你想不到的。但是实际工作中自己做出来一个播放器并不难,但是稳定性好不好,扩展性强不强,跨平台怎么样等等这系列问题你做出来的播放器未必符合要求,现在比较受开发者喜欢的播放器框架有ijkplayer、ExoPlayer、VLC等等,这些播放器贡献者众多,稳定性都很好,而且得到了市场的充分验证,但是不太好定制。诚然它们可以实现播放器的基本功能。但是改变渲染方式似乎有点难,现在的播放器一般都支持SufaceView和TextureView两种View,我如果想在渲染出来的画面上定制绘制一些东西就不太容易做到。例如我加个水印、加一层滤镜、调个色等等。

记得之前公司曾经有个需求,要在播放的视频中加上水印,这个问题有两种处理方案:

  • 方案一:SurfaceView或者TextureView上加一个ImageView
  • 方案二:视频渲染使用OpenGL渲染,渲染纹理的时候将水印加上

方案一是一个很取巧的方案,我加一个ImageView来显示水印,ImageView和SurfaceView是两个分层的View,这样的处理有两个不太方便的地方:

  • SurfaceView调整大小或者位置的时候ImageView也需要跟着调整,可能会出现不连贯的情况,让用户看出破绽。
  • 截图的时候做法比较麻烦,需要使用Canvas合成。

虽然最终也能实现我们的需求,但是总归感觉怪怪的,毕竟Paint和Canvas能实现的功能有限,如果要实现其他复杂的效果时,第一种方案就不太容易了。下面有几个播放器渲染方面的需求:

  • 实现播放视频左右或者上下翻转
  • 改变播放视频的亮度、对比度、色温、饱和度、锐度等等
  • 在播放器上面加一层滤镜
  • 播放界面以圆形、心形、五角星等形状展示

以后还会有VR视频,就必须要定制渲染引擎。这时候大家可能会说GLSurfaceView可以支持OpenGL来实现上面的需求,确实可以,但是本人比较讨厌使用GLSurfaceView,其他分析过GLSurfaceView源码就知道了,GLSurfaceView继承了SurfaceView,内部创建了EGL环境。帮我们省了一点事情,但是也束缚了我们的手脚,不太喜欢定制化这么强的。我们还是自己借助SurfaceView来搭建一个渲染框架吧。

以ijkplayer播放器为例,我们需要提供一个Surface给IjkMediaPlayer实例,至于这个Surface是SurfaceView---> onSurfaceCreate回调的,还是你自己创建的,没人care,传统的方式都是直接将SurfaceView回调的onSurfaceCreate中的Surface直接设置给播放器,但是想要定制视频播放的Surface,这种方法不可取。

这里出现了两个Surface,一个Surface来自SurfaceView创建的,实际上是画布,另一个Surface是我们在EGL环境中通过OES纹理创建的,最终设置给播放器,然后我们通过监听播放器对这个Surface的处理,在画布上实时绘制我们想要的东西。

下面看一下呈现的效果:

原图/水平镜像/垂直镜像

加一层滤镜:滤镜是可以调整强度的

调整亮度:

调整对比度:

调整色温:下面是冷色调

调整饱和度:

调整颗粒度:

调整锐度:

加个火腿肠:

如果你还有一些有趣的需求,可以私信我。我们一起完成它。

本文谈到的视频调色,其实可以稍微拓展一点,上面说的都是手动调色,你知道智能调色吗?后面我们继续展开。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 音视频平凡之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档