3

我正在尝试使用 AVAudioPlayer 实例播放 6 个单独的 .mp3 声音文件。声音在同一时间播放,但它们似乎不同步或以略微不同的速度播放。有谁知道为什么会这样?

这是我初始化声音的方法:

 NSURL *musicurl = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource: @"SoundLoop" ofType: @"mp3"]];
music = [[AVAudioPlayer alloc] initWithContentsOfURL: musicurl error: nil];
[musicurl release];
music.numberOfLoops = -1; // Loop indefinately
music.currentTime = 0; // start at beginning
music.volume = 1.0;
music.meteringEnabled = YES;

这是我的 AudioSession 代码:

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
audioSession.delegate = self;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];     
[[AVAudioSession sharedInstance] setPreferredHardwareSampleRate:44100 error:nil];
[[AVAudioSession sharedInstance] setPreferredIOBufferDuration:30 error:nil];

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
Float32 hardvol = 1.0;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
AudioSessionSetProperty(kAudioSessionProperty_CurrentHardwareOutputVolume, sizeof(hardvol), &hardvol);
UInt32 doSetProperty = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
[[AVAudioSession sharedInstance] setActive:YES error: nil]; 

它可能与声音的比特率有关吗?或者我正在使用.mp3?

谢谢。

4

2 回答 2

5

我通过使用 AVAudioPlayer 类的 playAtTime: 方法找到了解决此问题的方法:

   NSTimeInterval shortStartDelay = 0.5;            // seconds
    NSTimeInterval now = player.deviceCurrentTime;

    [player playAtTime:now + shortStartDelay];  //these players are instances of AVAudioPlayer
    [player2 playAtTime:now + shortStartDelay];
    [player3 playAtTime:now + shortStartDelay];

使用这将允许所有声音异步和同步播放。

于 2011-06-12T07:57:15.817 回答
1

您应该查看多媒体编程指南。“使用音频”部分有大量有用的信息。 http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/MultimediaPG/Introduction/Introduction.html

这听起来与您的问题有关:

使用硬件辅助解码时,设备一次只能播放一种受支持格式的单个实例。例如,如果您使用硬件编解码器播放立体声 MP3 声音,则第二个同时播放的 MP3 声音将使用软件解码。同样,您不能同时使用硬件播放 AAC 和 ALAC 声音。如果 iPod 应用程序正在后台播放 AAC 或 MP3 声音,则它已声明了硬件编解码器;然后,您的应用程序会使用软件解码播放 AAC、ALAC 和 MP3 音频。

要以最佳性能播放多种声音,或在 iPod 在后台播放时高效播放声音,请使用线性 PCM(未压缩)或 IMA4(压缩)音频。

这里还有一点声称你正在做的事情应该是可能的,但苹果似乎在警告“处理器效率最高的多重播放”系列。我认为,如果处理器紧张,这将导致无法及时完美地保持一切。

从 iOS 3.0 开始,几乎所有支持的音频格式都可以同时播放——即所有可以使用软件解码播放的音频格式,如表 1-1 中所述。对于处理器效率最高的多重播放,请使用线性 PCM(未压缩)或 IMA4(压缩)音频。

在调试方面,您应该从两个音频声音开始,看看是否有问题。然后一直到 6 并找出问题开始发生的明显点。我还会找到(或制作)一些 Apple 推荐的格式(PCM 或 IMA4)的音轨,并对它们进行相同的测试。做这两件事应该可以帮助您缩小实际问题的范围。

于 2011-06-06T17:13:07.627 回答