将 iPhone 摄像头实时流式传输到媒体服务器的最佳方式是啥?

Posted

技术标签:

【中文标题】将 iPhone 摄像头实时流式传输到媒体服务器的最佳方式是啥?【英文标题】:What's the best way of live streaming iphone camera to a media server?将 iPhone 摄像头实时流式传输到媒体服务器的最佳方式是什么? 【发布时间】:2011-05-27 08:50:50 【问题描述】:

据此What Techniques Are Best To Live Stream iPhone Video Camera Data To a Computer? 可以从 iphone 相机获取压缩数据,但正如我在 AVFoundation 参考中所读到的,您只能获得未压缩的数据。

所以问题是:

1) 如何从 iPhone 的相机中获取压缩帧和音频?

2) 使用 ffmpeg 的 API 编码未压缩的帧对于实时流式传输是否足够快?

任何帮助将不胜感激。

谢谢。

【问题讨论】:

我最终从 AVFoundation 获得了未压缩的数据(帧和音频),并使用 FFmpeg 的 API 进行了编码+流式传输。它在 iPhone 4 上运行良好,最高可达 30 FPS,分辨率为 192x240。在更高的分辨率下,它会丢掉太多的帧。 @AlexandreOS 如何做到这一点,请分享,对我们有帮助,谢谢 @Ron Get uncompressed data from AVFoundation,然后转换每个CMSampleBuffer to FFmpeg's AVPicture。您可以使用 FFmpeg 对 AVPicture 实例进行编码。以 FFmpeg 的 ffmpeg.c 文件为例,了解如何实现此编码部分。希望这对您有所帮助。 【参考方案1】:

你很可能已经知道....

1) 如何从 iPhone 的相机中获取压缩帧和音频?

你不能这样做。 AVFoundation API 从各个角度防止了这种情况。我什至尝试过命名管道和其他一些鬼鬼祟祟的 unix foo。没有这样的运气。您别无选择,只能将其写入文件。在您链接的帖子中,用户建议设置回调以传递编码帧。据我所知,这对于 H.264 流是不可能的。捕获委托将提供以特定像素格式编码的图像。进行编码的是 Movie Writers 和 AVAssetWriter。

2) 使用 ffmpeg 的 API 编码未压缩的帧对于实时流式传输是否足够快?

是的。但是,您必须使用 libx264 才能进入 GPL 领域。这与应用商店不完全兼容。

出于效率原因,我建议使用 AVFoundation 和 AVAssetWriter。

【讨论】:

其实 1 部分错误。我编写了一个库,可以在不使用私有 API 的情况下实时提供 H.264 数据。 你能和我们分享这个库吗?如果有另一种方法可以在不使用 libx264 的情况下获取此 H.264 流,那将是非常好的。这就是我最终使用 FFmpeg 的 mpeg 编解码器的原因。 @AlexandreOS 不幸的是,我的库仅获得商业许可。我将来可能会在双重许可下发布它。 @SteveMcFarlin 您编写的库是使用 avassetwriterinput 和像素缓冲区吗?请纠正我。 @SteveMcFarlin 在您提到的第一点向我们其他人提供一些见解方面有什么最新进展吗?【参考方案2】:

我同意史蒂夫的观点。我会在尝试使用 Apple 的 API 时补充一点,您将不得不进行一些非常讨厌的黑客攻击。默认情况下,AVAssetWriter 在将其缓冲区溢出到文件之前会花费一秒钟。我还没有找到用设置来改变它的方法。解决方法似乎是使用多个 AVAssetWriter 强制写入小文件并关闭文件。但这会带来很多开销。不好看。

一定要向 Apple 提交新功能请求(如果您是 ios 开发人员)。我们这样做的人越多,他们就越有可能添加某种可以写入缓冲区和/或流的写入器。

我要对史蒂夫在 x264 GPL 问题上所说的话做的补充是,我认为您可以获得比 GPL 更好的商业许可证,但当然要花钱。但这意味着您仍然可以使用它并获得相当不错的结果,而不必打开自己的应用程序源。不如使用硬件编解码器的增强型 Apple API,但还不错。

【讨论】:

以上是关于将 iPhone 摄像头实时流式传输到媒体服务器的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将实时网络摄像头流式传输到服务器并返回网络的最佳方式是啥?

如何从 iOS 设备(而不是自己的相机)流式传输 (RTMP) 视频

将实时视频广播从 android 相机流式传输到服务器

寻找一个库/框架将实时视频从 OS X 流式传输到 Wowza 服务器(RTMP)[关闭]

将 iPhone 摄像头的实时 mp4 流投射到 Google Chromecast

使用 ffmpeg 实时流式传输 MPEG-TS 和 windows 媒体服务