播放视频文件:
通过video_player插件库来实现视频文件的播放。具体集成方式、用法可参考插件介绍,用法较简单。
播放实时数据流:
方案一:
通过共享纹理数据来优化外接纹理的解决方案,来实现视频播放。
在Native和Flutter共享外接纹理后,通过textureId来匹配纹理内存。为了避免CVPixelBufferRef数据在从Native到Flutter的过程带来的内存损耗(GPU->CPU-GPU),通过Flutter侧创建OpenGl context时,将它们的ShareGroup透出,然后在Native侧保存好这个ShareGroup,当Native创建Context时,都会使用这个ShareGroup进行创建。这样就实现了Native和Flutter之间的纹理共享。
参考闲鱼链接:
https://www.yuque.com/xytech/flutter/pfpo68
方案二:
通过共享内存来优化外界纹理texture的解决方案,来实现视频播放。
在Native和Flutter共享外接纹理texture后,通过textureId来匹配纹理内存。同样,为了避免内存损耗,在这里我们采用了共享CVPixelBufferRef内存的方式。在初始化时,调用方法CVPixelBufferCreate()分配CVPixeBuffer内存,接着,CVOpenGLESTextureCacheCreateTextureFromImage()将内存映射到一个纹理上。实际上每一帧数据的流程里,Native侧将数据渲染到纹理上,Flutter侧从纹理中读取数据。
具体实现框架参考代码:
https://github.com/JJzzy/Flutter_ZZYVideoPlayer
注意⚠️:Flutter的Skia渲染引擎只支持BGRA的格式,因此需要将YUV的数据格式进行转化,可以参考下面的链接
https://www.jianshu.com/p/ee35d3832cb0
方案三:
通过video_player组件,通过platformView方式去渲染视频画面。
platformView实际上是在Native侧实现画面渲染后,将这个View传递给Flutter侧,在Flutter直接显示View即可。相对来说,这种方案不存在内存损耗的问题,而且对于Native侧视频播放组件相对成熟、复杂的情况下,这种方式较为方便,不需要重构大量代码。有兴趣的可以研究下如何实现。
参考链接:
https://juejin.im/post/5cbff7cbf265da03a54c1f1b
https://zhuanlan.zhihu.com/p/107556856
网友评论