AVAssetWriterInput可以通过Core Audio实现实时音频吗?

时间:2012-02-15 20:05:00

标签: ios avfoundation core-audio avcapturesession avassetwriter

我希望AVFoundation能够做一些似乎应该可行的事情,但我无法在任何地方找到任何支持或示例。

我需要从前置摄像头获取视频,并将其与来自Core Audio的音频结合起来。

我的代码工作解决了从摄像头抓取视频并将其与麦克风的音频相结合的常见情况,并且效果很好。这主要是根据RosyWriter Apple示例代码改编的。

但是我找不到任何方法来使用来自Core Audio的音频直播流,从中创建一个AVAssetWriterInput,并将其作为输入添加到我的AVCaptureSession。我发现与设置AVCaptureInput和AVAssetWriterInput有关的所有资源都围绕着使用设备初始化它们并实时从设备中获取媒体 - 但我不是试图从设备获取音频。

有没有办法创建AVCaptureInput,告诉它期望某种ASBD格式的数据,然后从我的Core Audio回调中给它那些数据?我不想将数据写入磁盘然后从磁盘读取 - 我怀疑这将非常慢。似乎应该有一个解决方案,但我找不到一个。

我只想说我的代码可以使用我用来包含音频的AudioBufferList对象创建CMSampleBuffers。我已经检查了CMSampleBuffers,它们似乎包含有效的数据帧,但当我将数据发送回修改后的RosyWriterViewProcessor“writeSampleBuffer:ofType:”时,它似乎写得正确(我没有错误)但是当我打开它时视频文件完成后我只看到视频而没有听到任何音频。

有没有人知道如何完成我想要做的事情?

这是我一直在使用的标准ASBD:

AudioStreamBasicDescription audioDescription;
memset(&audioDescription, 0, sizeof(audioDescription));
audioDescription.mFormatID          = kAudioFormatLinearPCM;
audioDescription.mFormatFlags       = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked | kAudioFormatFlagsNativeEndian;
audioDescription.mChannelsPerFrame  = 2;
audioDescription.mBytesPerPacket    = sizeof(SInt16)*audioDescription.mChannelsPerFrame;
audioDescription.mFramesPerPacket   = 1;
audioDescription.mBytesPerFrame     = sizeof(SInt16)*audioDescription.mChannelsPerFrame;
audioDescription.mBitsPerChannel    = 8 * sizeof(SInt16);
audioDescription.mSampleRate        = 44100.0;

除了解决方案,我有单独的视频和音频文件,我认为我可以使用AVComposition拼凑在一起,但我宁愿不去那条路,因为我的视频和音频文件经常有不同的长度,我不想为了使它们适合在一起而伸出一条或另一条轨道的战斗 - 它甚至可能不会被同步!我宁愿在AVCaptureSession中设置所有内容,并让AVFoundation为我交换所有内容。

1 个答案:

答案 0 :(得分:0)

尝试使用原始PCM格式创建有效的资产编写器输入,但在回调中,丢弃该输入中的数据并用从音频单元创建的输出中保存的缓冲区中替换相等长度的数据。