为没有AVPlayer的iOS构建流媒体视频播放器

Ant*_*nio 5 mp4 avfoundation video-streaming h.264 ios

我想为iOS构建一个流媒体视频播放器,它能够播放.mp4托管在远程服务器上的文件.我还想使用像AudioToolbox和VideoToolbox中的低级API那样做.我希望使用AVPlayer此.我想这样做主要是作为一个学习练习,但也因为我注意到它AVPlayer和它的相关类阻止了主线程,这使得在滚动视图中嵌入视频非常困难.

据我所知,这将需要4个主要挑战,我必须解决;

从互联网下载MP4文件并提取音频/视频样本

这可能是我对它如何工作最不了解的领域.假设我为MP4文件启动网络下载,并得到结果数据流.

  • 这个数据流的格式是什么?
  • 是否有任何文件可供我阅读以了解更多有关它的内容?
  • 如何从该流中提取音频和视频样本?

从流中解压缩和播放音频样本

从围绕Apple的文档开始,看起来我可以使用AudioQueueAPI.它似乎拥有播放音频数据流所需的一切.将所有内容设置正确以播放压缩音频数据可能并不容易,但似乎可行.

解压缩并显示流中的视频样本

对于解压缩和显示视频样本,到目前为止我已经研究过了AVSampleBufferDisplayLayer.我已经玩了一下它似乎非常有希望我想做什么.请问AVSampleBufferDisplayLayer是在这里使用推荐的东西,或者是有别的,更适合呢?

同步音频和视频播放

这是我不太了解的另一个领域.从阅读文档和头文件看起来我需要创建一个CMAudioClock然后创建一个CMTimeBase使用该时钟,然后可以用来驱动AVSampleBufferDisplayLayer.关于此设置有一些我不明白的事情

  • CMAudioClock前进的速度有多快?它是否只是以固定费率不断前进?或者每次播放声音时它会前进一点吗?
  • 如果我使用CMAudioClock带有关联的CMTimeBase,我需要将它与我的音频管道相关联吗?这两件事如何保持同步?