对苹果官方speakhere的使用体会

本文介绍了将苹果speakhere demo应用于音频项目时遇到的问题,包括C++与Objective-C混编的配置调整,以及音频格式(PCM、LPCM、ADPCM)的理解。解决方法包括将C++部分隔离为静态库,并通过设置Audio Queue Server的缓冲区时长来获取特定长度的PCM数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做音频项目,通过筛选,选择了audio queue server的方式来实现。我选择了苹果的speakhere作为测试demo。

首先一个感触demo是c++编写的。整合到xcode项目中,需要修改几个工程配置项 C++Language Dialect 要选 Compiler Default 选项。如果要整合到Xcode项目上,配置项Compile Sources As  要选择 Object-c++。这个大家都是是c++和object-c的混编。然而我的项目郁闷的是有c语言,object-c和新加入的C++。三种语言在一个工程中,我怎么编译都错误。最后我选择了把c++模块独立成一个静态库。世界就安静了。(C,obj-c,c++三语言真的不能再同一个项目中,有知道的告诉我一声。先谢了)。

第二个问题:音频格式问题。一般都使用PCM格式。但是网上一搜就是PCM,LPCM,ADPCM格式。刚开始被这个三格式弄糊涂了,其实PCM(脉冲编码调制)是原始未压缩的音频数据,LPCM(线性编码调制)是经过处理的音频数据,它是未压缩的,比较起pcm就是数据更多些,adpcm就是经过压缩的数据了。

第三个问题:根据协议要求需要产生数据长度为320的PCM格式的数据。参考speakHere例子,得到了数据,但是长度一般是8000.这么把8000的数据变成320。可郁闷我一段时间。现在想想很简单。

#define   HZ     8000.0F

#define   bitChannel   16

#define kBufferDurationSeconds  0.020   (这个很重要,官方是0.5,就永远是8000,只有设置了0.02就是你想要的320长度了。同理640就是0.04)

void AQRecorder::SetupAudioFormat(UInt32 inFormatID){

   memset(&mRecordFormat,0, sizeof(mRecordFormat));

    mRecordFormat.mFormatID =kAudioFormatLinearPCM;

    mRecordFormat.mSampleRate =HZ

    mRecordFormat.mFormatFlags =kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;

    mRecordFormat.mBitsPerChannel =bitChannel;

    mRecordFormat.mFramesPerPacket  = mRecordFormat.mChannelsPerFrame =1;

    mRecordFormat.mBytesPerFrame = (mRecordFormat.mBitsPerChannel/8) * mRecordFormat.mChannelsPerFrame;

    mRecordFormat.mBytesPerPacketmRecordFormat.mBytesPerFrame ;

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值