У меня есть контроллер вида, который записывает видео (на лицевую сторону) пользователя. Следующий код используется:Записанное видео иногда отображается, иногда нет
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = [paths objectAtIndex:0];
NSString *outputPath = [[NSString alloc] initWithFormat:@"%@", [basePath stringByAppendingPathComponent:@"output.mp4"]];
if ([[NSFileManager defaultManager] isDeletableFileAtPath:outputPath])
[[NSFileManager defaultManager] removeItemAtPath:outputPath error:NULL];
NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputPath];
[movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
self.outputURL = outputURL;
Где movieFileOutput
является AVCaptureMovieFileOutput
объект. Я могу показать вам код конфигурации/настройки камеры (это не контроллер выбора изображений или любой пользовательский интерфейс Apple, это снимает пользователя в фоновом режиме, пока они взаимодействуют с совершенно другим экраном), но в целом я знаю, что он работает.
После этого вызывается [movieFileOutput stopRecording];
, и пользователь переходит на новый экран, где воспроизводится только что записанная запись. Перехожу на outputURL
объекта к этому вновь инициализируется контроллер представления, где VC играет его, используя следующий код:
self.player = [[MPMoviePlayerController alloc] initWithContentURL:self.outputURL];
self.player.view.frame = CGRectMake(0, 0, self.view.frame.size.width, 320);
self.player.movieSourceType = MPMovieSourceTypeFile;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackComplete:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.player];
self.player.controlStyle = MPMovieControlStyleNone;
self.player.shouldAutoplay = YES;
[self.player setFullscreen:YES animated:NO];
[self.player prepareToPlay];
[self.view addSubview:[self.player view]];
[self.player play];
Таким образом, первый раз, все работает. Приложение записывает видео, затем отображается следующий экран, и отображается видео. Но тогда, если вы нажмете кнопку «Отменить», которая переместится полностью назад в начало приложения и снова выполнит весь процесс, то работает , а не, а вместо этого игрок показывает черный экран. При этом я печатаю длину данных на пути и всегда всегда большое количество (следовательно, что-то существует на этом пути).
Как ни странно, я решил просто напечатать NSData сам объект так:
NSLog(@"%@", [NSData dataWithContentsOfURL:self.outputURL]);
И действительно очень большая строка символов (возможно, байты не уверены?) Печатается. Тем не менее, по какой-то причине, теперь все работает нормально ... когда я добавьте этот NSLog(), ошибка больше не возникает. Когда я удаляю его, это происходит снова! Я проверил это строго.
Но все же есть некоторые нечетные времена с включением этого NSLog(), когда через три раза воспроизводится черный экран. Я очень смущен, почему эта ошибка может возникнуть и как на Земле включение NSLog() может изменить любое поведение.
Любые идеи?
Согласен - вам нужно убедиться, что установлен делегат фильма MovieFileOutput, и что вы реализуете эти методы делегатов и ждете подтверждения там, что все закончилось нормально. Различные вещи могут пойти не так, классический - это то, что вы исчерпали дисковое пространство на полпути. Вам необходимо реализовать эти методы, обработать ошибки и использовать их соответственно. –