В моем приложении у меня есть воспроизведение видео, а также распознавание речи. Воспроизведение видео воспроизводится нормально, если я не использую распознавание речи. Я также могу получить опции Air play как «iPhone» и «Apple TV» (у меня Apple TV в сети).
Но когда я использую распознавание речи и выхожу из него, видео не воспроизводится. Он просто сидит с черным экраном на 00.00s. Меню Airplay больше не отображает «iPhone» и «Apple TV». На самом деле он не показывает никаких вариантов и говорит, что ищет «Apple TV». Заглавная часть экрана Airplay показывает «iPhone -> IPHONE MICROPHONE» «Музыка».
В консоли я получаю следующее сообщение, когда видео не играть: "<<< AVOutputDeviceDiscoverySession (FigRouteDiscoverer) >>>> - [AVFigRouteDiscovererOutputDeviceDiscoverySessionImpl outputDeviceDiscoverySessionDidChangeDiscoveryMode]: Установка режима обнаружения устройств в DiscoveryMode_Presence (клиент: VideoPlayer)"
В моем коде я не запускаю обнаружение Airplay или чего-то в этом роде, но это как-то мешает после использования распознавателя речи.
Вот код для запуска и остановки распознавания речи:
- (void)startListening {
// Initialize the AVAudioEngine
_audioEngine = [[AVAudioEngine alloc] init];
// Make sure there's not a recognition task already running
if (_recognitionTask) {
[_recognitionTask cancel];
_recognitionTask = nil;
}
// Starts an AVAudio Session
NSError *error;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryRecord error:&error];
[audioSession setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];
// Starts a recognition process, in the block it logs the input or stops the audio
// process if there's an error.
_recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init];
AVAudioInputNode *inputNode = _audioEngine.inputNode;
_recognitionRequest.shouldReportPartialResults = YES;
_recognitionTask = [_speechRecognizer recognitionTaskWithRequest:_recognitionRequest
resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
BOOL isFinal = NO;
if (result) {
// Whatever you say in the microphone after pressing the button should be being logged
// in the console.
NSLog(@"RESULT:%@",result.bestTranscription.formattedString);
isFinal = !result.isFinal;
NSDictionary *dic = [ [NSDictionary alloc] initWithObjectsAndKeys:
result.bestTranscription.formattedString, @"bestTranscription",
result.transcriptions, @"transcriptions",
nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"monitorSpeech" object:nil userInfo:dic];
}
if (error) {
NSLog(@"%s - Stopping Audio Engine and resetting recoginitionRequest/Task. Error holds:%@", __PRETTY_FUNCTION__, error);
[_audioEngine stop];
[inputNode removeTapOnBus:0];
_recognitionRequest = nil;
_recognitionTask = nil;
}
}];
// Sets the recording format
AVAudioFormat *recordingFormat = [inputNode outputFormatForBus:0];
[inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
[_recognitionRequest appendAudioPCMBuffer:buffer];
}];
// Starts the audio engine, i.e. it starts listening.
[_audioEngine prepare];
[_audioEngine startAndReturnError:&error];
NSLog(@"Say Something, I'm listening");
}
-(void) stopListening {
[_audioEngine stop];
//[_audioEngine.inputNode removeTapOnBus:0];
[_audioEngine reset];
[_recognitionRequest endAudio];
[_recognitionTask cancel];
//[_recognitionTask finish];
_recognitionTask = nil;
_recognitionRequest = nil;
}
Для воспроизведения видео я использую AVPlayerViewController.
Пожалуйста, совет, как решить эту проблему. Спасибо!