Я пытаюсь захватить один кадр из камеры Apple iSight, встроенный в Macbook Pro, используя Python (версия 2.7 или 2.6) и PyObjC (версия 2.2).Как захватить кадры из Apple iSight с помощью Python и PyObjC?
В качестве отправной точки, я использовал this old StackOverflow вопрос. Чтобы убедиться, что это имеет смысл, я перекрестно ссылаюсь на пример Apple's MyRecorder, на котором, похоже, основывается. К сожалению, мой скрипт не работает.
Моих большие вопросы:
- Am I инициализация камеры правильно?
- Правильно ли я начинаю цикл событий?
- Была ли какая-нибудь другая настройка, которую я должен был делать?
В приведенном ниже примере сценария предполагается, что после вызова функции startImageCapture() я должен начать печатать сообщения «Получил фрейм ...» из CaptureDelegate. Тем не менее, свет камеры никогда не включается, и обратный вызов делегата никогда не выполняется.
Кроме того, во время startImageCapture() нет сбоев, все функции утверждают, что они преуспели, и он успешно находит устройство iSight. Анализ объекта сеанса в pdb показывает, что он имеет допустимые объекты ввода и вывода, выход имеет назначенный делегат, устройство не используется другими процессами, а сеанс помечен как запущенный после вызова функции startRunning().
Вот код:
#!/usr/bin/env python2.7
import sys
import os
import time
import objc
import QTKit
import AppKit
from Foundation import NSObject
from Foundation import NSTimer
from PyObjCTools import AppHelper
objc.setVerbose(True)
class CaptureDelegate(NSObject):
def captureOutput_didOutputVideoFrame_withSampleBuffer_fromConnection_(self, captureOutput,
videoFrame, sampleBuffer,
connection):
# This should get called for every captured frame
print "Got a frame: %s" % videoFrame
class QuitClass(NSObject):
def quitMainLoop_(self, aTimer):
# Just stop the main loop.
print "Quitting main loop."
AppHelper.stopEventLoop()
def startImageCapture():
error = None
# Create a QT Capture session
session = QTKit.QTCaptureSession.alloc().init()
# Find iSight device and open it
dev = QTKit.QTCaptureDevice.defaultInputDeviceWithMediaType_(QTKit.QTMediaTypeVideo)
print "Device: %s" % dev
if not dev.open_(error):
print "Couldn't open capture device."
return
# Create an input instance with the device we found and add to session
input = QTKit.QTCaptureDeviceInput.alloc().initWithDevice_(dev)
if not session.addInput_error_(input, error):
print "Couldn't add input device."
return
# Create an output instance with a delegate for callbacks and add to session
output = QTKit.QTCaptureDecompressedVideoOutput.alloc().init()
delegate = CaptureDelegate.alloc().init()
output.setDelegate_(delegate)
if not session.addOutput_error_(output, error):
print "Failed to add output delegate."
return
# Start the capture
print "Initiating capture..."
session.startRunning()
def main():
# Open camera and start capturing frames
startImageCapture()
# Setup a timer to quit in 10 seconds (hack for now)
quitInst = QuitClass.alloc().init()
NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(10.0,
quitInst,
'quitMainLoop:',
None,
False)
# Start Cocoa's main event loop
AppHelper.runConsoleEventLoop(installInterrupt=True)
print "After event loop"
if __name__ == "__main__":
main()
Спасибо за любую помощь вы можете предоставить!
Прохладный человек, кстати, вы должны пометить свой собственный, принятый как «принятый» :) –
Этот скрипт отлично работает, но не работает при записи файла байта. Вы должны изменить open ('filename', 'w'), чтобы открыть ('filename', 'wb'), чтобы открыть файл в режиме байта, затем он работает. – andli