Tôi có kịch bản PyObjC sau:Làm cách nào để chụp khung iSight bằng Python trong 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)
Báo cáo chương trình không có lỗi, nhưng ánh sáng màu xanh lá cây iSight của không bao giờ được kích hoạt và gọi lại chụp khung của đại biểu không bao giờ được gọi. Đây là đầu ra tôi nhận được:
$ 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: Xin đừng trả lời Tôi nên thử PySight, tôi có nhưng nó sẽ không hoạt động vì Xcode không thể biên dịch CocoaSequenceGrabber trong 64bit.
@ Dan: Cảm ơn con trỏ! Đó là trải nghiệm đầu tiên của tôi với lập trình Mac OS X và tôi hoàn toàn không biết gì. Tôi đã nhận nó để làm việc gọi 'AppHelper.runConsoleEventLoop()' thay vì ở cuối kịch bản, không cần cho 'Plist'. Bây giờ vấn đề của tôi là nó chiếm toàn bộ luồng chính và không bao giờ trả về. Tôi đã hy vọng để bọc nó độc đáo trong một mô-đun một cách không xâm nhập. –
Bạn có thể sinh ra một sợi và xử lý nó trong chuỗi, có thể. QT không phải là luồng an toàn, nhưng trong bối cảnh này tất cả điều đó có nghĩa là bạn phải làm tất cả các công cụ QT của bạn trong một luồng, mà không nhất thiết phải là chủ đề chính. Bạn cũng có thể nhìn vào bộ đếm thời gian, nhưng tôi nghĩ bạn có lẽ vẫn cần một vòng lặp chính cho điều đó. – Dan
Rõ ràng, nó phải là chủ đề chính. Nếu tôi làm 'Thread (target = AppHelper.runConsoleEventLoop) .start()' thay vào đó, tôi nhận được một loạt các lỗi và không có gì hoạt động: '2009-10-20 12: 58: 32.075 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Đối tượng 0x1018065b0 của lớp NSCFString tự động chạy mà không có hồ bơi tại chỗ - chỉ rò rỉ 2009-10-20 12: 58: 32.078 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Object 0x101821130 của lớp NSCFString autoreleased with no hồ bơi tại chỗ - chỉ rò rỉ 2009-10-20 12: 58: 32.078 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Object 0x101828df0 của lớp NSCFString autorelease' –