У меня есть следующий сценарий: PyObjCКак я могу захватить рамки iSight с помощью Python в 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)
Программа отчетов без ошибок, но зеленый свет ISight в никогда не активируется и захват кадра обратного вызова делегата никогда не вызывается. Вот результат я получаю:
$ 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
PS: Пожалуйста, не отвечайте, я должен попробовать PySight, у меня есть, но это не будет работать, потому что Xcode не может скомпилировать CocoaSequenceGrabber в 64bit.
@Dan: Спасибо за указатель! Это мой первый опыт в программировании на Mac OS X, и я был абсолютно невежественным. Я получил его для работы с вызовом 'AppHelper.runConsoleEventLoop()' вместо этого в конце скрипта, нет необходимости в 'Plist'. Теперь моя проблема в том, что он берет на себя основной поток и никогда не возвращается. Я надеялся обернуть его в модуле неинтрузивным способом. –
Возможно, вы можете создать поток и обработать его внутри потока. QT не является потокобезопасным, но в этом контексте все это означает, что вам нужно делать все ваши вещи QT в одном потоке, что не обязательно является основным потоком. Вы также можете заглянуть в таймеры, но я думаю, вам, вероятно, все еще нужен основной цикл для этого. – Dan
По-видимому, это должен быть основной поток. Если я делаю 'Thread (target = AppHelper.runConsoleEventLoop) .start()' вместо этого, я получаю кучу ошибок и ничего не работает: '2009-10-20 12: 58: 32.075 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Объект 0x1018065b0 класса NSCFString автореализован без пула на месте - просто утечка 2009-10-20 12: 58: 32.078 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Объект 0x101821130 класса NSCFString, автореализованный без бассейн на месте - просто утечка 2009-10-20 12: 58: 32.078 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Объект 0x101828df0 класса NSCFString autorelease' –