HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了iOS AudioUnit设置将麦克风输入保存到原始PCM文件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前正在开发iOS的VOIP项目.
我使用AudioUnits从麦克风获取数据并播放声音.
我的主要应用程序是用C#(Xamarin)编写的,它使用C库来加快音频和编解码器的处理速度.

为了测试输入/输出结果,我正在测试录音和放大器.在同一设备上播放
– 将麦克风音频数据存储在recordingCallBACk的缓冲区中
– 从playBACkCallBACk中的缓冲区播放数据

这按预期工作,语音质量很好.

我需要将传入的音频数据从麦克风保存到原始PCM文件中.

我已经这样做了,但结果文件只包含一些短的“嘟嘟”信号.

所以我的问题是:

我需要什么音频设置,我可以在生成的原始PCM文件中听到我的声音(真实的音频信号)而不是短的哔声?
有谁知道什么可能是错的或我必须做什么,我能够正确地重播生成的PCM文件

我目前的格式设置是(C#代码):

int framesPerPacket = 1;
int chAnnelsPerFrame = 1;
int bitsPerChAnnel = 16;
int bytesPerFrame = bitsPerChAnnel / 8 * chAnnelsPerFrame;
int bytesPerPacket = bytesPerFrame * framesPerPacket;
AudioStreamBasicDescription audioFormat = new AudioStreamBasicDescription ()
{
  SampleRate = 8000,Format = AudioFormatType.LinearPCM,FormatFlags = AudioFormatFlags.LinearPCMIsSignedInteger | AudioFormatFlags.LinearPCMIsPacked | AudioFormatFlags.LinearPCMIsAlignedHigh,BitsPerChAnnel = bitsPerChAnnel,ChAnnelsPerFrame = chAnnelsPerFrame,BytesPerFrame = bytesPerFrame,FramesPerPacket = framesPerPacket,BytesPerPacket = bytesPerPacket,Reserved = 0
};

额外的C#设置(这里没有错误检查):

AVAudioSession session = AVAudioSession.SharedInstance();
NSError error = null;
session.SetCategory(AVAudioSession.CategoryPlayAndRecord,out error);
session.SetPreferredioBufferDuration(Config.packetLength,out error);
session.SetPreferredSampleRate(Format.samplingRate,out error);
session.SetActive(true,out error);

我目前的录音回调简称(仅限PCM文件保存)(C代码):

OSStatus 
NotSoAmazingAudioENGIne::recordingCallBACk(void *inRefCon,AudioUnitRenderActionFlags *ioActionFlags,const Audiotimestamp *intimestamp,UInt32 inBusnumber,UInt32 innumberFrames,AudioBufferList *ioData) {
std::pair<BufferData*,int> bufferInfo = _sendBuffer.getNextEmptyBufferList();
AudioBufferList* bufferList = new AudioBufferList();
bufferList->mnumberBuffers = 1;
bufferList->mBuffers[0].mData = NULL;
OSStatus status = AudioUnitRender(_instance->_audioUnit,ioActionFlags,intimestamp,inBusnumber,innumberFrames,bufferList);
if(_instance->checkStatus(status))
{
    if(fout != NULL) //fout is a "FILE*"
    {
        fwrite(bufferList->mBuffers[0].mData,sizeof(short),bufferList->mBuffers[0].mDataByteSize/sizeof(short),fout);
    }
}
delete bufferList;
return noErr;

}

背景信息为什么我需要原始PCM文件

解决方法

我自己找到了解决方案: 我的PCM播放器需要44100赫兹立体声,但我的文件只有8000赫兹单声道,因此我保存的文件播放速度太快了10倍.

大佬总结

以上是大佬教程为你收集整理的iOS AudioUnit设置将麦克风输入保存到原始PCM文件全部内容,希望文章能够帮你解决iOS AudioUnit设置将麦克风输入保存到原始PCM文件所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。