我正在尝试在 iPhone 上运行 HTTP 实时流媒体服务器,该服务器从摄像头捕获视频流并将其提供给 HTML5 客户端(支持 HTTP 实时流媒体)。
到目前为止,我已经完成了以下工作。
- iOS 上的 HTTP Live 流媒体服务器(用 Node.js 编写),动态地
从视频捕获模块生成的传输流(视频/MP2T)文件列表中更新索引文件。
- 视频采集模块,它使用AVCaptureMovieFileOutput产生一系列
连续 10 秒 QuickTime 文件(之间有一个小间隙
它们,但对于我的应用程序来说已经足够小了)。
我需要的是一个即时转换器,它将每个 QuickTime 文件转换为传输流文件(不需要更改编码,我只需要一个不同的容器),它桥接上面的两个模块。
我之所以采用这种方法,是因为据我所知,这是利用 iPhone 硬件视频编码器的唯一方法(我在这里对这个主题做了相当多的研究,我 99% 确定。请让我知道我是否错了)。
有几个人建议使用 ffmpeg,但我宁愿使用具有 MIT 许可证(如果有)的更小的代码,或者从头开始编写一些东西(并使用 MIT 许可证将其开源)。
我对媒体容器这个东西还很陌生,如果有人能指出我正确的方向(示例代码、开源、文档……),我真的很感激。
我将其发布在苹果开发者论坛上,我们进行了热烈的(请原谅双关语)讨论。这是对提出类似想法的人的回答。
我认为如果我错了,请纠正我,并给我们一个例子,如果您不同意从 AVCaptureVideoDataOutput 获得的原始 h264 创建 mpeg ts 不是一个
除非您使用 x264 或类似的东西进行转码,否则这很容易。让我们假设您可以轻松获取 mpeg ts 文件,那么在 m3u8 容器中编译它们、启动一个小型 Web 服务器并为它们提供服务就很简单了。
据我所知,有很多应用程序可以做到这一点,从设备使用本地主机隧道不是拒绝问题。所以也许你可以以某种方式从设备生成 hls 我质疑你会得到的性能。
接下来是技术 2
仍然使用 AvCaptureVideoDataOutput,您捕获帧,将它们包装在一些简洁的小协议、json 或可能更深奥的东西中,例如 Bencode 打开套接字并将它们发送到您的服务器。
啊...祝你好运,最好有一个强大的网络,因为即使通过 WiFi 发送未压缩的帧也需要带宽。
接下来是技术 3。
您使用 avassetwriter 编写一部新电影,并使用标准 c 函数从临时文件中读回,这很好,但您拥有的是原始 h264,mp4 不完整,因此它没有任何 moov 原子,现在是有趣的部分重新生成这个标题。祝你好运。
那么技术 4 似乎确实有一些优点
我们创建的不是一个而是两个 avassetwriters ,我们使用 gcddispatch_queue 管理它们,因为实例化后 avassetwriters 只能使用一次,我们在计时器上启动第一个,在预定的时间段(例如 10 秒)后,我们启动第二个把第一个撕下来。现在我们有一系列具有完整 moov 原子的 .mov 文件,每个文件都包含压缩的 h264 视频。现在我们可以将这些发送到服务器并将它们组装成一个完整的视频流。或者,我们可以使用一个简单的流媒体,它获取 mov 文件并使用 librtmp 将它们包装在 rtmp 协议中,然后将它们发送到媒体服务器。
我们是否可以将每个单独的 mov 文件发送到另一个苹果设备,从而实现设备到设备的通信,这个问题已经被误解了很多次,通过 wifi 在同一子网上定位另一个 iphone 设备非常容易并且可以完成。通过蜂窝连接在 tcp 上定位另一个设备几乎是神奇的,如果它可以在使用可寻址 IP 的蜂窝网络上完成,而不是所有常见运营商都可以做到的话。
如果你可以,那么你还有一个额外的问题,因为没有一个 avfoundation 视频播放器能够处理许多不同的单独电影文件之间的转换。您必须编写自己的流媒体播放器,可能基于 ffmpeg 解码。 (那确实工作得很好)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)