我想知道是否有一种更优雅的方式来播放带有AVAudioPlayer Class的mp3文件,从t1到t2时间而不使用NSTimers?
答案 0 :(得分:1)
我测试了以下代码,它在t1和t2时间内完美运行。但是不要忘记在班上定义AVAudioEngine *engine
。
- (void) playAudioWithinT1: (float) t1 andT2:(float) t2{
//t1 and t2 are the seconds to play audio in between
NSError *error;
NSURL *urlForSoundFile;
float startingFrame;
float framesToPlay;
NSString *audioPath = [[NSBundle mainBundle] pathForResource:@"_preview" ofType:@"mp3"];
urlForSoundFile = [NSURL fileURLWithPath:audioPath];
engine = [[AVAudioEngine alloc] init];
AVAudioPlayerNode *player = [[AVAudioPlayerNode alloc] init];
[engine attachNode:player];
AVAudioFile *file = [[AVAudioFile alloc] initForReading:urlForSoundFile
error:&error];
startingFrame = (t1 * file.processingFormat.sampleRate);
framesToPlay = (t2 * file.processingFormat.sampleRate - startingFrame);
AVAudioMixerNode *mainMixer = [engine mainMixerNode];
[engine connect:player to:mainMixer format:file.processingFormat];
[player scheduleSegment:file startingFrame:startingFrame frameCount:framesToPlay atTime:nil completionHandler:nil];
[engine startAndReturnError:&error];
[player play];
}
答案 1 :(得分:0)
AVAudioPlayer 有一个方法playAtTime:
来处理 t1 ,但是没有简单的方法可以在特定时间停止播放(< EM> T2 )。
截至 iOS8 AVFoundation 有新的api,例如 AVAudioEngine 和 AVAudioPlayerNode 。您可能会发现实现 AVAudioPlayerNode 更适合您的要求,因为它有一个名为
的方法- scheduleSegment:startingFrame:frameCount:atTime:completionHandler:
用于播放音频文件的片段。