Отбрасывание звука MPMoviePlayer при тестировании приложения на устройстве - PullRequest
0 голосов
/ 09 января 2011

Я создаю приложение, содержащее канал XML со ссылкой на фильм, который я хотел бы воспроизводить всякий раз, когда пользователь нажимает на изображение.

Для этой цели я использую MPMoviePlayerViewController.Тестирование приложения на симуляторе дало мне ожидаемые результаты, однако, когда я тестирую приложение на iPhone, проигрыватель играет правильно, но без звука.

Я смотрел в Интернете, гдеВ нескольких статьях говорилось, что производительность приложения сильно отличается от производительности, которую дает симулятор.Поэтому я провел тест «утечки» с помощью инструментов, который сказал мне, что всякий раз, когда я начинаю воспроизводить фильм, некоторые байты теряются или пропускаются.Может ли это быть как-то связано с внезапным падением звука?Если так, то как бы я решил это?

Это мой первый опыт тестирования приложений на iPhone, поэтому я был шокирован, увидев, как плохо работает приложение.Вот код для части фильма.

#pragma mark Video Controls
-(void)playVideo:(id)sender{
    moviePlaying=TRUE;
    MPMoviePlayerViewController *playerViewController;
    playerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:[data objectForKey:@"[att]url"]]];


    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:[playerViewController moviePlayer]];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidExitFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:[playerViewController moviePlayer]];
    MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] init] autorelease];
    player = [playerViewController moviePlayer];

    [self.view addSubview:playerViewController.view];
    player.controlStyle = MPMovieControlStyleDefault;
    player.shouldAutoplay = YES;
    [player setFullscreen:YES animated:YES];
} 

- (void)moviePlayBackDidExitFullscreen:(NSNotification*)notification{
    MPMoviePlayerViewController *moviePlayer = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:moviePlayer];

    [moviePlayer.view removeFromSuperview];
    [moviePlayer release];
}
- (void)moviePlayBackDidFinish:(NSNotification*)notification {
    MPMoviePlayerViewController *moviePlayer = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:moviePlayer];

    moviePlaying=FALSE;
    [moviePlayer.view removeFromSuperview];
    [moviePlayer release];
}
#pragma mark VideoControls End

Я надеюсь, что вы можете осветить проблему.

Заранее спасибо,

/ Brinck10

1 Ответ

1 голос
/ 11 января 2011

У вас здесь очень серьезное замешательство. Вы не должны создавать и MPMoviePlayerViewController, и MPMoviePlayerController. Используйте один или другой. И эти строки не имеют смысла:

MPMoviePlayerController *player = 
    [[[MPMoviePlayerController alloc] init] autorelease];
player = [playerViewController moviePlayer];

Вы создаете MPMoviePlayerController и назначаете его игроку, но затем выбрасываете его, заменяя его существующим MPMoviePlayerViewController's moviePlayer.

Давайте отступим на десять ярдов и пунт. Самый простой способ воспроизведения фильма / потокового звука / чего угодно - использовать MPMoviePlayerViewController. Это контроллер представления, поэтому просто поместите его туда, где вы будете использовать UIViewController. Проще всего показать это модально:

NSURL* m = // whatever;
MPMoviePlayerViewController* mpvc = 
    [[MPMoviePlayerViewController alloc] initWithContentURL: m];
[self presentModalViewController:mpvc animated:YES];
[mpvc release];

Это создает MPMoviePlayerController и его вид и представляет весь шебанг для вас только в полноэкранном режиме. Просто и легко. Модальное представление даже закрывается, когда пользователь нажимает «Готово».

Использование MPMoviePlayerController более сложное. Это НЕ UIViewController. Но это имеет вид. Ваша задача, если вы хотите, чтобы пользователь что-то видел, состоит в том, чтобы захватить это представление, дать ему рамку и вставить его в ваш интерфейс:

NSURL* m = // whatever;
MPMoviePlayerController* mp = 
    [[MPMoviePlayerController alloc] initWithContentURL:m];
self.mpc = mp; // property with retain policy
[mp release];
self.mpc.view.frame = CGRectMake(10, 10, 300, 230);
[self.view addSubview:self.mpc.view];

Это делает просмотр фильма частью вашего интерфейса. Если фильм является настоящим фильмом, он оставляет пользователю право переключаться в полноэкранный режим или нет. Если фильм - просто звук, у пользователя нет способа сделать это; есть только кнопка остановки / перехода и ползунок.

В любом случае где-то в истории есть MPMoviePlayerController, так что вы можете зарегистрироваться для его уведомлений, указать, чтобы он проигрывал / останавливал и т. Д. Но не путайте и не смешивайте два подхода. Это, вероятно, причина всех ваших проблем здесь.

...