美文网首页
Flutter支持视频播放

Flutter支持视频播放

作者: 佐鼬_1282 | 来源:发表于2020-04-21 15:26 被阅读0次

    播放视频文件:

    通过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

    http://www.luoyibu.cn/posts/9703/

    https://www.jianshu.com/p/20aa26799729

    相关文章

      网友评论

          本文标题:Flutter支持视频播放

          本文链接:https://www.haomeiwen.com/subject/eyuauhtx.html