#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, и они приняли это за ошибку.