使用音频工具箱播放 .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的主要内容,如果未能解决你的问题,请参考以下文章

小工具批量将mp3音频格式转换为wav格式

Android使用AudioTrack播放WAV音频文件

AVAudioPlayer 无法播放使用 ExtAudioFileWriteAsync 编写的音频 (.wav) 文件

多浏览器播放wav格式的音频文件

如何在 Windows 上使用 gstreamer 播放 .wav 音频文件?

用 Qt 的 QAudioOutput 类播放 WAV 音频文件(使用了libsndfile外部库)