2009-10-03 18 views
7

Wdrażam oprogramowanie do tworzenia wideo z kamery internetowej. Widziałem próbkę MyRecorder w Apple Dev i działa dobrze.Ramka do uchwycenia kakao z kamery internetowej

Próbowałem dodać przycisk, aby zrobić zdjęcie z filmu z tego kodu:

- (IBAction)addFrame:(id)sender 
{ 
    CVImageBufferRef imageBuffer; 
    @synchronized (self) { 
     imageBuffer = CVBufferRetain(mCurrentImageBuffer); 
    } 
    if (imageBuffer) { 
    [ bla bla bla ]  
    } 
} 

ale mCurrentImageBuffer jest zawsze pusty. Jak mogę pobrać bieżącą ramkę z mojej kamery i umieścić mCurrentImageBuffer?

Próbowałem użyć

(void)captureOutput:(QTCaptureOutput *)captureOutput 
        didOutputVideoFrame:(CVImageBufferRef)videoFrame 
        withSampleBuffer:(QTSampleBuffer *)sampleBuffer 
        fromConnection:(QTCaptureConnection *)connection 
{ 
    CVImageBufferRef imageBufferToRelease; 

    CVBufferRetain(videoFrame); 

    @synchronized (self) { 
     imageBufferToRelease = mCurrentImageBuffer; 
     mCurrentImageBuffer = videoFrame; 
    } 
    CVBufferRelease(imageBufferToRelease); 
} 

ale to nigdy nie dzwonił. Jak mogę zdecydować, kiedy metoda delegowania połączeń captureOutput? Każdy pomysł?

Dzięki, Andrea

+0

Po zakończeniu inicjalizacji wideo przesunąłem kod definicji QTCaptureDecompressedVideoOutput, a teraz mCurrentImageBuffer nie jest pusty, ale na dysku nie są zapisywane żadne filmy wideo –

+0

The [imagesnap] (http://iharder.sourceforge.net/current/ macosx/imagesnap /) projekt open-source jest narzędziem wiersza poleceń C do robienia zdjęć z kamery internetowej. –

Odpowiedz

3

Wygląda na to, że próbujesz użyć interfejsu API przechwytywania QTKit do przechwytywania wideo z kamery internetowej. Przykładowa aplikacja MyRecorder to najprostszy program do przechwytywania wideo, który można wykonać za pomocą tego interfejsu API. Z opisu tego nie wynikało, ale musisz upewnić się, że podążasz za ich przykładem i zainicjalizować sesję wideo w taki sam sposób jak w metodzie -awakeFromNib w MyRecorderController. Jeśli tego nie zrobisz, nie zostanie przechwycony żaden film wideo.

Jeśli chodzi o metodę, której próbujesz użyć, -captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection: jest metodą delegowania dla QTCaptureDecompressedVideoOutput. Wystąpienie tej klasy nie występuje w przykładzie MyRecorder, ponieważ ten przykład zapisuje skompresowane wideo na dysk. Aby użyć tej opcji, musisz utworzyć instancję QTCaptureDecompressedVideoOutput, dołączyć ją do swojego urządzenia QTCaptureSession przy użyciu -addOutput:error: i ustawić delegata dla instancji QTCaptureDecompressedVideoOutput, aby była klasą.

Aby uzyskać więcej informacji na temat tego, jak QTKit radzi sobie z takimi rzeczami, zapoznaj się z sekcją QTKit Capture z QTKit Application Programming Guide.

+0

Deklarowałem QTCaptureDecompressedVideoOutput na metodzie -awakeFromNib i dodałem go do QTCaptureSession, ale w takim przypadku przechwytywanie obrazu działa dobrze, a wideo nie jest zapisywane na dysku. –

+0

Problem polega na tym, że mam 2 typy addOutput: QTCaptureDecompressedVideoOutput do zapisywania obrazu i mCaptureMovieFileOutput do przechowywania wideo. Czy możliwe jest posiadanie 2 danych wyjściowych lub czy mogę zdefiniować 2 QTCaptureSession? –

+0

Powinieneś mieć dwa wyjścia z jednym wejściem wideo. Apple pokazuje w tym celu schemat blokowy w powyższym przewodniku QTKit. Jak intensywny procesor jest potrzebny do przechwytywania obrazu? Być może nie powróci on z metody delegatów wystarczająco szybko, aby umożliwić nagrywanie wideo. Domyślnie przechwytywanie wideo wykorzystuje kodowanie H.264, które jest dość ciężkie. Możesz spróbować ustawić wideo na QTCompressionOptions240SizeMPEG4Video i zobaczyć, co się stanie. –

3

Próbowałem użyć

- (void)captureOutput:(QTCaptureOutput *)captureOutput 
           didOutputVideoFrame:(CVImageBufferRef)videoFrame 
           withSampleBuffer:(QTSampleBuffer *)sampleBuffer 
           fromConnection:(QTCaptureConnection *)connection 

ale to nigdy nie dzwonił.

Czy obiekt wdrażający tę metodę przyjmuje delegata obiektu wyjściowego przechwytywania?

+1

To jest mój problem, nie rozumiem dobrze tego kroku. –

+0

Musisz być delegatem obiektu wyjściowego przechwytywania. Zobacz http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html i metodę 'setDelegate:' obiektu wyjściowego przechwytywania. –

+0

Idealne, widziałem na próbce Apple (bardzo przydatne) dzięki! –

Powiązane problemy