菜鸟教程小白 发表于 2022-12-12 22:27:37

iOS 视频播放


                                            <p><p>在我的应用程序中,我应该以不寻常的方式播放视频。
诸如用于特殊用途的交互式播放器之类的东西。</p>

<p>这里的主要问题:</p>

<ul>
<li>视频分辨率可以从 200*200 像素到 1024*1024 像素</li>
<li>我应该能够将速度从 -60 FPS 更改为 60 PFS(在这种情况下,视频的播放速度应该取决于所选的速度,负数表示视频应该向后播放)</li>
<li>我应该在视频上画线和对象,并用图像对其进行缩放。</li>
<li>我应该能够缩放图像并在其内容超过屏幕大小时对其进行平移</li>
<li>我应该能够更改此视频的亮度、对比度和反转颜色</li>
</ul>

<p>现在我正在做下一件事:</p>

<ul>
<li>我将视频拆分为 JPG 帧</li>
<li>为每秒 N 次创建计时器(播放速度控制)</li>
<li>每个计时器都在使用 OpenGL 绘制新纹理(下一个 JPG 帧)</li>
<li>使用 OpenGL ES 转换(平移、缩放)进行缩放和平移操作</li>
</ul>

<p>在我使用 320*240 像素之前,一切看起来都很好,但如果我使用 512*512 像素,我的播放率就会下降。也许是计时器行为问题,也许是 OpenGL。有时,如果我试图以高播放率(超过 10-15 FPS)打开大纹理,应用程序会因内存警告而崩溃。 </p>

<p>解决此问题的最佳做法是什么?我应该挖什么方向?也许 cocos2d 或其他游戏引擎对我有帮助? Mb JPG 不是纹理的最佳解决方案,我应该使用 PNG 或 PVR 还是其他?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>将视频数据保存为视频,并使用 <code>AVAssetReader</code> 获取原始帧。使用 <code>kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange</code> 作为色彩空间,并在 GLES 中进行 YUV->RGB 色彩空间转换。这意味着在内存中保留更少的数据,并使您的大部分图像处理更加简单(因为您将使用亮度和色度数据而不是 RGB 值)。</p>

<p>您无需为此烦恼 Cocos 2d 或任何游戏引擎。我强烈建议对 OpenGL ES 2.0 和着色器进行一些试验。将 OpenGL 用于视频非常简单明了,添加游戏引擎是不必要的开销和抽象。</p>

<p>当您将图像数据上传到纹理时,不要每帧都创建一个新纹理。相反,创建两个纹理:一个用于亮度数据,一个用于色度数据,并简单地在每一帧重复使用这些纹理。我怀疑您的内存问题是由于每帧使用许多图像和新纹理而可能没有删除旧纹理。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iOS 视频播放,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/11831120/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/11831120/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iOS 视频播放