• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 如何在 iOS 中使用 OpenGL 播放视频?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 22:33:01 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试在 iOS 中使用 OpenGL ES 2.0 播放视频。我无法获得示例代码或如何实现这一目标的起点。有人可以帮我解决这个问题吗?



Best Answer-推荐答案


您正在寻找的是实时获取视频的原始缓冲区。我相信您需要查看 AVFoundation 并以某种方式提取 CVPixelBufferRef。如果我没记错的话,你有几种方法;一种是在特定时间点播,另一种用于处理,您将获得 block 中帧的快速迭代,而您可能需要的一种是实时接收帧。因此,您可以提取一个原始 RGB 缓冲区,该缓冲区需要推送到纹理,然后绘制到渲染缓冲区。

我建议您(每个视频)创建一次纹理并尝试使其尽可能小,但要确保视频帧适合。您可能需要 POT(二的幂)纹理,因此要从视频宽度中获取纹理尺寸,您需要以下内容:

GLInt textureWidth = 1.0f;
while(textureWidth<videoWidth) textureWidth <<= 1; // Multiplies by 2

因此纹理大小预计会比视频大。要将数据推送到纹理,您需要使用纹理子图像 glTexSubImage2D。它需要一个指向原始数据和矩形参数的指针,然后将数据保存在 (0, 0, sampleWidth, sampleHeight) 的位置。此外,必须计算纹理坐标,使其不在 [0, 1] 范围内,而是在 x 范围内:[0, sampleWidth/textureWidth]

那么你只需要把它们放在一起:

  • 拥有一个系统来持续生成视频原始样本缓冲区
  • 生成适合视频大小的纹理
  • 在新示例中使用 glTexSubImage2D 更新纹理(注意线程)
  • 将数据加载到纹理中后,将纹理绘制为全屏矩形(注意线程)

您可能需要注意视频方向、转换。因此,如果可能,请使用设备上以不同方向录制的一些视频来测试您的系统。我认为现在支持接收已经正确定向的缓冲区。但默认情况下,样本至少曾经是“错误的”;纵向录制的视频仍然具有横向样本,但 Assets 提供了转换矩阵或方向。

关于ios - 如何在 iOS 中使用 OpenGL 播放视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40102587/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap