如何从iPhonestream式video作为服务器?

我正在开发一款适用于iOS的应用程序,其中一台iPhone必须将其摄像机录制内容stream式传输到另一台iPhone(为了保持简单,两者都在同一个Wi-Finetworking中)。
stream应该没有物理互连(例如,用于将stream路由到客户端的服务器)。 实际上, 录制的iPhone应该是服务于其他iPhone(或者networking中更多的其他iOS设备)的直播stream的服务器。

所以,我需要做的是:

  1. 从相机获取现场照片
  2. 处理这些数据,如果需要
  3. 逐帧发送到连接的客户端( TCP?
  4. 接收客户端上的帧并实时显示它们

我有什么和我坚持什么:

  1. 我已经解决了问题1.我使用一个不断返回CMSampleBufferRef (在这里find)的AVCaptureSession

  2. 我不确定我需要做什么与CMSampleBufferRef 。 我知道如何将它转换为CGImageUIImage (感谢Benjamin Loulier的博客post2 ),但我不知道具体需要发送什么,以及是否需要以某种方式对帧进行编码。
    正如在上面的链接答案( this )中@jab所提到的,可以用一个或多个AVAssetWriter将这些示例写入文件。 但是他又说,这些5秒钟的video片段将被上传到一个服务器上,这个服务器可以将一个stream式传输的电影文件从电脑上传出来(然后这个电影可以通过HTTP Live Streaming式传输到iOS设备上)。

  3. 正如我已经指出,我的应用程序(即video捕捉“服务器”设备)有一个或多个客户端连接到它,并需要实时发送video帧给他们。
    我想到的一个想法是使用一个简单的TCP连接,即服务器以循环的格式将每一帧以串行格式发送给连接的客户端。 更具体地说:当一个缓冲帧成功发送到客户端时,服务器将最近的帧作为下一个帧发送。
    现在:这是正确的想法应该如何工作? 或者还有另外一个协议,它更适合这种任务吗?
    请记住:我想保持简单(对我来说很简单,也就是说,我不需要学习太多新的编程方面)并且很快。 我已经知道TCP的一些东西了,我用C在学校写了服务器和客户端,所以我宁愿把我现在的知识应用到这个项目中。

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

请给我一些关于如何达到这个目标的想法。 这是非常重要的,因为它是我的学校gradle项目的一部分…任何示例代码也赞赏;-)或者只是引用我到另一个网站,教程,Stackoverflow的答案等。

如果您有任何问题,请留下评论,我会更新post。

  1. 听起来好吗?

  2. video帧真的很大。 您将遇到带宽问题,将video从一台设备传输到另一台设备。 您可以使用UIImage UIImageJPEGRepresentation将帧压缩为JPEG ,但这在“服务器”上的计算量非常大,而且可能无法使其足够小,无法顺利传输。 您也可以通过丢帧来降低帧频和/或分辨率,对UIImage下采样,以及在AVCaptureSession调整设置。 或者,您可以发送小型(5秒)video,在服务器上进行硬件压缩,并且更容易处理带宽,但当然会给您带来5秒的延迟。

  3. 如果你可以要求iOS 7,我会build议尝试MultipeerConnectivity.framework 。 build立起来并不难,我相信它支持多个客户端。 如果你要推出你自己的networking,绝对使用UDP而不是TCP,这是UDP的教科书应用程序,开销较低。

  4. 逐帧,只需将JPEG转换为UIImage并使用UIImageView 。 涉及到大量的计算,但是我相信你仍然会受到带宽而不是CPU的限制。 如果您发送的video很less,则可以使用MPMoviePlayerController 。 每个video之间可能会有一些小问题,因为它会“准备”播放,这也会导致播放每个5秒的video需要5.5秒左右的时间。 我不会推荐使用HTTP Live Streaming,除非你可以在某个地方获得一个真正的服务器。 或者您可以使用ffmpegpipe道 – 将videoinput并popup个别框架 – 如果您可以/想要为iOS编译ffmpeg

让我知道,如果你需要澄清任何这些问题。 这是很多工作,但相对简单。

如果您需要现成的解决scheme,您可以尝试一些准备好的stream媒体库。 我有经验的人是anglstreamlib 。 使用Wowza媒体服务器的RTMP输出效果相当不错。