我试图让我的PyObjC应用程序在用户单击按钮时录制音频。我试图使用AVAuidioRecorder类。我的代码是:
@IBAction
def startRecording_(self, sender):
audioPath = '~/Desktop/recordTest.mp3'
audioPathStr = NSString.stringByExpandingTildeInPath(audioPath)
audioURL = NSURL.fileURLWithPath_(audioPathStr)
audioSettings = {'AVFormatIDKey': 'kAudioFormatAppleIMA4', 'AVSampleRateKey': 1600.0, 'AVNumberOfChannelsKey': 1 }
audioDict = NSDictionary.dictionaryWithDictionary_(audioSettings)
(recorder, error) = AVAudioRecorder.alloc().initWithURL_settings_error_(audioURL, audioDict, objc.nil)
recorder.record()
运行上述代码时,出现以下错误:
^{pr2}$似乎initWithURL_settings_error_
方法需要一个iterable对象作为其第三个参数。但是,我认为当我使用一个调用错误参数的PyObjC方法时,我可以将objc.nil
或{
当我对NSString方法使用类似语法时:
(names, error) = NSString.stringWithContentsOfFile_encoding_error_(u"/usr/share/dict/propernames", NSASCIIStringEncoding, objc.nil)
代码运行。在
为什么我对AVAudioRecord方法的调用不起作用?是因为方法调用的是outError,而NSString方法调用的是错误?在
代码不能用于此AVFoundation类,因为PyObjC没有该框架的元数据描述。因此,它知道最后一个参数是什么类型的参数,它只知道它是指向对象的指针,但不知道它被用作传递引用输出参数。在
要手动检查PyObjC对这个参数的了解:
这里的类型应该是“o^@”。在
这是苹果的PyObjC版本:您可以在该版本中使用“importavfoundation”,它将使用AVFoundation框架内的BridgeSupport数据文件。遗憾的是,数据是不完整的,并且没有关于这个方法的信息,这就是为什么这里的类型是错误的。在
通过使用PyObjCs元数据API可以很容易地解决此问题:
^{pr2}$修复所有AVFoundation的元数据需要更多的工作:-(
相关问题 更多 >
编程相关推荐