如何将iPhone相机的实时视频流传输到媒体服务器?

10
根据这篇文章,从iPhone相机获取压缩数据是可能的,但根据我在AVFoundation参考文献中所读到的,你只能获得未压缩数据。

所以问题是:

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

2)使用ffmpeg的API编码未压缩的帧是否足够快以进行实时流媒体传输?

非常感谢您的任何帮助!

谢谢。


最终我使用AVFoundation获取了未压缩的数据(帧和音频),并使用FFmpeg的API进行编码和流媒体传输。在iPhone 4上,它表现得非常好,分辨率为192x240时可达到30 FPS。在更高的分辨率下,会丢失太多帧。 - Alexandre OS
@AlexandreOS,请分享如何做到这一点,这对我们很有帮助,谢谢。 - Rahul Juyal
1
@Ron 从AVFoundation获取未压缩数据,然后将每个CMSampleBuffer转换为FFmpeg的AVPicture。您可以使用FFmpeg对AVPicture实例进行编码。请参考FFmpeg的ffmpeg.c文件,了解如何实现此编码部分。希望这能帮到您。 - Alexandre OS
2个回答

9
您很可能已经知道了……

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

很遗憾,您无法实现此功能。AVFoundation API已经从各个角度阻止了这一点。我甚至尝试过命名管道和其他一些诡计,但都没有成功。您别无选择,只能将其写入文件。在您的链接帖子中,有用户建议设置回调以传递编码帧。据我所知,对于H.264流,这是不可能的。捕获委托将提供以特定像素格式编码的图像。是电影制片人和AVAssetWriter进行编码。

2)使用ffmpeg的API对未压缩帧进行编码是否足够快以进行实时流媒体?

是的,它是可以的。但是,您必须使用libx264,这会让您进入GPL领域。这与应用商店并不兼容。
出于效率原因,我建议使用AVFoundation和AVAssetWriter。

4
实际上,1部分是错误的。我编写了一个库,在实时编码H.264数据时不使用私有API,并将其传递。 - Steve McFarlin
1
你能和我们分享这个库吗?如果有另一种获取H.264流的方式而不使用libx264,那将非常好。这就是为什么我最终使用了FFmpeg的mpeg编解码器。 - Alexandre OS
很遗憾,我的库只有商业许可证。将来我可能会发布双重许可证。 - Steve McFarlin
@SteveMcFarlin,您在提到的第一点上最近有为我们其他人提供一些见解的进展吗? - abestic9
听起来不错,SPS是我今天才接触到的东西。看起来编写一个临时文件是唯一的解决方法。 - abestic9
显示剩余2条评论

4

我同意Steve的观点。我要补充的是,如果你尝试使用苹果的API,你将不得不进行一些非常恶劣的黑客攻击。默认情况下,AVAssetWriter在将其缓冲区写入文件之前会花费一秒钟的时间。我没有找到通过设置更改它的方法。解决这个问题的方法似乎是强制进行小文件写入并使用多个AVAssetWriters关闭文件。但这会引入很多开销,不太美观。

如果你是iOS开发者,一定要向苹果提出新的功能请求。我们越多,他们就越有可能添加一些可以写入缓冲区和/或流的编写器。

我想对Steve关于x264 GPL问题的观点做出一个补充,那就是我认为你可以获得商业许可证,这比GPL更好,但当然需要花费一些钱。但这意味着你仍然可以使用它并获得相当不错的结果,而不必公开自己的应用程序源代码。虽然不如使用硬件编解码器增强的苹果API好,但也不错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接