AVAudioPlayer 失真

Posted

技术标签:

【中文标题】AVAudioPlayer 失真【英文标题】:AVAudioPlayer Distortion 【发布时间】:2014-08-27 12:36:05 【问题描述】:

我有一个 ios 应用程序,它使用 AVPlayer 播放一些视频。我还有一个 AVAudioPlayer 实例,用于在点击按钮时播放音效,例如开始播放和停止播放。这两者同时在“玩”。这工作正常,但声音效果似乎加倍(同时播放两次)或过于响亮。在我的耳朵里,它听起来像是在播放两次。我正在触发这样的音效:

- (void)playSFXForAction:(ActionSFX)action

    NSURL *sfx;
    switch (action) 
        case ActionSFXStartRecord:
            sfx = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"start-recording-fade" ofType:@"aiff"]];
            break;
        case ActionSFXStopRecord:
            sfx = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"stop-recording-fade" ofType:@"aiff"]];
            break;
        case ActionSFXPreview:
            sfx = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"buzz" ofType:@"aiff"]];
            break;
        default:
            break;
    
    NSError *error;
    self.sfxPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:sfx error:&error];
    [self.sfxPlayer play];

大约 80% 的时间会发生失真的播放。有时它会按预期播放声音效果。谢谢。

【问题讨论】:

【参考方案1】:

我认为你面临的可能有两个原因......

(1) 只是因为你想播放声音时一直在调用方法,而AVAudioPlayer一直在用方法分配。

您应该将 alloc 方法放在其他任何地方,然后播放或停止或准备播放函数使用。

所以,播放器只分配一次,但可以根据需要多次播放声音。

(2) 否则问题出在声音文件中。只需在 PC 中播放该文件并检查即可。

希望这会有所帮助。而不是在这里用更多的代码告诉这里。

【讨论】:

文件没问题。我还测试了运行正常的应用程序(不是我自己的)的文件。我还尝试过移动分配器并使用单个音频文件进行初始化以进行测试。仍然得到失真。 你没有得到我。我想说的是,如果您分配了 AVAudioPlayer,那么您必须在再次分配之前释放 AVAudioPlayer 并再次播放声音。如果声音和设备没有问题,那么应该只有一件事。它是 AVAudioPlayer 播放两次。所以,你听到的是两种声音而不是一种声音。所以,管理alloc和release,问题就会自动解决。 我明白了。我在 viewDidLoad 中分配一次并使用一个音频文件进行初始化。然后我在 AVAudioPlayer 的单个实例上调用 play - 该文件永远不会因我的测试而改变。我应该可以多次播放 AVAudioPlayer 而无需每次都释放。【参考方案2】:

我在代码的其他地方有一个不相关的保留周期。快速检查分析器显示有两个活生生的 VC 实例处理声音效果。固定保留周期后,失真(双重播放)就解决了。

【讨论】:

以上是关于AVAudioPlayer 失真的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序在 IPOD 中保持空闲超过 48 小时时,MPMoviePlayerController 和 AVAudioPlayer 的声音会失真

如何修复 iPhone 应用程序中的多个音频流造成失真?

如何将“AVAudioPlayer.Type”类型的值分配给“AVAudioPlayer?”

为啥 AVAudioPlayer 没有响应?

斯威夫特:非托管 AVAudioPlayer

声音 AVAudioPlayer 不工作