iPhone上的HTTP直播服务器

时间:2012-12-13 01:20:28

标签: ios node.js streaming avfoundation http-live-streaming

我正在尝试在iPhone上运行HTTP直播服务器,该服务器从相机捕获视频流并将其提供给HTML5客户端(支持HTTP直播流)。

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

  1. iOS上的HTTP Live流媒体服务器(用Node.js编写),动态显示 从视频捕获模块生成的传输流(视频/ MP2T)文件列表中更新索引文件。
  2. 视频捕获模块,它使用AVCaptureMovieFileOutput来生成一系列 连续10秒的QuickTime文件(两者之间有一个小的差距 它们,但它对我的应用来说足够小。)
  3. 我需要的是一个即时转换器,它可以将每个QuickTime文件转换为传输流文件(无需更改编码,我只需要一个不同的容器),它可以连接上面的两个模块。

    我采用这种方法,因为据我所知,这是利用iPhone硬件视频编码器的唯一方法(我已经在这里做了很多研究,我99%肯定。如果我错了,请告诉我。)

    有些人建议使用ffmpeg,但我宁愿使用MIT许可证(如果有的话)使用更小的代码,或者从头开始编写代码(并使用MIT许可证开源)。

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

1 个答案:

答案 0 :(得分:6)

我在苹果开发者论坛上发布了这个,我们进行了热烈的(借口双关语)讨论。这是对提出类似观念的人的回答。

如果我错了,我认为纠正我,并举例说明如果你不同意从原始h264创建一个mpeg ts,你从AVCaptureVideoDataOutput得到的不是 除非您使用x264或类似代码进行转码,否则这项任务很简单。让我们假设您可以轻松获取mpeg ts文件,然后在m3u8容器中编译它们,启动一个小型Web服务器并提供它们将是一件简单的事情。 据我所知,并且有很多应用程序都这样做,使用设备中的localhost隧道不是拒绝问题。所以也许你可以以某种方式从设备中生成hls我会质疑你会得到的性能。

关于2号技术 仍然使用AvCaptureVideoDataOutput,你捕获帧,用一些整洁的小协议,json或者像bencode打开套接字并将它们发送到你的服务器的更深奥的东西。 啊......祝你好运,拥有一个不错的强大网络,因为即使通过wifi发送未压缩的帧也需要带宽。

关于第3号技术。

你使用avassetwriter写一部新电影,并使用标准的c函数从temp文件中读回来,这很好,但你所拥有的是原始h264,mp4不完整因此它没有任何moov原子,现在来了有趣的部分重新生成这个标题。祝你好运。

所以对tecnique 4来说似乎实际上有一些优点

我们创建了一个而不是2个avassetwriters,我们使用gcd dispatch_queue来管理它们,因为在实例化之后avassetwriters只能使用一次,我们在一个计时器上启动第一个,在预定的时间后说10秒我们开始第二个同时撕下第一个。现在我们有一系列带有完整moov原子的.mov文件,每个文件都包含压缩的h264视频。现在我们可以将它们发送到服务器并将它们组装成一个完整的视频流。或者,我们可以使用一个简单的流媒体来获取mov文件并使用librtmp将它们包装在rtmp协议中并将它们发送到媒体服务器。

我们可以将每个单独的mov文件发送到另一个苹果设备,从而进行设备到设备的通信,这个问题被多次误解,通过wifi将另一个iphone设备放在同一个子网上非常简单并且可以完成。通过celluar连接在tcp上定位另一个设备几乎是神奇的,如果它可以完成它唯一可能在使用可寻址IP的小区网络而不是所有普通运营商。

假设你可以,那么你有一个额外的问题,因为非基础视频播放器将能够处理许多不同的单独电影文件之间的过渡。您可能必须根据ffmpeg解码编写自己的流媒体播放器。 (那确实很有效)