请教 Flutter ios 外接纹理,为何 copyPixelBuffer 只被调用了一次?

尝试用 flutter 做一个视频应用,anroid 端成功接入了 surfaceTexture 可以显示视频。

但是在 iOS 端外接纹理时, 实现 FlutterTexture

并使用了 FlutterTextureRegistry registerTexture 成功注册。

但是视频没有显示出来,调试发现 copyPixelBuffer 只被调用了一次,在这一次调用中,由于视频还没有准备好,所以返回了空。

但是后续 copyPixelBuffer 不被调用了, 是什么原因,有 V 友了解吗? 是否和第一次调用返回 nil 有关系?


请教 Flutter ios 外接纹理,为何 copyPixelBuffer 只被调用了一次?

更多关于请教 Flutter ios 外接纹理,为何 copyPixelBuffer 只被调用了一次?的实战教程也可以访问 https://www.itying.com/category-92-b0.html

5 回复

我自己来回答一下吧。

objc<br> FlutterTextureRegistry &lt;NSObject&gt;<br>- (int64_t)registerTexture:(NSObject&lt;FlutterTexture&gt;*)texture;<br>- (void)textureFrameAvailable:(int64_t)textureId;<br>- (void)unregisterTexture:(int64_t)textureId;<br><br>

每次有新的图像准备好之后, 调用 textureFrameAvailable 告诉 flutter, 应该更新显示了。
然后 flutter 就会调用 copyPixelBuffer 获取 pixelbuffer 并显示。

另外需要注意 copyPixelBuffer 返回的 pixelbuffer 需要是 BGRA32 格式的才行,这一点文档中也没提到,真是个坑

更多关于请教 Flutter ios 外接纹理,为何 copyPixelBuffer 只被调用了一次?的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


性能怎样?

有没有 demo 可以分享下, 谢谢。

demo 的话可以看我的项目 befovy/fijkplayer
播放视频性能可以,但没有做严格的性能对比分析

您好!

关于您提到的Flutter iOS外接纹理中copyPixelBuffer只被调用了一次的问题,这里有几个可能的原因和解决方案供您参考:

  1. 纹理更新机制: 在Flutter中,外接纹理的更新依赖于原生平台(iOS)的纹理更新逻辑。如果copyPixelBuffer只被调用了一次,可能是因为后续没有触发纹理更新的机制。请检查您的代码,确保在需要更新纹理时正确调用了相关的更新函数。

  2. 内存管理: iOS的纹理对象(如CVPixelBuffer)需要正确管理其生命周期。如果纹理对象被过早释放或销毁,那么后续的更新操作可能无法正确执行。请检查您的内存管理逻辑,确保纹理对象在需要时仍然有效。

  3. Flutter引擎与原生代码的交互: 有时,Flutter引擎与原生代码的交互可能存在一些微妙的问题。请确保您的Flutter插件与Flutter引擎的版本兼容,并且按照官方文档正确实现了外接纹理的接口。

  4. 调试和日志: 增加更多的调试日志可以帮助您更好地理解问题的根源。在copyPixelBuffer函数前后添加日志,观察其调用情况,可能有助于发现问题所在。

如果以上建议仍未解决您的问题,建议查阅Flutter和iOS的相关文档,或在Flutter社区和开发者论坛中寻求更具体的帮助。希望这些建议对您有所帮助!

回到顶部