IOS音频转换器 AudioConverterRef
2016-06-07 23:26
537 查看
1.创建
extern OSStatus AudioConverterNewSpecific( const AudioStreamBasicDescription * inSourceFormat, const AudioStreamBasicDescription * inDestinationFormat, UInt32 inNumberClassDescriptions, const AudioClassDescription * inClassDescriptions, AudioConverterRef __nullable * __nonnull outAudioConverter)
inSourceFormat 和 inDestinationFormat 是传入的源音频格式和目标音频格式
inNumberClassDescriptions 和 inClassDescriptions是传入的音频编码器描述类和它的个数
outAudioConverter是传出的AudioConverter引用
例子:AudioStreamBasicDescription inf = {0}; inf.mSampleRate = 44100; inf.mChannelsPerFrame = 1; //这里只能是1,否则报错 inf.mBitsPerChannel = 16; inf.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked; inf.mFormatID = kAudioFormatLinearPCM; inf.mFramesPerPacket = 1; inf.mBytesPerFrame = inf.mBitsPerChannel * inf.mChannelsPerFrame / 8; inf.mBytesPerPacket = inf.mFramesPerPacket*inf.mBytesPerFrame; AudioStreamBasicDescription outf = { 0 }; outf.mFormatID = kAudioFormatMPEG4AAC; outf.mFormatFlags = 0; outf.mFramesPerPacket = 1024; outf.mSampleRate = 44100; outf.mChannelsPerFrame = 2;
<pre name="code" class="html">const OSType subtype = kAudioFormatMPEG4AAC; // kAudioEncoderComponentType的时候使用目标类型 // kAudioDecoderComponentType的时候使用源类型
AudioClassDescription requestedCodecs[2] = { { kAudioEncoderComponentType, subtype, kAppleSoftwareAudioCodecManufacturer }, { kAudioEncoderComponentType, subtype, kAppleHardwareAudioCodecManufacturer } }; AudioConverterRef audioConverter; OSStatus result = AudioConverterNewSpecific(inputFormat, outputFormat,2, requestedCodecs, &audioConverter);
2.释放
extern OSStatus AudioConverterDispose( AudioConverterRef inAudioConverter)
inAudioConverter是AudioConverter的引用
例子:if(audioConverter != NULL){ <span style="white-space:pre"> </span>AudioConverterDispose(audioConverter); }
3.编码
extern OSStatus AudioConverterFillComplexBuffer( AudioConverterRef inAudioConverter, AudioConverterComplexInputDataProc inInputDataProc, void * __nullable inInputDataProcUserData, UInt32 * ioOutputDataPacketSize, AudioBufferList * outOutputData, AudioStreamPacketDescription * __nullable outPacketDescription)
inAudioConverter是传入的AudioConverter的引用
inInputDataProc是用户自己实现的获取编码数据的Callback函数(
inInputDataProcUserData是获取编码数据的Callback函数中使用的用户数据(一般传输编码session对象)
ioOutputDataPacketSize输出数据长度(通过获取AudioConverter的kAudioConverterPropertyMaximumOutputPacketSize属性获取或自定义足够的长度)
outOutputData输出数据
outPacketDescription输出数据描述
例子:static OSStatus FillAudioDataCallback(AudioConverterRef inAudioConverter, UInt32 *ioNumberDataPackets,AudioBufferList *bufferList, AudioStreamPacketDescription **outDataPacketDescription, void *inUserData)
void *data = malloc(length); UInt32 outputDataPackets = 1; AudioBufferList outputData; outputData.mNumberBuffers = 1; outputData.mBuffers[0].mNumberChannels = 2;// 输出类型声道数 outputData.mBuffers[0].mDataByteSize = (UInt32)length; outputData.mBuffers[0].mData = data; AudioStreamPacketDescription outputPacketDescription; OSStatus status = AudioConverterFillComplexBuffer(audioConverter, FillAudioDataCallback(__bridge void *)self, &outputDataPackets, &outputData, &outputPacketDescription);
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- iOS中UIAlertView警告框组件的使用教程
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解