我正在开发一个应用程序,它从磁盘读取媒体数据,将其转换为适当的像素格式,然后将其传递给 AVAssetWriter 进行压缩并写入磁盘。我正在自己阅读交错而不使用 AVAssetReader。我的读者确保以串行方式呈现恰好一帧的视频数据和一帧的音频数据。我遇到的问题是,如果我没有将 expectsMediaDataInRealTime 属性设置为YES,视频资产编写器将始终返回NO对于 isReadyForMoreMediaData 恰好在 30 帧之后。如果我在 30 帧之前停止写入,它工作正常并且输出文件有效。但是,如果我将 expectsMediaDataInRealTime 设置为 YES,它会在整个持续时间(可能是几千帧)内完美运行。在将 expectsMediaDataInRealTime 设置为 YES 开始转码操作后,我观察了应用程序在压缩很长视频的过程中的内存使用情况,没有任何不合理的内存使用或任何内存泄漏。生成的 MOV 文件看起来确实写得很正常,例如,正如人们所期望的那样,音频数据与视频数据交织在一起。
那么,如果将 expectsMediaDataInRealTime 设置为 YES 没有明显的缺点,我为什么还要将其设置为 NO 呢?这仅在使用 Apple API 读取数据(使用 AVAssetReader)时适用吗?文档说此属性控制写入“以理想的交错模式写入媒体数据,以提高存储和播放效率”,但是当 expectsMediaDataInRealTime 设置为 YES 时,isReadyForMoreMediaData 永远不会返回 NO,并且文件似乎被完美写入。那么,如果 AVAssetWriter 在此属性设置为 YES 时可以执行此操作,为什么设置为 NO 时不能执行此操作?来源完全一样。
除了“确保正确计算 readyForMoreMediaData 的值”(这对我来说绝对没有任何意义)之外,这个属性究竟做了什么?