0

我希望调整 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 为我完成交错所有内容的艰苦工作。

4

1 回答 1

0

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

于 2012-02-15T22:22:33.420 回答