AVAudioFile 不能在 AVAudioEngine 中播放

Posted

技术标签:

【中文标题】AVAudioFile 不能在 AVAudioEngine 中播放【英文标题】:AVAudioFile doesn't play in AVAudioEngine 【发布时间】:2016-07-12 16:15:41 【问题描述】:

我正在尝试使用 AVAudioEngine 播放 AVAudioFile。代码大部分取自 Apple Developer 的在线视频并改编,但没有播放。花了一些时间浏览论坛,但似乎没有任何亮点。

我有两种方法。第一个调用标准打开文件对话框,打开音频文件,分配一个 AVAudioBuffer 对象(我稍后会用到)并用音频数据填充它。第二个设置 AVAudioEngine 和 AVAudioPlayerNode 对象,将所有内容连接起来并播放文件。下面列出了这两种方法。

- (IBAction)getSoundFileAudioData:(id)sender 


    NSOpenPanel* openPanel = [NSOpenPanel openPanel];

    openPanel.title = @"Choose a .caf file";
    openPanel.showsResizeIndicator = YES;
    openPanel.showsHiddenFiles = NO;
    openPanel.canChooseDirectories = NO;
    openPanel.canCreateDirectories = YES;
    openPanel.allowsMultipleSelection = NO;
    openPanel.allowedFileTypes = @[@"caf"];

    [openPanel beginWithCompletionHandler:^(NSInteger result)
       if (result == NSFileHandlingPanelOKButton) 
        NSURL*  theAudioFileURL = [[openPanel URLs] objectAtIndex:0];

        // Open  the document.

        theAudioFile = [[AVAudioFile alloc] initForReading:theAudioFileURL error:nil];

        AVAudioFormat *format = theAudioFile.processingFormat;
        AVAudioFrameCount capacity = (AVAudioFrameCount)theAudioFile.length;

        theAudioBuffer = [[AVAudioPCMBuffer alloc] 
             initWithPCMFormat:format frameCapacity:capacity];
        NSError *error;
        if (![theAudioFile readIntoBuffer:theAudioBuffer error:&error])  

            NSLog(@"problem filling buffer");

        
        else
            playOrigSoundFileButton.enabled = true;            

    

];





- (IBAction)playSoundFileAudioData:(id)sender 



    AVAudioEngine *engine = [[AVAudioEngine alloc] init]; // set up the audio engine

    AVAudioPlayerNode *player = [[AVAudioPlayerNode alloc] init]; // set up a player node

    [engine attachNode:player]; // attach player node to engine

    AVAudioMixerNode *mixer = [engine mainMixerNode];
    [engine connect:player to:mixer format:theAudioFile.processingFormat]; // connect player node to mixer
    [engine connect:player to:mixer format:[mixer outputFormatForBus:0]]; // connect player node to mixer

    NSError *error;

    if (![engine startAndReturnError:&error]) 
        NSLog(@"Problem starting engine ");
    
    else 

        [player scheduleFile:theAudioFile atTime: nil completionHandler:nil];
        [player play];
    


我检查了函数正在执行,音频引擎正在运行并且音频文件已被读取。我也尝试过使用不同的音频文件格式,包括单声道和立体声。有什么想法吗?

我正在运行 Xcode 7.3.1。

【问题讨论】:

刚刚注意到我在 playSoundFileAudioData 方法中留下了多余的一行(以 'engine connect: ' 开头的两行之一。但是,删除其中任何一个都不能解决问题。 【参考方案1】:

将您的 AVAudioPlayerNode *player 声明为全局

参考此链接Can't play file from documents in AVAudioPlayer

【讨论】:

很高兴知道。接受答案会很好 对不起,拉胡尔。由于某种原因,我的 iPad 上没有显示复选框。完成 没有在 swift 4 中播放。

以上是关于AVAudioFile 不能在 AVAudioEngine 中播放的主要内容,如果未能解决你的问题,请参考以下文章

将 AVAudioPCMBuffer 写入压缩的 AVAudioFile

从 AVAudioNodeTap 向 AVAudioFile 写入缓冲区(从 AVAudioEngine 保存录音)

AVAudioFile 写入不起作用 Swift iOS 14

如何在 CloudKit 中存储和检索音频文件?

AVAudioEngine 播放多声道音频

使用 Swift for MacOS 播放音频文件