首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AVAudioEngine中不能播放AVAudioFile

在AVAudioEngine中不能播放AVAudioFile
EN

Stack Overflow用户
提问于 2016-07-13 00:15:41
回答 0查看 1.2K关注 0票数 4

我正在尝试使用AVAudioEngine播放AVAudioFile。代码主要取自Apple Developer的在线视频,但没有回放功能。我花了一些时间浏览论坛,但似乎没有任何线索。

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

代码语言:javascript
复制
- (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。

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38334152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档