AVAudioPlayer不会在一个项目中播放具有所有正确参数的音频,但在另一个项目中可以正常工作

时间:2014-03-20 03:00:31

标签: ios objective-c avaudioplayer

我有一个巨大的Xcode项目,我一直致力于更新。安装iOS 7.1 SDK后,在此项目的AVAudioPlayer上播放音频不再有效。我创建了一个新的空白项目来测试完全相同的代码,并且它工作得很好。

我确定知道文件是在bundle资源下复制的,文件被添加到目标,URL是完美的,因为我能够从文件的NSURL获取NSData,并且匹配。 AVAudioPlayer是一个具有强属性和非原子属性的属性,但它不会在这个项目中播放。我还确保将AVAudioSession设置为播放模式。

我甚至创建了一些空白视图控制器类来测试项目中的AVAudioPlayer,它在任何一个中都不起作用,但在我制作的新的空白iOS项目中,声音很好。

在.h

NSURL *soundUrl;
@property (nonatomic, strong) AVAudioPlayer *soundPlayer;

在.m

@synthesize soundPlayer = _soundPlayer;

- (void)playSomeSound {
     NSError *audioError;
     soundUrl = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:soundFile ofType:@"m4a"]];
     _soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:&audioError];
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:NULL];
     _soundPlayer.delegate = self;
     [_soundPlayer play];
}

soundFile只是我试图播放的声音文件名称的一串。

我尝试在音频播放器的所有委托方法和音频播放器的初始化中记录错误。所有错误都返回(null)。

在iOS 7上,音频根本无法播放,在iOS 6.1上,初始化音频播放器会导致EXC_BAD_ACCESS代码2崩溃。

此外,CocosDenshion中的AVAudioPlayer似乎也有效。 (我的项目部分使用了cocos2d,但它不是游戏。)

另一个(可能很重要的)注意事项是我在我的项目中也使用了AVAudioRecorder。这完全没有任何问题,我确保在我不录制时将AVAudioSessionCategory切换到播放。

5 个答案:

答案 0 :(得分:0)

由于苹果在iOS 7中对AVAudioSession属性所做的更改。

根据Apple的文档:

  

音频类别已更改(例如AVAudioSessionCategoryPlayback   已更改为AVAudioSessionCategoryPlayAndRecord)。

所以将行[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:NULL];更改为 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:NULL];

答案 1 :(得分:0)

考虑到完全相同的代码在您的其他项目中起作用的事实,很难说出这个项目中的问题是什么。但我可以给你一些关于进一步调试它的建议:

  1. -playSomeSound中首先致电application:didFinishLaunchingWithOptions:。通过这种方式,您可以在调用它之前查看它是否因为您执行了其他操作而无法正常工作。
  2. 为您的项目添加另一个声音,并尝试播放该声音。也许问题仍然是原始声音。
  3. 还有几个问题:

    1. audioError在哪里宣布?
    2. [_soundPlayer play]的结果是什么(应该返回YES 成功)?

答案 2 :(得分:0)

尝试hava:

    [_soundPlayer prepareToPlay];
    [_soundPlayer play];

答案 3 :(得分:0)

谢谢大家,但不知何故,它最终成为某些框架之间的冲突。 Kamcord SDK for iOS中存在一个错误,但我正在与他们的开发团队联系,他们正在努力修复它。

答案 4 :(得分:0)

这个问题在最新的Kamcord SDK中仍然很明显,所以不是每个人都要遇到这个问题而不得不联系他们,这里修复AVAudioPlayer所需的代码/更改量最少,以及让Kamcord在其录音中也包含来自AVAudioPlayer的音频。


首先,将 OpenAL 添加到您的框架中。

AppDelegate.m

中导入OpenAL标头
#import <OpenAl/al.h>
#import <OpenAl/alc.h>

为OpenAL设备和上下文设置静态变量:

static ALCdevice *openALDevice;
static ALCcontext *openALContext;

创建两个功能开始停止 OpenAL

- (void)startOpenAL
{
    NSLog(@"OpenAL: Starting");

    openALDevice = alcOpenDevice(NULL);
    openALContext = alcCreateContext(openALDevice, NULL);
    alcMakeContextCurrent(openALContext);
}
- (void)stopOpenAL
{
    NSLog(@"OpenAL: Stopping");

    alcMakeContextCurrent(NULL);
    alcDestroyContext(openALContext);
    alcCloseDevice(openALDevice);
}

AppDelegate.m &#39; didFinishLaunchingWithOptions 中,启动OpenAL(我在初始化Kamcord之前这样做)

[self startOpenAL];

最后,在 applicationWillTerminate 中,调用stop OpenAL

[self stopOpenAL];

你已经完成了。 AVAudioPlayer现在应该重新开始工作,所有音频都由Kamcord正确记录。