【问题标题】:Play a .wav with Audio Toolbox使用音频工具箱播放 .wav
【发布时间】:2013-01-07 17:39:46
【问题描述】:

我正在尝试使用音频工具箱播放 .wav 文件。到目前为止我有这个: 但是我的文件不会播放。 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会自动处理内存吗?

标签: iphone objective-c ios audio audiotoolbox


【解决方案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);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2011-04-30
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多