流媒体视频的更好方式

时间:2014-04-17 20:49:54

标签: ios avfoundation nsoutputstream live-video

目前我正在使用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 >
    }

1 个答案:

答案 0 :(得分: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单元作为输入。