0

目前我正在使用AVFoundation从 iPhone 相机中抓取帧然后将它们转换为UIImage然后我将它传输到NSOutputStream我将它发送到我的其他设备。

不幸的是,我很可能因内存过多而崩溃,因为它一度达到 300mb。

我的问题:有没有更好的方法来做到这一点或其他一些方法可以使它停止崩溃或在我发送图像和在另一台设备上获取图像之间有更少的延迟?或者我可以让它像一个生命流,它几乎就像接收设备上的一个视频?

    - (void)captureOutput:(AVCaptureOutput *)captureOutput
    didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
           fromConnection:(AVCaptureConnection *)connection
    {

        @autoreleasepool {


        UIImage *image = [self imageFromSampleBuffer:sampleBuffer]; 

        [_room broadcastChatMessage:image fromUser:@"self"];

             dispatch_async(dispatch_get_main_queue(), ^(void){
                 [_imgView setImage:image];
             });

        }   
        // < Add your code here that uses the image >
    }
4

1 回答 1

2

从 iOS 设备流式传输视频的最佳选择之一是录制 H264 视频并从磁盘上的电影文件中提取 NAL 单元(它们代表帧切片)(使用AVFoundation),并使用您的协议通过网络发送它们选择。您可以在https://github.com/jamesghurley/VideoCore/blob/master/transforms/iOS/H264Encode.mm看到一个这样的例子。使用这种技术的延迟非常低。

然而,在另一台 iOS 设备上播放该内容是……复杂的。您可以使用 FFMpeg 实时播放它,或者如果您可以接受一些延迟(3-4 秒),您可以设置 HTTP 代理并通过 HLS 为 NAL 单元提供服务。这也是一个复杂的过程,但可能有一个库可以做到这一点。

编辑:稍微更新一下这个答案。现在 iOS 8 中有一个类AVSampleBufferDisplayLayer可以直接将 H.264 NAL 单元作为输入。

于 2014-04-19T00:12:26.957 回答