ios - 如何从充当服务器的 iPhone 流式传输视频?

标签 ios iphone tcp streaming video-streaming

我正在开发一款适用于 iOS 的应用程序,其中一部 iPhone 必须将其摄像头记录实时流式传输到另一部 iPhone(为简单起见,两者都在同一个 Wi-Fi 网络中)。
流式传输应该在没有物理互连(例如用于将流路由到客户端的服务器)的情况下工作。事实上,正在录制的 iPhone 应该是服务器,它为其他 iPhone(或网络中的更多其他 iOS 设备)提供直播。

所以,我需要做的是:

  1. 从相机获取实时图片
  2. 在需要时处理这些数据
  3. 逐帧发送给连接的客户端(TCP?)
  4. 在客户端接收帧并实时显示

我拥有的和坚持的:

  1. 我已经解决了问题 1。我使用 AVCaptureSession,它不断返回 CMSampleBufferRef(找到 here)。

  2. 我不太确定我需要用 CMSampleBufferRef 做什么。我确实知道如何将其转换为 CGImageUIImage(感谢 Benjamin Loulier 的精彩博文 2 ),但我不知 Prop 体需要什么发送,如果我需要以某种方式对帧进行编码。
    正如@jab 在上面链接的答案 ( this ) 中提到的,可以将这些示例写入一个包含一个或多个 AVAssetWriter 的文件。但话又说回来,他说那些 5 秒的视频片段将被上传到服务器,服务器从中制作出可流式传输的电影文件(然后该电影可以通过 HTTP Live Streaming 流式传输到 iOS 设备我假设)。

  3. 正如我已经指出的那样,我的应用程序(即视频捕获“服务器”设备)连接了一个或多个客户端,并且需要向它们实时发送视频帧。
    我想到的一个想法是使用一个简单的TCP 连接,其中服务器以序列化 格式将每个帧循环发送到连接的客户端.更具体地说:当一个缓冲帧成功发送给客户端时,服务器将最新的帧作为下一个要发送的帧。
    现在:这是正确的想法吗?或者是否有另一种协议(protocol)更适合此类任务?
    记住:我想让它保持简单(对我来说简单,也就是说,这样我就不需要学习太多新的编程方面)和快速。我已经了解一些关于 TCP 的知识,我在学校用 C 编写了服务器和客户端,所以我更愿意将我现在所学的知识应用到这个项目中......

  4. 最后但同样重要的是,接收客户端:
    我想,如果我真的要使用 TCP 连接,那么在客户端我从服务器接收帧后帧,将读取的字节包转换为使用的格式( CMSampleBuffer, CGImage, UIImage) 然后把它显示在 CALayerUIImageView 上,对吧?只需不断更新 ImageView 即可获得电影效果。

请给我一些关于如何实现这个目标的想法。这非常重要,因为它是我学校毕业项目的一部分...任何示例代码也很受欢迎;-) 或者只是让我引用另一个站点、教程、Stackoverflow-answer 等。

如果您对此有任何疑问,请发表评论,我会更新帖子。

最佳答案

  1. 听起来不错?

  2. 视频帧真的很大。将视频从一台设备流式传输到另一台设备时会遇到带宽问题。您可以使用 UIImage 中的 UIImageJPEGRepresentation 将帧压缩为 JPEG,但这在“服务器”上的计算成本很高,而且仍然可能无法实现它们足够小,可以很好地播放。您还可以通过丢帧、缩减 UIImage 采样以及调整 AVCaptureSession 中的设置来降低帧速率和/或分辨率。或者,您可以发送小视频(5 秒),这些视频在服务器上经过硬件压缩,带宽更容易处理,但当然会给您带来 5 秒的流延迟。

    <
  3. 如果您需要 iOS 7,我建议您尝试 MultipeerConnectivity.framework。设置起来并不难,而且我相信它支持多个客户端。如果您要推出自己的网络,一定要使用 UDP 而不是 TCP - 这是 UDP 的教科书应用程序,它的开销更低。

  4. 逐帧,只需将 JPEG 转换为 UIImage 并使用 UIImageView。涉及大量计算,但我相信您仍然会受到带宽而非 CPU 的限制。如果您要发送小视频,可以使用 MPMoviePlayerController。每个视频之间可能会有一些小故障,因为它“准备”播放它们,这也将导致播放每个 5 秒视频需要 5.5 秒左右。我不建议使用 HTTP Live Streaming,除非你可以在某处获得一个真正的服务器。或者,如果您可以/想要为 iOS 编译 ffmpeg,您可以使用 ffmpeg 管道——输入视频并弹出单个帧。

    <

如果您需要对这些要点中的任何一个进行说明,请告诉我。这是很多工作,但相对简单。

关于ios - 如何从充当服务器的 iPhone 流式传输视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20894810/

相关文章:

iphone - Facebook iOS 授权并在没有对话的情况下发布?

ios - iTunes Connect 销售和趋势报告

ios - 协议(protocol)扩展,变异函数

c++ - boost::asio::ip::tcp::socket 不读取任何内容

ios - 是否有特定的方法来监听 PDFDocument 或 PDFView url 加载完成?

删除设备后 Xamarin (VS) 中缺少 iOS 模拟器

ios - 就距离矩阵(距离和时间)而言,事实 API 与 Google Places API

iphone - ios中的多线程

c# - 由于超时导致异常后,我可以继续使用 NetworkStream 吗?

Go 中的 TCP 连接