iOS中的视频编码

3

我知道StackOverflow上已经有关于将iOS设备上的实时视频流传输到服务器的问题,但我想问一下编码部分。

我对可用的软件编码服务不太了解,这些服务可以对从iOS设备捕获的原始(实时)视频素材进行编码,然后发送到像AWS这样的服务器。在使用AVCam捕获视频后,我是否应该使用类似ffmpeg 的工具来实时编码原始视频,然后使用HTTPRTSP将编码后的视频发送到服务器?还是我的理解有误?

3个回答

3
从iOS8开始,可以访问硬件支持的编解码器API。要了解如何实现此功能,请观看WWDC 2014会议上有关“直接访问视频编码和解码”的会议。传送门 简单来说,您可以从摄像机获取像素缓冲区,将其馈送到编码器中并得到编码块,然后您可以进一步将其馈入用于网络流传输的任何库中。在使用之前,您可能需要进行一些数据转换。 据我所记,FFmpeg确实支持rtsp,因此在获得对编码帧的访问权后,您应该能够使用它。

2

iOS设备以MOV或MP4的格式捕获视频。

使用AVFoundation(请参见thisthis等)可以从iOS设备相机中捕获原始数据(YUV、BGRA等)。

但手动编码原始数据并不高效,因为似乎在设备上使用硬件加速的唯一方法是通过AVAssetWrite进行输出文件。

有一种方法可以通过读取文件并使用RTSP和RTMP等协议对其进行分组来实现实时流传输,但这并不是非常直观。

您可以查看一些实现,例如:

http://www.gdcl.co.uk/2013/02/20/iOS-Video-Encoding.html 用于RTSP

Livu iPhone应用的流媒体支持库 用于RTMP(Livu的旧版库)

Livu应用程序的作者也在StackOverflow上,可以查看他的问题和回答:https://stackoverflow.com/users/227021/steve-mcfarlin


1
视频在存储在iOS设备上时已经编码完成——编码只是数字表示视频的一种方式,大多数情况下捕捉每个帧中每个像素的颜色和亮度等值。
大多数编码还包括压缩视频以节省空间的技术。这些技术包括使用某些帧作为后续帧(有时是前面帧)的参考。例如,第一帧可能是一个参考帧(通常称为I帧),对于接下来的五帧,只存储具有变化的像素,而不是所有的像素数据。可以很容易地理解,在场景中几乎没有运动或变化的情况下,这样做可以节省大量存储空间。
一般规则是,当你压缩视频时会失去一些质量,而且你压缩得越多,失去的质量就越多。在iOS上,您可以在设置视频捕获时指定所需的质量级别,请参见下面的“配置会话”一行。

除非你需要在本地存储不同于发送到服务器的质量级别,否则你应该只记录你想要的质量级别,并避免在手机上进行压缩,因为这对手机来说是相当费力的,如果可以避免就避免。如果你确实希望在手机上存储更高质量的内容,并且发送到服务器的质量较低(以加快传输或节省带宽),请查看此答案:


不知道这是否是一个愚蠢的问题,但如果我不想将其存储在iOS上,而是通过HTTP或RSTP自动将实时流发送到服务器怎么办? - abcf
@abcf 我想我们的帖子交叉了……请看答案更新的底部——简单来说,在录制时选择你想要的质量级别,以避免在发送流之前在设备上进行任何额外的压缩工作。 - Mick
@Mick,他需要进行直播而不仅仅是将文件上传到服务器。 - aergistal
1
@aergistal - 我想我想说的是,除非有不同质量格式的需求,否则最好尝试使用一个系统或框架支持的捕获+编码,以满足您所需的质量(无论您是要流式传输还是将其存储到文件中),因为它利用了硬件并避免了客户端上的额外转码。在iOS上,这篇博客文章上有一个非常好的讨论:http://blog.denivip.ru/index.php/2013/10/how-to-live-stream-video-as-you-shoot-it-in-ios/?lang=en。还请注意Dailymotion评论者在末尾的注释。 - Mick
@Mick - 真的是一篇非常有趣的文章。还有其他变量需要考虑,比如延迟。Dailymotion的方式很有趣且易于维护,但至少需要3秒加上第一个数据包的传输时间才能开始直播流程。 - aergistal

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