4

iPhoneのビデオカメラから受け取った配列150 CMSampleBufferRefに収集しようとしています。どういうわけか、カメラは 13 回のバッファの後、デリゲートの呼び出しを停止します。NSMutableArray、CFArray を操作してみました。何も助けませんでした。メモリに問題があると思われますが、メモリの警告については何も得られません。

喜んでお手伝いさせていただきます。
ありがとうございます。

            session = [[AVCaptureSession alloc]init];
            //Quality Preset
            if ([session canSetSessionPreset:AVCaptureSessionPresetLow]) {
                session.sessionPreset = AVCaptureSessionPresetLow;
            }


            [session beginConfiguration];
            AVCaptureDevice *videoDevice = [AVCaptureDevice   defaultDeviceWithMediaType:AVMediaTypeVideo];
            AVCaptureDeviceInput *newVideoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil];

            AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];

            output.videoSettings = @{ (NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA) };
            dispatch_queue_t queue = dispatch_queue_create("MyQueue", NULL);
            [output setSampleBufferDelegate:self queue:queue];

            [session addOutput:output];
            [session addInput:newVideoDeviceInput];
            AVCaptureConnection *conn = [output connectionWithMediaType:AVMediaTypeVideo];



            if (conn.supportsVideoMinFrameDuration)
                conn.videoMinFrameDuration = CMTimeMake(1, 10);
            if (conn.supportsVideoMaxFrameDuration)
                conn.videoMaxFrameDuration = CMTimeMake(1, 10);


            [session commitConfiguration];

            arr = CFArrayCreateMutable( NULL, 150, &kCFTypeArrayCallBacks );
            counter=0;
            [session startRunning];

それが私の StartRecording メソッドでした。

        - (void)captureOutput:(AVCaptureOutput *)captureOutput
        didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
               fromConnection:(AVCaptureConnection *)connection {
            if (counter==150) {
        [self StopRecording:nil];
        return;
    }
            CFArrayInsertValueAtIndex(arr, counter, sampleBuffer);

            counter= (counter+1)%150;

        }
        @end

それがバッファコレクション方式です。

4

1 に答える 1

2

あなたは何をしようとしているのですか?AVFoundation は、CMSampleBuffer をハードウェア エンコーダーに渡します。私の理論では、着信フレームが検出されない場合、フレームの通過が停止するだけです。代わりに、CVPixelBufferRef を CVPixelBufferPool に保存してみてください。

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
于 2014-02-26T10:05:24.217 に答える