繁体   English   中英

AVAssetWriterInput可以通过Core Audio进行实时音频播放吗?

[英]AVAssetWriterInput possible for live audio through Core Audio?

我正在寻求使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进行艰苦的工作来为我添加所有内容。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM