【发布时间】:2011-08-22 15:31:20
【问题描述】:
我正在使用的应用程序需要以 60 毫秒的间隔播放声音“敲击”(每分钟敲击 1000 次)。当我超过大约 120 毫秒的间隔(每分钟 500 次敲击)时,声音变得非常不稳定,并且似乎相互叠加。
我使用的声音字节长 10 毫秒,我有一个以 20 毫秒间隔运行的线程计时器。我正在使用 AVAudioPlayer 播放声音,并尝试过 wav、caf 和 m4a 格式。我已经使用 NSLog 输出进行了测试,以查看 AVAudioPlayer 何时被触发,以及计时器循环何时轮询......并且所有时间似乎都足够准确。
我在 viewDidLoad() 方法中添加了音频会话处理,如下所示:
[[AVAudioSession sharedInstance]
setCategory: AVAudioSessionCategoryPlayback
error: &setCategoryError];
这是我在自己的线程中运行的计时器循环:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Give the sound thread high priority to keep the timing steady.
[NSThread setThreadPriority:1.0];
while (running) { // loop until stopped.
[self performSelectorOnMainThread:@selector(playOutput) withObject:nil waitUntilDone:NO];
// An autorelease pool to prevent the build-up of temporary objects.
NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
NSDate *curtainTime = [[NSDate alloc] initWithTimeIntervalSinceNow:sleepValue];
NSDate *currentTime = [[NSDate alloc] init];
// Wake up periodically to see if we've been cancelled.
while (running && ([currentTime compare:curtainTime] == NSOrderedAscending)) {
[NSThread sleepForTimeInterval:0.015];
[currentTime release];
currentTime = [[NSDate alloc] init];
}
[curtainTime release];
[currentTime release];
[loopPool drain];
}
[pool drain];
这是我初始化我的 AVAudioPlayer 的方式:
NSString *beatOne = @"3h";
NSString *beatOneSoundFile = [[NSBundle mainBundle]
pathForResource:beatOne ofType:@"caf"];
NSURL *beatOneURL = [[NSURL alloc] initFileURLWithPath:beatOneSoundFile];
beatPlayerOne = [[AVAudioPlayer alloc]initWithContentsOfURL:beatOneURL error:nil];
beatPlayerOne.delegate = self;
beatPlayerOne.currentTime = 0;
[beatPlayerOne prepareToPlay];
[beatOneURL release];
这里是播放音频播放器的地方:
[beatPlayerOne pause];
beatPlayerOne.currentTime = 0;
[beatPlayerOne play];
提前感谢您的帮助...
【问题讨论】:
-
也许您可以考虑播放包含十个点击的音频文件?
-
最终,点击之间的间隔将是可调的。它需要能够处理每分钟最多 1000 次点击(如果可能的话,更高),但最终,您会遇到等待时间太接近最小可识别时间量(即毫秒)的“量子”问题。
标签: iphone objective-c xcode avaudioplayer nsthread