ios 中的视频编码
Video encoding in ios
所以我已经知道 Whosebug 上存在关于将 ios 设备上的实时视频流式传输到服务器的问题,但我要问的是编码部分。
我有点不知道有哪些软件编码服务可用于对来自 ios 设备的原始(实时)视频片段进行编码,以发送到像 AWS
这样的服务器。在使用 AVCam
捕获视频后,我是否会使用 ffmpeg
之类的东西来动态编码原始视频,然后使用 HTTP
或 RTSP
将编码后的视频发送到服务器?还是我概念有误?
视频在存储在 iOS 设备上时已经编码 - 编码只是以数字方式表示视频的一种方式,在大多数情况下捕获一些值来表示每个像素的颜色和亮度等在视频的每一帧中。
大多数编码还包括压缩视频以保存 space 的技术。这些技术包括使用一些帧作为后续帧(以及在某些情况下之前的帧)的参考。例如,第一帧可能是参考帧(通常称为 I 帧),而对于接下来的五帧,不是存储所有像素数据,而是仅存储发生变化的像素。很容易理解这如何节省大量存储空间,特别是对于场景中几乎没有移动或变化的场景。
一般来说,压缩时会损失一些质量,压缩得越多,损失的质量就越多。在 iOS 上,您可以在设置视频捕获时指定所需的质量级别 - 请参阅以下行中的 'Configuring a Session':
除非您需要以不同于发送到服务器的质量级别在本地存储,否则您应该只记录您想要的质量级别,避免在 phone 上压缩,因为它相当phone 需要做一些工作,如果可以的话。如果您确实希望将更高质量的图像存储在 phone 上并将较低质量的图像(以加快传输速度或节省带宽)发送到服务器,请查看此答案:
iOS 设备以 MOV 或 MP4 格式捕获视频。
可以使用 AVFoundation 从 iOS 设备相机捕获原始数据(YUV、BGRA 等)(参见 this and this 和许多其他).
然而,手动编码原始数据效率不高,因为显然在设备上使用硬件加速的唯一方法是通过 AVAssetWrite 输出文件。
有一种方法可以通过回读文件并使用 RTSP 和 RTMP 等协议对其进行打包来实现实时流式传输,但这不是很简单。
您可以查看一些实现,例如:
http://www.gdcl.co.uk/2013/02/20/iOS-Video-Encoding.html 用于 RTSP
和
Streaming support library for the Livu iPhone application 对于 RTMP
(Livu 的旧库)
Livu App的作者也在Whosebug上,查看他的Q&A:
https://whosebug.com/users/227021/steve-mcfarlin
从 iOS8 开始,可以访问 encoder/decoder api 支持的硬件。
要大致了解如何完成此操作,请观看“Direct Access to Video Encoding and Decoding”上的 WWDC 2014 session。
简而言之,您从相机获取像素缓冲区,将它们提供给编码器,然后您获得编码块,然后您可以将其提供给您用于网络流媒体的任何库。您可能必须先进行一些数据转换,然后才能使用它。
据我记得 ffmpeg 确实有 rtsp 支持,所以你应该能够在访问编码帧后使用它...
所以我已经知道 Whosebug 上存在关于将 ios 设备上的实时视频流式传输到服务器的问题,但我要问的是编码部分。
我有点不知道有哪些软件编码服务可用于对来自 ios 设备的原始(实时)视频片段进行编码,以发送到像 AWS
这样的服务器。在使用 AVCam
捕获视频后,我是否会使用 ffmpeg
之类的东西来动态编码原始视频,然后使用 HTTP
或 RTSP
将编码后的视频发送到服务器?还是我概念有误?
视频在存储在 iOS 设备上时已经编码 - 编码只是以数字方式表示视频的一种方式,在大多数情况下捕获一些值来表示每个像素的颜色和亮度等在视频的每一帧中。
大多数编码还包括压缩视频以保存 space 的技术。这些技术包括使用一些帧作为后续帧(以及在某些情况下之前的帧)的参考。例如,第一帧可能是参考帧(通常称为 I 帧),而对于接下来的五帧,不是存储所有像素数据,而是仅存储发生变化的像素。很容易理解这如何节省大量存储空间,特别是对于场景中几乎没有移动或变化的场景。
一般来说,压缩时会损失一些质量,压缩得越多,损失的质量就越多。在 iOS 上,您可以在设置视频捕获时指定所需的质量级别 - 请参阅以下行中的 'Configuring a Session':
除非您需要以不同于发送到服务器的质量级别在本地存储,否则您应该只记录您想要的质量级别,避免在 phone 上压缩,因为它相当phone 需要做一些工作,如果可以的话。如果您确实希望将更高质量的图像存储在 phone 上并将较低质量的图像(以加快传输速度或节省带宽)发送到服务器,请查看此答案:
iOS 设备以 MOV 或 MP4 格式捕获视频。
可以使用 AVFoundation 从 iOS 设备相机捕获原始数据(YUV、BGRA 等)(参见 this and this 和许多其他).
然而,手动编码原始数据效率不高,因为显然在设备上使用硬件加速的唯一方法是通过 AVAssetWrite 输出文件。
有一种方法可以通过回读文件并使用 RTSP 和 RTMP 等协议对其进行打包来实现实时流式传输,但这不是很简单。
您可以查看一些实现,例如:
http://www.gdcl.co.uk/2013/02/20/iOS-Video-Encoding.html 用于 RTSP
和
Streaming support library for the Livu iPhone application 对于 RTMP (Livu 的旧库)
Livu App的作者也在Whosebug上,查看他的Q&A: https://whosebug.com/users/227021/steve-mcfarlin
从 iOS8 开始,可以访问 encoder/decoder api 支持的硬件。 要大致了解如何完成此操作,请观看“Direct Access to Video Encoding and Decoding”上的 WWDC 2014 session。 简而言之,您从相机获取像素缓冲区,将它们提供给编码器,然后您获得编码块,然后您可以将其提供给您用于网络流媒体的任何库。您可能必须先进行一些数据转换,然后才能使用它。 据我记得 ffmpeg 确实有 rtsp 支持,所以你应该能够在访问编码帧后使用它...