首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将CMSampleBufferRef数据传递到音频输出插孔

将CMSampleBufferRef数据传递到音频输出插孔
EN

Stack Overflow用户
提问于 2013-03-20 02:22:09
回答 1查看 1.2K关注 0票数 13

我正在开发一个应用程序,我需要通过音频采集通过输出音频插孔,同时记录和保存视频。

我已经研究了苹果的aurio touch示例代码,并实现了音频直通。

我还通过AVCaptureSession实现了视频录制。以上两种功能都是单独完成的,效果很好。

但是当我合并功能时,由于AVCapturesession的音频会话,音频传递无法正常工作。

我还尝试传递从AVCaptureSession委托方法中获得的音频数据。下面是我的代码:

代码语言:javascript
运行
复制
OSStatus err = noErr;


AudioBufferList audioBufferList;
CMBlockBufferRef blockBuffer;
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer);
CMItemCount numberOfFrames = CMSampleBufferGetNumSamples(sampleBuffer); // corresponds to the number of CoreAudio audio frames

currentSampleTime += (double)numberOfFrames;

AudioTimeStamp timeStamp;
memset(&timeStamp, 0, sizeof(AudioTimeStamp));
timeStamp.mSampleTime = currentSampleTime;
timeStamp.mFlags |= kAudioTimeStampSampleTimeValid;

AudioUnitRenderActionFlags flags = 0;
aurioTouchAppDelegate *THIS = (aurioTouchAppDelegate *)[[UIApplication sharedApplication]delegate];
 err = AudioUnitRender(self.rioUnit, &flags, &timeStamp, 1, numberOfFrames, &audioBufferList);

if (err) { printf("PerformThru: error %d\n", (int)err); }

但它给出了错误。请尽快告知我们还可以做些什么。我查阅了这么多文档和代码,但没有找到任何解决方案。请帮帮我..

EN

Stack Overflow用户

发布于 2014-01-15 06:56:17

下面是一些更好的错误处理代码。它返回什么错误?您可以通过在文档中搜索错误描述来查找它。

代码语言:javascript
运行
复制
static void CheckError (OSStatus error, const char *operation) {
    if (error == noErr) return;

    char str[20] = {};
    // see if it appears to be a 4 char code
    *(UInt32*)(str + 1) = CFSwapInt32HostToBig(error);
    if (isprint(str[1]) && isprint(str[2]) && isprint(str[3]) && isprint(str[4])) {
        str[0] = str[5] = '\'';
        str[6] = '\0';
    } else {
        sprintf(str, "%d", (int)error);
    }

    fprintf(stderr, "Error: %s(%s)\n", operation, str);
    exit(1);
}

- (void)yourFunction
{
    AudioBufferList audioBufferList;
    CMBlockBufferRef blockBuffer;
    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer);
    CMItemCount numberOfFrames = CMSampleBufferGetNumSamples(sampleBuffer); // corresponds to the number of CoreAudio audio frames

    currentSampleTime += (double)numberOfFrames;

    AudioTimeStamp timeStamp;
    memset(&timeStamp, 0, sizeof(AudioTimeStamp));
    timeStamp.mSampleTime = currentSampleTime;
    timeStamp.mFlags |= kAudioTimeStampSampleTimeValid;

    AudioUnitRenderActionFlags flags = 0;
    aurioTouchAppDelegate *THIS = (aurioTouchAppDelegate *)[[UIApplication sharedApplication]delegate];
    CheckError(AudioUnitRender(self.rioUnit, &flags, &timeStamp, 1, numberOfFrames, &audioBufferList),
               "Error with AudioUnitRender");
}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15507479

复制
相关文章

相似问题

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