如何使用 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,例如 AVAudioEngineAVAudioPlayerNode。您可能会发现实现 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 中播放多个文件

如何使用 AVAudioPlayer 执行 .m4a 歌曲文件的流式传输?

如何确定与 AVAudioPlayer 关联的音频文件的长度

使用 AVAudioPlayer 从 URL 播放音频

在 OSX 上更改 AVAudioPlayer 的输出设备