使用音频工具箱播放 .wav
Posted
技术标签:
【中文标题】使用音频工具箱播放 .wav【英文标题】:Play a .wav with Audio Toolbox 【发布时间】:2013-01-07 17:39:46 【问题描述】:我正在尝试 文件。到目前为止我有这个: 但是我的文件不会播放。 If 条件被正确触发,但它不播放。 如果文件不存在,它将打印错误消息。有什么线索吗?
-(void) playSound : (NSString *) fName : (NSString *) ext
SystemSoundID audioEffect;
NSString *path = [[NSBundle mainBundle] pathForResource : fName ofType :ext];
if ([[NSFileManager defaultManager] fileExistsAtPath : path])
NSURL *pathURL = [NSURL fileURLWithPath : path];
AudioservicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &audioEffect);
AudioServicesPlaySystemSound(audioEffect);
else
NSLog(@"error, file not found: %@", path);
AudioServicesDisposeSystemSoundID(audioEffect);;
【问题讨论】:
AudioServicesCreateSystemSoundID
返回的OSStatus
的值是多少?您使用的 WAV 文件的出处是什么?你确定它包含 LPCM 或其他兼容格式的样本吗?如果在方法结束时不释放声音 ID 会怎样?
@warrenm 我删除了那行,它起作用了,谢谢。但是ARC会自动处理内存吗?
【参考方案1】:
您不能在告诉它播放后立即处理声音 ID,因为这会导致播放停止。这就是为什么你一开始没有听到它的原因。
您应该做的是在负责创建它的任何对象(例如,视图控制器)的属性中保存对 ID 的引用。你可以在你的接口声明中这样声明它:
@property(nonatomic, assign) SystemSoundID audioEffect;
...然后像这样分配给它:
AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &_audioEffect);
这不仅可以让你在以后知道你已经完成它的时候正确处理它(例如在viewDidUnload
),而且还可以防止你必须从磁盘中读取文件您想播放它的时间,因为每个 ID 可以无限次播放。
最后一个提示:您可以直接请求捆绑资源的 URL,而不是请求字符串然后将其转换为 URL。
NSURL *audioURL = [[NSBundle mainBundle] URLForResource:fName withExtension:ext];
if([[NSFileManager defaultManager] fileExistsAtPath:[audioURL path]])
// ...
【讨论】:
【参考方案2】:我从 Warrenm 的评论中发现了这一点。我不得不删除最后一行,因为它在设置播放后的几毫秒内杀死了声音,因此听不到。
-(void) playSound : (NSString *) fName : (NSString *) ext
SystemSoundID audioEffect;
NSString *path = [[NSBundle mainBundle] pathForResource : fName ofType :ext];
if ([[NSFileManager defaultManager] fileExistsAtPath : path])
NSURL *pathURL = [NSURL fileURLWithPath : path];
AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &audioEffect);
AudioServicesPlaySystemSound(audioEffect);
else
NSLog(@"error, file not found: %@", path);
【讨论】:
以上是关于使用音频工具箱播放 .wav的主要内容,如果未能解决你的问题,请参考以下文章
AVAudioPlayer 无法播放使用 ExtAudioFileWriteAsync 编写的音频 (.wav) 文件