iPhone — После воспроизведения фильма воспроизведение звука идет плохо

#ios #cocoa-touch #audio #video #avaudioplayer

#iOS #cocoa-touch #Аудио #Видео #avaudioplayer

Вопрос:

В моем приложении при запуске я проигрываю вводное видео. Позже в приложении я воспроизводю некоторые аудиофайлы нажатием кнопок. Но звук воспроизводится плохо. Замечена проблема с его приглушением, а иногда и с низким уровнем звука и т.д.

Я обнаружил, что ошибка связана с воспроизведением видео. Когда я не проигрываю вступительное видео, звук воспроизводится хорошо. в противном случае это вызывает проблемы.

Я использую следующий код для настройки проигрывателя фильмов:

 -(void)setupMovie
{
    NSString* moviePath;
    if ([[UIDevice currentDevice] userInterfaceIdiom] ==  UIUserInterfaceIdiomPad)
    {
        moviePath = [[NSBundle mainBundle] pathForResource:@"ipad" ofType:@"3gp"];
    }
    else 
    {
        moviePath = [[NSBundle mainBundle] pathForResource:@"iphone" ofType:@"3gp"];    

    }

    NSURL* movieURL = [NSURL fileURLWithPath:moviePath];
    playerCtrl =  [[MPMoviePlayerController alloc] initWithContentURL:movieURL];

    if ([[UIDevice currentDevice] userInterfaceIdiom] ==  UIUserInterfaceIdiomPad)
    {
        playerCtrl.view.frame = CGRectMake(0, 0, 1024, 768);
    }
    else 
    {
        playerCtrl.view.frame = CGRectMake(0, 0, 480, 320);     
    }


    playerCtrl.scalingMode = MPMovieScalingModeFill;
    playerCtrl.controlStyle = MPMovieControlStyleNone;
    [playerCtrl prepareToPlay];

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(moviePlayerLoadStateChanged:) 
                                                 name:MPMoviePlayerLoadStateDidChangeNotification 
                                               object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(moviePlayBackDidFinish:) 
                                                 name:MPMoviePlayerPlaybackDidFinishNotification 
                                               object:nil];
}

- (void) moviePlayerLoadStateChanged:(NSNotification*)notification 
{
    if ([playerCtrl loadState] != MPMovieLoadStateUnknown)
    {
        [[NSNotificationCenter  defaultCenter] removeObserver:self 
                                                         name:MPMoviePlayerLoadStateDidChangeNotification 
                                                       object:nil];



        // Play the movie
        [self.view addSubview:playerCtrl.view];
        [playerCtrl play];

        [[NSNotificationCenter defaultCenter] postNotificationName:@"GSPLAYER_STARTED" object:nil];
    }
    else 
    {
        NSLog(@"Player received unknown error");
        [[NSNotificationCenter defaultCenter] postNotificationName:@"GSPLAYER_ERROR" object:nil];
    }
}
  

Когда фильм заканчивается, я загружаю следующий просмотр следующим образом:

 -(void)playerCompleted
{
    [pv.view removeFromSuperview];
    [pv release];
    pv = nil;
    [self.window addSubview:navigationController.view];
}
  

Следующий код предназначен для воспроизведения звука:

 -(void)playAudio:(NSString*)filename
{
    self.allowAnimation = NO;
    NSString* bundleName = [[NSBundle mainBundle] pathForResource:[filename lowercaseString] ofType:nil];

    //NSURL* url = [[NSURL alloc] initFileURLWithPath: bundleName];
    NSURL* url = [NSURL fileURLWithPath:bundleName];

    if (appSoundPlayer) {
        [appSoundPlayer release];
    }

    appSoundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error: nil];
    //[appSoundPlayer prepareToPlay];
    [appSoundPlayer setVolume: 1.0];
    [appSoundPlayer setDelegate: self];
    [appSoundPlayer play];  
}
  

Кто-нибудь сталкивался с подобными проблемами ранее? В чем может быть проблема и каким будет решение?

Комментарии:

1. Происходит ли это как на симуляторе, так и на устройстве? Если этого не происходит в симуляторе, я бы протестировал звук в наушниках на устройстве. У меня были странные проблемы с отменой фазы при воспроизведении стереофонических файлов, которые сведены до моно для одного динамика…

2. Я тестировал это только на устройстве, а не в симуляторе. Я использую очень хорошие головные телефоны и замечаю проблемы со звуком. Как вы решили проблему?

3. Хм, нет … проблема, о которой я говорю, не будет заметна в наушниках, только через динамик.

Ответ №1:

Вы пытались установить свойства аудиосессии..Просто установите Audiosession в режим воспроизведения перед воспроизведением звука..Я не пробовал этот код, но я думаю, что это проблема с сеансами..

 appSoundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error: nil];
//[appSoundPlayer prepareToPlay];
[appSoundPlayer setVolume: 1.0];
[appSoundPlayer setDelegate: self];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[appSoundPlayer play]
  

Комментарии:

1. Да, я тоже это пробовал. Тем не менее, это не сработало. Будут ли какие-либо проблемы с самой платформой для загрузки различных кодеков и т.д. Для видео и аудио?

Ответ №2:

Проблема связана с видеокодеком. Если мы используем формат 3GP без формата AAC, то возникает некоторая проблема с самой платформой Apple Framework. Я связался с Apple, и они приняли это за ошибку.