Tengo el siguiente script PyObjC:¿Cómo puedo capturar marcos de iSight con Python en Snow Leopard?
from Foundation import NSObject
import QTKit
error = None
capture_session = QTKit.QTCaptureSession.alloc().init()
print 'capture_session', capture_session
device = QTKit.QTCaptureDevice.defaultInputDeviceWithMediaType_(QTKit.QTMediaTypeVideo)
print 'device', device, type(device)
success = device.open_(error)
print 'device open success', success, error
if not success:
raise Exception(error)
capture_device_input = QTKit.QTCaptureDeviceInput.alloc().initWithDevice_(device)
print 'capture_device_input', capture_device_input, capture_device_input.device()
success = capture_session.addInput_error_(capture_device_input, error)
print 'session add input success', success, error
if not success:
raise Exception(error)
capture_decompressed_video_output = QTKit.QTCaptureDecompressedVideoOutput.alloc().init()
print 'capture_decompressed_video_output', capture_decompressed_video_output
class Delegate(NSObject):
def captureOutput_didOutputVideoFrame_withSampleBuffer_fromConnection_(self, captureOutput, videoFrame, sampleBuffer, connection):
print videoFrame, sampleBuffer, connection
delegate = Delegate.alloc().init()
print 'delegate', delegate
capture_decompressed_video_output.setDelegate_(delegate)
print 'output delegate:', capture_decompressed_video_output.delegate()
success = capture_session.addOutput_error_(capture_decompressed_video_output, error)
print 'capture session add output success', success, error
if not success:
raise Exception(error)
print 'about to run session', capture_session, 'with inputs', capture_session.inputs(), 'and outputs', capture_session.outputs()
capture_session.startRunning()
print 'capture session is running?', capture_session.isRunning()
import time
time.sleep(10)
El programa de informes de errores, pero la luz verde del iSight no está habilitada y devolución de llamada captura de fotogramas del delegado nunca es llamado. Aquí está la salida me sale:
$ python prueba.py
capture_session <QTCaptureSession: 0x1006c16f0>
device Built-in iSight <objective-c class QTCaptureDALDevice at 0x7fff70366aa8>
device open success (True, None) None
capture_device_input <QTCaptureDeviceInput: 0x1002ae010> Built-in iSight
session add input success (True, None) None
capture_decompressed_video_output <QTCaptureDecompressedVideoOutput: 0x104239f10>
delegate <Delegate: 0x10423af50>
output delegate: <Delegate: 0x10423af50>
capture session add output success (True, None) None
about to run session <QTCaptureSession: 0x1006c16f0> with inputs (
"<QTCaptureDeviceInput: 0x1002ae010>"
) and outputs (
"<QTCaptureDecompressedVideoOutput: 0x104239f10>"
)
capture session is running? True
PD: Por favor, no responder yo debería tratar PySight, tengo pero no va a funcionar porque Xcode no puede compilar CocoaSequenceGrabber en 64 bits.
@ Dan: Gracias por el puntero! Es mi primera experiencia con la programación de Mac OS X y no tenía ni idea. Lo hice funcionar invocando 'AppHelper.runConsoleEventLoop()' en su lugar al final del script, sin necesidad de 'Plist'. Ahora mi problema es que toma el hilo principal y nunca vuelve. Esperaba envolverlo muy bien en un módulo de una manera no intrusiva. –
Podría generar un hilo y manejarlo dentro del hilo, probablemente. QT no es inseguro, pero en este contexto todo lo que significa es que tienes que hacer todas tus cosas de QT en un hilo, que no es necesariamente el hilo principal. También puede consultar los temporizadores, pero creo que probablemente todavía necesite un bucle principal para eso. – Dan
Aparentemente, tiene que ser el hilo principal. Si hago 'Thread (target = AppHelper.runConsoleEventLoop) .start()' en su lugar, me sale un montón de errores y nada funciona: '2009-10-20 12: 58: 32.075 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Objeto 0x1018065b0 de la clase NSCFString liberado automáticamente sin agrupación en su lugar - solo goteando 2009-10-20 12: 58: 32.078 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Objeto 0x101821130 de la clase NSCFString liberado automáticamente sin piscina en su lugar - solo goteando 2009-10-20 12: 58: 32.078 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Objeto 0x101828df0 de clase NSCFString autorelease' –