如何使用 AVAudioPlayer 从时间 t1 到 t2 在 Xcode 中播放 mp3 文件
Posted
技术标签:
【中文标题】如何使用 AVAudioPlayer 从时间 t1 到 t2 在 Xcode 中播放 mp3 文件【英文标题】:How to play an mp3 file in Xcode from time t1 to t2 with AVAudioPlayer 【发布时间】:2015-11-29 23:02:46 【问题描述】:我想知道是否有更优雅的方式来播放带有 AVAudioPlayer 类的 mp3 文件,从 t1 到 t2 时间而不使用 NSTimers?
【问题讨论】:
【参考方案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];
【讨论】:
【参考方案2】:AVAudioPlayer 有一个方法 playAtTime:
处理 t1,但是没有简单的方法可以在特定时间停止播放(t2)。
iOS8 AVFoundation 有新的 api,例如 AVAudioEngine 和 AVAudioPlayerNode。您可能会发现实现 AVAudioPlayerNode 更适合您的要求,因为它有一个名为
的方法- scheduleSegment:startingFrame:frameCount:atTime:completionHandler:
用于播放一段音频文件。
【讨论】:
感谢您的建议。我将尝试 AVAudioEngine,因为我的应用的部署目标是 ios8。 不客气。在 ios8 之前,我会使用带有 AudioQueueServices api 的音频工具箱框架来处理这类事情,但是当引入 AVAudioEngine 时,我现在使用它。它基本上是一个 obj-c 包装器,用于 Core Audio 中一些较低级别的 C api,例如 AudioUnits。以上是关于如何使用 AVAudioPlayer 从时间 t1 到 t2 在 Xcode 中播放 mp3 文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 AVAudioPlayer 将 URL 从 tableview 控制器传递到视图控制器
如何使用 AVAudioPlayer 执行 .m4a 歌曲文件的流式传输?