0

現在、私はAVFoundationiPhoneカメラからフレームを取得し、それらをに変換してから、他のデバイスに送信するために使用しています UIImageNSOutputStream

残念ながら、ある時点で 300 MB に達すると、おそらくメモリが多すぎるためにクラッシュします。

私の質問:これを行うためのより良い方法、またはクラッシュを停止したり、他のデバイスで画像を取得したときのように画像を送信する間の遅延を少なくしたりする他の方法はありますか? または、受信側のデバイスのビデオのようなものをライフストリームのようにすることはできますか?

    - (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 デバイスからビデオをストリーミングするための最良のオプションの 1 つは、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 に答える