[英]How do I stream video from iPhone acting as a server?
我正在开发适用于iOS的应用程序,其中一个iPhone必须将其摄像机录制的内容实时传输到另一部iPhone(为简单起见,两者都在同一个Wi-Fi网络中)。
流应该在没有物理互连的情况下工作(例如,用于将流路由到客户端的服务器)。 实际上, 录制的iPhone应该是通过实时流为其他iPhone(或网络中更多其他iOS设备)提供服务的服务器 。
因此,我需要做的是:
我拥有和坚持的东西:
我已经解决了问题1.我使用了AVCaptureSession
,它不断返回CMSampleBufferRef
的内容(在此处找到)。
我不太确定我该如何处理CMSampleBufferRef
。 我确实知道如何将其转换为CGImage
或UIImage
(这要归功于Benjamin Loulier的出色博客2 ),但是我不知道我具体需要发送什么以及是否需要对帧进行编码。
如@jab在上面的链接的答案( this )中所提到的,可以将这些样本写入具有一个或多个AVAssetWriter
的文件中。 但话又说回来,他说那5秒钟的视频片段将被上载到服务器,该服务器将从中制作出可流式传输的电影文件(然后我可以通过HTTP Live Streaming
将电影流式传输到iOS设备)。
正如我已经指出的,我的应用程序(即视频捕获“服务器”设备)已连接一个或多个客户端,并且需要实时向他们发送视频帧。
我想到的一个想法是使用简单的TCP
连接,其中服务器以循环的方式将序列化格式的每个单个帧发送给连接的客户端。 更具体地说:当一个缓冲帧成功发送到客户端时,服务器将最近的帧作为下一个要发送的帧。
现在:这是正确的想法吗? 还是有另一种协议更适合此类任务?
记住:我想保持简单(对我来说很简单,也就是说,我不需要研究太多新的编程方面)并且要快速。 我已经了解了TCP的一些知识,我在学校用C
编写了服务器和客户机,所以我更愿意将我现在所拥有的知识应用于该项目...
最后但并非最不重要的是,接收客户:
我想,如果我真的要使用TCP
连接,则在客户端从服务器接收一帧接一帧的帧,将读取的字节包转换为使用的格式( CMSampleBuffer
, CGImage
, UIImage
)并仅显示它在CALayer
或UIImageView
,对吗? 只需不断更新图像视图,即可获得电影的效果。
请给我一些有关如何实现此目标的想法。 这是非常重要的,因为它是我学校毕业项目的一部分...任何示例代码也应得到赞赏;-)或直接将我引至其他站点,教程,Stackoverflow-answer等。
如果对此有任何疑问,请发表评论,我将更新帖子。
听起来还好吗?
视频帧真的很大。 您将遇到带宽问题,将视频从一台设备流到另一台设备。 您可以使用UIImage
UIImageJPEGRepresentation
将帧压缩为JPEG
,但这在“服务器”上的计算量UIImageJPEGRepresentation
,而且可能还不够小,无法很好地进行流传输。 您还可以通过丢帧,降低UIImage
的采样率以及摆弄AVCaptureSession
的设置来降低帧速率和/或分辨率。 或者,您可以发送小(5秒)的视频,这些视频在服务器上进行了硬件压缩,带宽处理起来更加容易,但当然会使您的视频流滞后5秒。
如果您需要iOS 7,建议您尝试MultipeerConnectivity.framework
。 设置并不是很困难,我相信它支持多个客户端。 如果要建立自己的网络,请绝对使用UDP而不是TCP-这是UDP的教科书应用程序,它的开销较低。
逐帧,只需将JPEG
转换为UIImage
并使用UIImageView
。 其中涉及大量计算,但是我相信您仍然会受到带宽而不是CPU的限制。 如果要发送少量视频,则可以使用MPMoviePlayerController
。 在每个视频“准备”播放时,它们之间可能几乎没有毛刺,这也将导致需要花费5.5秒左右的时间才能播放每个5秒的视频。 我不建议您使用HTTP Live Streaming,除非您可以在某个地方使用真正的服务器。 或者,您可以使用ffmpeg
管道-输入视频并弹出单个帧-如果您可以/希望为iOS编译ffmpeg
。
让我知道您是否需要澄清以上几点。 这是很多工作,但是相对简单。
如果您需要现成的解决方案,则可以尝试一些现成的流媒体库。 我经历过的一个是angl stream lib 。 RTMP输出到Wowza媒体服务器的效果很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.