2012-12-13 60 views
8

我试图在iPhone上运行HTTP实时流媒体服务器,该服务器捕获来自摄像机的视频流并将其提供给HTML5客户端(它支持HTTP实时流式传输)。iPhone上的HTTP实时流媒体服务器

到目前为止,我有以下工作。在iOS

  1. HTTP实时流媒体服务器(用Node.js的),其动态 从传输流(视频/ MP2T)通过视频采集模块生成的文件列表更新索引文件。
  2. 视频采集模块,它采用AVCaptureMovieFileOutput产生一系列 10秒的QuickTime文件连续的(有 它们之间小的差距,但它足够小,我的应用程序)。

我需要的是一个即时转换器,它将每个QuickTime文件转换为一个传输流文件(无需更改编码,我只需要一个不同的容器),它桥接了上述两个模块。

我正在采取这种方法,因为这是利用iPhone的硬件视频编码器的唯一方法,据我所知(我在这里做了相当多的关于这个话题的研究,而且我99%确定如果我错了,请告诉我)。

有人提出ffmpeg,但我宁愿使用MIT许可证(如果有的话)使用更小的代码或从头开始编写一些代码(并且使用MIT许可证开放它的代码)。

我对这个媒体容器的东西很陌生,如果有人能指出我正确的方向(示例代码,开源,文档......),我会非常感激。

+0

你可以看一下FFmpeg的代码,看看它是如何做。 – vipw

+0

的ffmpeg是唯一的廉价的解决方案,也有商业的编码器,但他们花费很多钱。在手机上创建HLS将是一个小问题,没考虑也许RTMP,因为它似乎你在的地方很多件。我假设这些差距是因为你需要读回你从avassetwriter生成的完整的mov文件。 –

回答

6

我发布在苹果开发者论坛上,我们进行一场生动的(辩解双关语)讨论。这是对有人提出类似观点的回答。

我想纠正我,如果我错了,给我们如何,如果你不同意,建立从原料H264你从AVCaptureVideoDataOutput得到一个MPEG TS不是 容易的事,除非你转码使用X264或类似的例子。让我们假设您可以轻松获得mpeg ts文件,然后在m3u8容器中编译它们,启动一个小型web服务器并为它们服务将是一件简单的事情。 据我所知,有许多应用程序这样做,从设备使用本地主机隧道不是拒绝问题。所以也许不知怎的,你可以从设备生成hls,我质疑你会得到的性能。

等方面依然采用AvCaptureVideoDataOutput技术2号 ,你捕捉到的帧,在一些整齐的小包装协议其中,JSON或者是一些更深奥像bencode打开一个套接字,并将它们发送到服务器。 啊......好运更好有一个很好的健壮的网络,因为甚至通过无线网络发送未压缩的帧将需要带宽。

等方面技术的数字3

您使用avassetwriter写一部新的电影,并使用标准的C函数读取临时文件回来了,这是好的,但你有什么是生H264,MP4的不完整因此它没有任何moov原子,现在成为再生这个头部的有趣部分。祝你好运。

等方面tecnique 4,似乎确实有一些优点

我们不能创造之一,但2 avassetwriters,我们管理他们使用GCD dispatch_queue,因为经过实例avassetwriters只能使用一次,我们启动第一个在定时器上,在预定的时间段说10秒后,我们开始第二个,同时撕下第一个。现在我们有一系列完整moov原子的.mov文件,每个文件都包含压缩的h264视频。现在我们可以将这些发送到服务器,并将它们组合成一个完整的视频流。或者我们可以用一个简单的流光,是以MOV文件,并使用librtmp并将它们发送到媒体服务器包装他们RTMP协议。

我们是否可以将每个单独的mov文件发送到另一个苹果设备,从而获得设备到设备的通信,这个问题被错误地解释了很多次,通过wifi在同一子网上定位另一个iphone设备非常容易,可以完成。在TCP过的元胞的连接定位另一个设备几乎是不可思议的,如果这是可以做到的只能在使用IP寻址的,而不是公共承运人做手机网络。

说你可以,那么你有一个额外的问题,因为avfoundation视频播放器将不能够处理许多不同的单独的电影文件之间的转换。你将不得不根据ffmpeg解码编写自己的流媒体播放器。 (那确实工作比较好)

+0

谢谢Michelle的精彩总结。我选择了一种对“技术4”非常封闭的机制。现在视频在这些片段边界上非常流畅。我仍然听到跨越这些边界的声音有微小的差距,并试图找出如何消除它。 –

+0

但是,您如何使用iPhone摄像头使用AVAssetWriter?我只听说用AVCaptureSession使用相机,并且不能将它用于AVAssetWriter。 – sudo

+0

是的,你可以实际上,你仍然设置捕捉会话 –