2015-12-13 2 views
2

У меня есть контроллер вида, который записывает видео (на лицевую сторону) пользователя. Следующий код используется:Записанное видео иногда отображается, иногда нет

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() может изменить любое поведение.

Любые идеи?

ответ

1

Я предполагаю, что вам нужно дождаться сохранения файла.

Документация AVCaptureFileOutput говорит:

Когда запись остановлена ​​либо вызовом этого метода, путем изменения файлов с помощью startRecordingToOutputFileURL:recordingDelegate: или из-за ошибки, оставшиеся данные, которые должны быть включены в Файл будет записан в фоновом режиме. Поэтому, прежде чем использовать файл, вы должны ждать, пока делегат, который был указан в startRecordingToOutputFileURL:recordingDelegate: не уведомляется, когда все данные были записаны в файл с помощью метода captureOutput:didFinishRecordingToOutputFileAtURL:fromConnections:error: .

+0

Согласен - вам нужно убедиться, что установлен делегат фильма MovieFileOutput, и что вы реализуете эти методы делегатов и ждете подтверждения там, что все закончилось нормально. Различные вещи могут пойти не так, классический - это то, что вы исчерпали дисковое пространство на полпути. Вам необходимо реализовать эти методы, обработать ошибки и использовать их соответственно. –

Смежные вопросы