混合时AVAudioPlayer声音文件播放不同步 - iPhone

时间:2011-06-06 14:55:58

标签: iphone audio avaudioplayer mixing

我正在尝试使用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?

感谢。

2 个答案:

答案 0 :(得分: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];

使用此功能可以让所有声音异步并同步播放。

答案 1 :(得分: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)的某些音轨,并对它们进行相同的测试。做这两件事应该可以帮助你缩小实际问题的范围。