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

时间:2014-01-03 01:07:13

标签: ios iphone tcp streaming video-streaming

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

所以,我需要做的是:

  1. 从相机中获取实时图片
  2. 如果需要,处理此数据
  3. 逐帧发送到连接的客户端( TCP?
  4. 在客户端接收帧并实时显示
  5. 我拥有的和我坚持的东西:

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

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

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

    4. 最后但并非最不重要的是,接收客户:
      我想,如果我真的要使用TCP连接,那么在客户端我从服务器接收帧后,将读取的字节包转换为使用的格式(CMSampleBufferCGImageUIImage),只需将其显示在CALayerUIImageView上,对吧?通过不断更新图像视图,可以获得电影的效果。

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

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

2 个答案:

答案 0 :(得分:6)

  1. 听起来不错?

  2. 视频帧真的很大。您将遇到带宽问题,将视频从一个设备流式传输到另一个设备。您可以使用JPEG中的UIImageJPEGRepresentation将帧压缩为UIImage,但这在“服务器”上的计算成本很高,但仍然可能不足以使其流畅。您还可以通过删除帧,降低UIImage的采样率以及摆弄AVCaptureSession中的设置来降低帧速率和/或分辨率。或者,您可以发送小型(5秒)视频,这些视频在服务器上进行硬件压缩,并且更容易处理带宽,但当然会在您的流中为您提供5秒的延迟。

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

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

  5. 如果您需要澄清以上任何一点,请与我们联系。这是很多工作,但相对简单。

答案 1 :(得分:-1)

如果您需要现成的解决方案,您可以尝试一些现成的流媒体库。我经历过的是angl streaming lib。与RTW输出到Wowza媒体服务器非常有效。