【发布时间】:2023-12-29 01:19:02
【问题描述】:
我希望调整 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 为我完成交错所有内容的艰苦工作。
【问题讨论】:
-
你有想过这个吗?
标签: ios avfoundation core-audio avcapturesession avassetwriter