前一节,我们为程序识别到的二维码提供了可视化的显示,这一节,我们使用合成语音朗读扫描到的二维码的内容。
修改ViewController.m,定义以下实例变量并进行初始化:
AVSpeechSynthesizer *_speechSynthesizer;
_speechSynthesizer = [[AVSpeechSynthesizer alloc] init];
初始化语音合成器十分简单。语音合成器会控制对每个语音数据的回放和顺序。初始化完成后,Metadata output将触发语音合成器来朗读扫描到的二维码的内容。
跟踪二维码的变化
添加以下代码到captureOutput:didOutputMetadataObjects:fromConnection:的开始位置:
NSSet *originalBarcodes = [NSSet setWithArray:_barcodes.allValues];
目的是在处理一个新的frame前,将所有检测到的二维码存储起来。用于比较已经缓存的二维码和新检测到的二维码是否相同。
添加以下代码到enumerateObjectsUsingBlock的"}];"之后:
NSMutableSet *newBarcodes = [foundBarcodes mutableCopy]; [newBarcodes minusSet:originalBarcodes];
这段代码利用集合的减操作,去除已经缓存了的二维码,只保留新扫描到的二维码。
最后,我们再次利用集合操作移除已经不在屏幕范围内的二维码,并更新_barcode字典:
NSMutableSet *goneBarcodes = [originalBarcodes mutableCopy]; [goneBarcodes minusSet:foundBarcodes]; [goneBarcodes enumerateObjectsUsingBlock: ^(Barcode *barcode, BOOL *stop) { [_barcodes removeObjectForKey:barcode.metadataObject.stringValue]; }];
创建“说话方式”
接下来,我们为所有二维码数据设置“说话方式”,包括频率、音量、音高。最后调用speakUtterace:朗读出二维码的内容:
// Speak the new barcodes [newBarcodes enumerateObjectsUsingBlock:^(Barcode *barcode, BOOL *stop) { AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:barcode.metadataObject.stringValue]; utterance.rate = AVSpeechUtteranceMinimumSpeechRate + ((AVSpeechUtteranceMaximumSpeechRate - AVSpeechUtteranceMinimumSpeechRate) * 0.5f); utterance.volume = 1.0f; utterance.pitchMultiplier = 1.2f; [_speechSynthesizer speakUtterance:utterance]; }];
修改startRunning方法,使能AudioSession:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:0 error:nil]; [[AVAudioSession sharedInstance] setActive:YES error:nil];
修改stopRunning方法,禁用音频AudioSession:
[[AVAudioSession sharedInstance] setActive:NO error:nil];
编译运行,当程序识别到二维码时,将用语音朗读出二维码的内容。
下一节,我们将为程序添加图像缩放功能。
转载请注明出处:http://blog.csdn.net/yamingwu/article/details/44535513
时间: 2024-12-28 00:50:25