使用 AVFoundation 在 iOS 上播放套接字流式传输的 h.264 电影

Posted

技术标签:

【中文标题】使用 AVFoundation 在 iOS 上播放套接字流式传输的 h.264 电影【英文标题】:Play socket-streamed h.264 movie on iOS using AVFoundation 【发布时间】:2012-04-05 23:25:47 【问题描述】:

我正在开发一个小型 iPhone 应用程序,该应用程序使用常规套接字通过网络连接流式传输电影内容。视频采用H.264 格式。但是,我在播放/解码数据时遇到了困难。我一直在考虑使用FFMPEG,但是许可证使它不适合该项目。我一直在研究 Apple 的 AVFoundation 框架(尤其是 AVPlayer),它似乎能够处理 h264 内容,但是我只能找到使用 url 启动电影的方法——而不是通过证明从网络流式传输的内存缓冲区。

我一直在做一些测试以实现这一点,使用以下方法:

    使用普通的AVPlayer 播放电影。每次在网络上接收到数据时,都会使用带有附加模式的 fopen 将其写入文件。然后使用更新的数据重新加载/重新创建 AVPlayer 的资产。这种方法似乎有两个问题:首先,在卸载第一个资产并加载新资产时,屏幕会短暂黑屏。其次,我不知道播放停止的确切位置,因此我不确定如何找到开始播放新资产的正确位置。 第二种方法是像第一种方法一样将数据写入文件,但不同之处在于将数据加载到第二个资产中。然后使用AVQueuedPlayer 在播放器中插入/排队第二个资产并在缓冲完成后调用。然后可以在没有黑屏的情况下卸载第一个资产。然而,使用这种方法(比第一种方法)更麻烦的是找出从哪里开始播放新资产。

有没有人做过这样的事情并让它发挥作用?有没有使用AVFoundation 的正确方法?

【问题讨论】:

您找到答案了吗?我也正在尝试播放包含单个帧的 h264 文件(.264 文件扩展名)并尝试对其进行解码。 AVAssetReader 不接受这种文件格式,我唯一的计划是每帧创建一个 mp4 文件(这听起来很疯狂)。 来源必须推送视频而不是让应用程序拉取视频是否有特殊原因? HLS 通常以相反的方式工作。如果您的源计算机可以运行 OSX,则有 Apple 工具可以为您从 UDP rtsp 输入流中进行分段。如果没有,您可能会假冒 AVPlayer 认为它正在处理正常的 HLS,方法是在电话上运行代理 - 在文件到达时将文件分块,并编写一些代码来生成适当的假 .m3u8 播放列表来表示这些块。 【参考方案1】:

执行此操作的官方方法是 HTTP Live Streaming 格式,它支持多个质量级别(除其他外)并在它们之间自动切换(例如:如果用户从 WiFi 移动到蜂窝网络)。

您可以在此处找到文档:Apple Http Streaming Docs

【讨论】:

有没有办法通过 AVPlayer 流式传输 Web 套接字数据来播放视频。

以上是关于使用 AVFoundation 在 iOS 上播放套接字流式传输的 h.264 电影的主要内容,如果未能解决你的问题,请参考以下文章

IOs App 在模拟器上运行但在设备上崩溃(主要使用 AVFoundation)

iOS 播放 RTMP 与 AVFoundation

AVFoundation 初解

AVFoundation自己定义音视频频播放

如何在 iOS 中播放声音?

IOS开发中AVFoundation中AVAudioPlayer的使用