Ответ 1
Эта проблема кажется исправленной после обновления iOS устройства до 5.0.
Кажется, проблема с SDK для iOS для предыдущей версии
Я использую MPMoviePlayerController
для воспроизведения локального файла в папке "Документ приложения", который я загрузил для URL-адреса сервера:
itemMoviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:fileURL];
[self.view addSubview:itemMoviePlayerController.view];
itemMoviePlayerController.fullscreen = YES;
itemMoviePlayerController.movieSourceType = MPMovieSourceTypeFile;
itemMoviePlayerController.initialPlaybackTime = -1.0;
[itemMoviePlayerController play];
Когда я воспроизвожу файл .mov
сразу после его загрузки, он показывает черный пустой экран и пользовательский интерфейс приложения непригоден.
Но если играть в тот же локальный файл в следующий раз, он отлично работает.
Я даже проверил playState
и localState
для MPMoviePlayerController
, они кажутся прекрасными.
Что может быть причиной черного пустого экрана?
Эта проблема кажется исправленной после обновления iOS устройства до 5.0.
Кажется, проблема с SDK для iOS для предыдущей версии
Вам нужно сохранить свой экземпляр MPMoviePlayerController i.e в качестве свойства или переменной экземпляра. Ссылка на проигрывателя проиграна, если вы не сохранили его.
Вы можете попробовать поставить [itemMoviePlayerController prepareToPlay];
перед [itemMoviePlayerController play];
Способ, которым Apple предпочитает отображать только полноэкранное видео, - это представить модальный MPMoviePlayerViewController
(как сказал Холланс).
Чтобы представить его, вы должны использовать что-то вроде:
moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:fileURL];
[self presentMoviePlayerViewControllerAnimated:moviePlayerViewController];
[itemMoviePlayerController play];
Это задокументировано Apple здесь
Вы можете прочитать там, что вы должны хранить ссылку на свой MPMoviePlayerViewController
, чтобы позже ее отклонить с помощью
[self dismissMoviePlayerViewControllerAnimated:moviePlayerViewController]
.
Я исправил это, поставив
@property (strong, nonatomic) MPMoviePlayerController *moviePlayer;
в моем .h файле и вызывая self.moviePlayer
во всем моем коде, и он сработает!
Вместо этого вам нужно использовать MPMoviePlayerViewController. Обратите внимание на слово "Вид".
Надеюсь, это поможет. Я решил эту проблему в своем проекте
-(void)startPlayingMovie
{
NSLog(@"startPlayingMovie");
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:@"Start_video" ofType:@"mov"]];
moviePlayer = [[MPMoviePlayerViewController alloc]
initWithContentURL:url];
moviePlayer.view.frame = CGRectMake(0, 0, self.view.bounds.size.height, self.view.bounds.size.width);
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:moviePlayer.moviePlayer];
moviePlayer.moviePlayer.controlStyle = MPMovieControlStyleNone;
moviePlayer.moviePlayer.shouldAutoplay = YES;
[self presentMoviePlayerViewControllerAnimated:moviePlayer];
[moviePlayer.moviePlayer setFullscreen:YES animated:NO];
NSLog(@"endPlayingMovie");
}
То же самое случилось со мной. Оказывается, я пытался воспроизвести фильм, пока UIImagePicker
еще не был уволен.
В моем UIImagePickerDelegate
мне пришлось сначала отпустить всплывающее окно UIImagePicker
, а затем открыть ViewController
управление MPMediaPlayerController
:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)infoDict
{
//the first thing to do: dismiss the media picker
if ([ipPop isPopoverVisible])
{
[ipPop dismissPopoverAnimated:ANIMATION_SETTING];
}
myMediaPlayerViewController * playerVC = [[myMediaPlayerViewController alloc] initWithMediaDict:infoDict];
[self.navigationController pushViewController:playerVC animated:ANIMATION_SETTING];
}
У меня была такая же проблема, и это сошло с ума. Он будет работать на одном контроллере представления отлично (аудио и видео), но не работает на другом (черный экран с просто аудио). В конце концов, все, что я сделал, это ИЗМЕНЕНИЕ ЗАКАЗА вызовов: я просто ждал, пока не закончил настройку проигрывателя, прежде чем добавлять его в представление. Другими словами, я вызывал "addSubview" на линии перед вызовом "играть".
Это код, который я использую для воспроизведения файла по URL-адресу:
MPMoviePlayerViewController *movieViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:contentUrl]];
movieViewController.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
[self presentMoviePlayerViewControllerAnimated:movieViewController];
[movieViewController release];
Кажется, все отлично работает для меня. Две заметки:
movieSourceType
, черный экран отображается примерно за секунду до начала фильма.У меня была такая же проблема, она решила изменить расширение файла, который воспроизводится с .mpg на .mp4. очевидно, MPMoviePlayerController ожидает правильного расширения, хотя из документации мне не ясно, что это требование:
Поддерживаемые форматы Этот класс поддерживает любой фильм или аудиофайл в iOS. Это включает как потоковое содержимое, так и файлы фиксированной длины. Для файлов фильмов это обычно означает файлы с расширениями .mov,.mp4,.mpv и .3gp и используя одно из следующих сжатий Стандарты:
вы должны сделать это с помощью CGRectMake (0, 0, 0, 0) в готовом обратном вызове!
-(void)playMovieAtURL:(NSURL*)theURL
{
MPMoviePlayerController* theMovie=[[MPMoviePlayerController alloc] initWithContentURL:theURL];
theMovie.scalingMode=MPMovieScalingModeAspectFill;
theMovie.view.frame = CGRectMake(2, 246, 317, 70);
[self.view addSubview:theMovie.view];
// Register for the playback finished notification.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(myMovieFinishedCallback:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:theMovie];
// Movie playback is asynchronous, so this method returns immediately.
[theMovie play];
}
// When the movie is done,release the controller.
-(void)myMovieFinishedCallback:(NSNotification*)aNotification
{
MPMoviePlayerController* theMovie=[aNotification object];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:theMovie];
theMovie.view.frame = CGRectMake(0, 0, 0, 0);
// Release the movie instance created in playMovieAtURL
[theMovie release];
}
У меня была аналогичная проблема. После воспроизведения появляется пустой экран, который не позволяет мне снова воспроизводить видео. Хорошо, вот моя работа. Эта кнопка воспроизведения не исчезает.
[self.movieController stop];
[self.movieController prepareToPlay];
[self.movieController pause];
Кроме того, если вы используете URL-адреса http, убедитесь, что вы отключили приложение Transport Security в своих проектах *. plist. Это также вызовет черный экран.
Добавьте следующий код:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
Здесь:
[INSERT CODE ABOVE HERE]
</dict>
</plist>
----- BOTTOM OF PLIST FILE