同时播放两个 AVPlayer 音频文件时出现音频故障
Posted
技术标签:
【中文标题】同时播放两个 AVPlayer 音频文件时出现音频故障【英文标题】:Audio glitch when playing two AVPlayer audio files simultaneously 【发布时间】:2012-06-25 05:18:59 【问题描述】:我有一个 ios 应用程序,它使用一个 AVPlayer 播放背景音轨,并使用第二个 AVPlayer 播放其他声音片段。 (声音片段是从 Internet 流式传输的,因此需要 AVPlayer。)问题是,当第二个 AVPlayer 开始播放时,它会导致背景 AVPlayer 停止几分之一秒,类似于此评论中描述的内容:
Play multiple Audio Files with AVPlayer
我正在用这种方法准备音频片段:
- (void)prepareAudio:(NSURL *)assetURL
asset = [AVURLAsset URLAssetWithURL:assetURL options:nil];
playerItem = [AVPlayerItem playerItemWithAsset:asset];
[player replaceCurrentItemWithPlayerItem:playerItem];
[playerItem addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil];
[playerItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[player currentItem]];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemFailedToReachEnd:)
name:AVPlayerItemFailedToPlayToEndTimeNotification
object:[player currentItem]];
...然后当我想听到每个声音时调用[player play];
。
当我设置音频会话或 AVPlayer 的每个实例时,我需要做些什么,以便声音混合而不会出现故障?
【问题讨论】:
【参考方案1】:这可能是软件编码器启动的结果。当软件编码器尝试播放第二个声音剪辑时,您会看到内存中出现相当大的峰值。看看苹果文档部分“iOS硬件和软件音频编解码器” http://developer.apple.com/library/ios/#DOCUMENTATION/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html
“使用硬件辅助解码时,设备一次只能播放一种受支持格式的单个实例。”
另外...“要以最佳性能播放多种声音,或在 iPod 在后台播放时高效播放声音,请使用线性 PCM(未压缩)或 IMA4(压缩)音频。”
如果您无法选择可以提供的媒体编解码器,请查看 AudioUnit 框架以获得更无缝的混音。特别是http://developer.apple.com/library/ios/#samplecode/MixerHost/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010210的“音频混音器(MixerHost)”
【讨论】:
这不可能。我已经使用直接 PCM 未压缩文件进行了几次实验,但问题仍然存在。话虽如此,它似乎与正在应用的 AVMutableAudioMix 有关。每当它被应用时,就会发生泡泡。【参考方案2】:我终于弄清楚了问题所在。我正在编写一个应用程序,我正在使用 AVMutableAudioMixInputParameters 类调整音量,并且我试图通过在每个样本的基础上向上或向下移动音量来使用这个类来标准化音频。
虽然这种方法在只有几个音量渐变时有效,但似乎渐变的应用发生在缓冲音频的同一线程上,所以当我使用太多(>~1000)它们时,最终会出现这种情况占用了应该忙于缓冲音频的 CPU,然后您的音频中就会出现 g-g-g-glitch。
我的解决方案是重构我的音量标准化算法,以使用更少的音量斜坡来实现相同的目标。一旦我能够将每组音量斜坡/歌曲降低到大约 500 左右,我就不再遇到问题,并且音频故障消失了。
【讨论】:
你能帮帮我吗?我正在尝试同时播放多个声音,但是当我尝试播放不同的播放器时,第一个播放器停止了。 ***.com/questions/54345702 非常感谢以上是关于同时播放两个 AVPlayer 音频文件时出现音频故障的主要内容,如果未能解决你的问题,请参考以下文章