想在macOS平台上写一个将Mac摄像头上获取到的视频数据使用VideoToolBox编码后socket发送出去的服务器,但是遇到了好多问题
先是在接受数据的客户端最终渲染出来的视频中发现绿屏现象,如下图所示:
并且报-12911的错误信息,网上查了一下说是视频数据不完整的原因,
经过验证,初步排除了socket收发数据有误的可能,所以暂时将焦点放在了macOS端的工程上,
将macOS上采集到的视频进行VideoToolBox编码,编码后写入文件,存储成h.264文件,用VLC进行播放时,发现视频整体速度偏快
经过好一番折腾,终于发现有蹊跷的地方:AVCapture输出流代理
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection;
一般情况下,当在iOS环境下,默认情况下,为30 fps,意味着该函数每秒调用30次
但是在macOS端的工程上,每秒的调用并没有达到30次,有时候只有15次,有时候又是20次…
猜想正是因为这样,而编码器以为每秒还是有30帧,所以VLC进行播放时,走了30帧,以为是1秒,但是实际上不止有1秒,因此播放时会有快进的感觉。
在代理中简单打印摄像头输出数据的信息:
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CMVideoFormatDescriptionRef desc = NULL;
CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixelBuffer, &desc);
CFDictionaryRef extensions = CMFormatDescriptionGetExtensions(desc);
NSLog(@"extensions = %@", extensions);
输出:
extensions = {
CVBytesPerRow = 1924;
CVImageBufferColorPrimaries = "ITU_R_709_2";
CVImageBufferTransferFunction = "