我正在开发一款适用于 iOS 的应用程序,其中一部 iPhone 必须将其摄像头记录实时流式传输到另一部 iPhone(为简单起见,两者都在同一个 Wi-Fi 网络中)。
流式传输应该在没有物理互连(例如用于将流路由到客户端的服务器)的情况下工作。事实上,正在录制的 iPhone 应该是服务器,它为其他 iPhone(或网络中的更多其他 iOS 设备)提供直播。
所以,我需要做的是:
- 从相机获取实时图片
- 在需要时处理这些数据
- 逐帧发送给连接的客户端(TCP?)
- 在客户端接收帧并实时显示
我拥有的和坚持的:
我已经解决了问题 1。我使用
AVCaptureSession
,它不断返回CMSampleBufferRef
(找到 here)。我不太确定我需要用
CMSampleBufferRef
做什么。我确实知道如何将其转换为CGImage
或UIImage
(感谢 Benjamin Loulier 的精彩博文 2 ),但我不知 Prop 体需要什么发送,如果我需要以某种方式对帧进行编码。
正如@jab 在上面链接的答案 ( this ) 中提到的,可以将这些示例写入一个包含一个或多个AVAssetWriter
的文件。但话又说回来,他说那些 5 秒的视频片段将被上传到服务器,服务器从中制作出可流式传输的电影文件(然后该电影可以通过HTTP Live Streaming
流式传输到 iOS 设备我假设)。正如我已经指出的那样,我的应用程序(即视频捕获“服务器”设备)连接了一个或多个客户端,并且需要向它们实时发送视频帧。
我想到的一个想法是使用一个简单的TCP
连接,其中服务器以序列化 格式将每个帧循环发送到连接的客户端.更具体地说:当一个缓冲帧成功发送给客户端时,服务器将最新的帧作为下一个要发送的帧。
现在:这是正确的想法吗?或者是否有另一种协议(protocol)更适合此类任务?
记住:我想让它保持简单(对我来说简单,也就是说,这样我就不需要学习太多新的编程方面)和快速。我已经了解一些关于 TCP 的知识,我在学校用C
编写了服务器和客户端,所以我更愿意将我现在所学的知识应用到这个项目中......最后但同样重要的是,接收客户端:
我想,如果我真的要使用TCP
连接,那么在客户端我从服务器接收帧后帧,将读取的字节包转换为使用的格式(CMSampleBuffer
,CGImage
,UIImage
) 然后把它显示在CALayer
或UIImageView
上,对吧?只需不断更新 ImageView 即可获得电影效果。
请给我一些关于如何实现这个目标的想法。这非常重要,因为它是我学校毕业项目的一部分...任何示例代码也很受欢迎;-) 或者只是让我引用另一个站点、教程、Stackoverflow-answer 等。
如果您对此有任何疑问,请发表评论,我会更新帖子。
最佳答案
听起来不错?
视频帧真的很大。将视频从一台设备流式传输到另一台设备时会遇到带宽问题。您可以使用
<UIImage
中的UIImageJPEGRepresentation
将帧压缩为JPEG
,但这在“服务器”上的计算成本很高,而且仍然可能无法实现它们足够小,可以很好地播放。您还可以通过丢帧、缩减UIImage
采样以及调整AVCaptureSession
中的设置来降低帧速率和/或分辨率。或者,您可以发送小视频(5 秒),这些视频在服务器上经过硬件压缩,带宽更容易处理,但当然会给您带来 5 秒的流延迟。如果您需要 iOS 7,我建议您尝试
MultipeerConnectivity.framework
。设置起来并不难,而且我相信它支持多个客户端。如果您要推出自己的网络,一定要使用 UDP 而不是 TCP - 这是 UDP 的教科书应用程序,它的开销更低。逐帧,只需将
<JPEG
转换为UIImage
并使用UIImageView
。涉及大量计算,但我相信您仍然会受到带宽而非 CPU 的限制。如果您要发送小视频,可以使用MPMoviePlayerController
。每个视频之间可能会有一些小故障,因为它“准备”播放它们,这也将导致播放每个 5 秒视频需要 5.5 秒左右。我不建议使用 HTTP Live Streaming,除非你可以在某处获得一个真正的服务器。或者,如果您可以/想要为 iOS 编译ffmpeg
,您可以使用ffmpeg
管道——输入视频并弹出单个帧。
如果您需要对这些要点中的任何一个进行说明,请告诉我。这是很多工作,但相对简单。
关于ios - 如何从充当服务器的 iPhone 流式传输视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20894810/