iOS浮点缓冲区用于音频播放

iOS浮点缓冲区用于音频播放,ios,objective-c,core-audio,Ios,Objective C,Core Audio,我对iOS编程不熟悉,正在尝试处理音频文件的一些音频特征,这些特征要求音频数据作为能够成功获得的浮点值 我一直在研究如何将浮点值作为音频数据播放。我使用它的文档调查了很多iOS框架,但大多数框架都不允许我处理浮点数据。它主要是读取和播放音频文件&控制一些播放参数 简言之: 目标:将浮点值(原始音频数据)的缓冲区/数组作为音频播放 整个过程:音频文件->读取浮动缓冲区(完成)->操纵(可以做)->作为音频播放(不希望存储为文件) 如果问题很幼稚,我会道歉。感谢所有的帮助。谢谢。我支持斯博思的评论。

我对iOS编程不熟悉,正在尝试处理音频文件的一些音频特征,这些特征要求音频数据作为能够成功获得的浮点值

我一直在研究如何将浮点值作为音频数据播放。我使用它的文档调查了很多iOS框架,但大多数框架都不允许我处理浮点数据。它主要是读取和播放音频文件&控制一些播放参数

简言之:

目标:将浮点值(原始音频数据)的缓冲区/数组作为音频播放

整个过程:音频文件->读取浮动缓冲区(完成)->操纵(可以做)->作为音频播放(不希望存储为文件)


如果问题很幼稚,我会道歉。感谢所有的帮助。谢谢。

我支持斯博思的评论。有关播放的良好教程,请查找。你想看:


如果使用AVAudioPlayer,则会有一个initWithData,它将NSData作为参数。看来你面临的挑战是

您尚未对浮点缓冲区的格式(即pcm、单声道、立体声、交错等)发表评论

如果您需要低延迟、更精细的功能或更模糊的音频格式,您还可以使用一个单元来播放音频缓冲区。您应该能够为它提供一个浮动缓冲区,假设您正确初始化了,以便它与您的音频格式兼容。

谢谢@jaybers,我采用了类似的解决方案。抱歉没有早点发布

解决方案: 1) 我构建/编码了一个字节*型数组中用于播放的头(PCM是最简单的)。 2) 将标头追加到NSDATA数组。 3) 将浮点数据附加到NSDATA数组 4) 使用AVAudioPlayer进行播放

我面临的一个问题是:在IOS中,我的数据是16位的,而浮点是32位的,所以在播放16位PCM/32位PCM时会引入噪声-我想是因为额外的零。因此,我将浮点数据传输到短数据类型数组中,并将其附加到NSDATA中,并将其作为16位PCM播放-完美播放

代码:

//mynewdata1 is a short datatype 16bit array

NSData *Wave1= [NSMutableData dataWithData:mynewdata1]; 

unsigned long totalAudioLen=[Wave1 length];
unsigned long totalDataLen = totalAudioLen + 44;
unsigned long longSampleRate = 4*11025.0;
unsigned int channels = 1;
unsigned long byteRate = (16 * longSampleRate * channels)/8;

Byte *header = (Byte*)malloc(44);
header[0] = 'R';  // RIFF/WAVE header
header[1] = 'I';
header[2] = 'F';
header[3] = 'F';
header[4] = (Byte) (totalDataLen & 0xff);
header[5] = (Byte) ((totalDataLen >> 8) & 0xff);
header[6] = (Byte) ((totalDataLen >> 16) & 0xff);
header[7] = (Byte) ((totalDataLen >> 24) & 0xff);
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
header[12] = 'f';  // 'fmt ' chunk
header[13] = 'm';
header[14] = 't';
header[15] = ' ';
header[16] = 16;  // 4 bytes: size of 'fmt ' chunk
header[17] = 0;
header[18] = 0;
header[19] = 0;
header[20] = 1;  // format = 1 for pcm and 2 for byte integer
header[21] = 0;
header[22] = (Byte) channels;
header[23] = 0;
header[24] = (Byte) (longSampleRate & 0xff);
header[25] = (Byte) ((longSampleRate >> 8) & 0xff);
header[26] = (Byte) ((longSampleRate >> 16) & 0xff);
header[27] = (Byte) ((longSampleRate >> 24) & 0xff);
header[28] = (Byte) (byteRate & 0xff);
header[29] = (Byte) ((byteRate >> 8) & 0xff);
header[30] = (Byte) ((byteRate >> 16) & 0xff);
header[31] = (Byte) ((byteRate >> 24) & 0xff);
header[32] = (Byte) (16*1)/8;  // block align
header[33] = 0;
header[34] = 16;  // bits per sample
header[35] = 0;
header[36] = 'd';
header[37] = 'a';
header[38] = 't';
header[39] = 'a';
header[40] = (Byte) (totalAudioLen & 0xff);
header[41] = (Byte) ((totalAudioLen >> 8) & 0xff);
header[42] = (Byte) ((totalAudioLen >> 16) & 0xff);
header[43] = (Byte) ((totalAudioLen >> 24) & 0xff);

NSData *headerData = [NSData dataWithBytes:header length:44];
NSMutableData * soundFileData1 = [NSMutableData alloc];
[soundFileData1 appendData:headerData];
[soundFileData1 appendData:Wave1];

self.avap1 = [[AVAudioPlayer alloc] initWithData:soundFileData1 fileTypeHint:@"wav" error:&error1];
[self.avap3 play]; //to play

可以将AVAudioPlayer与内存缓冲区一起使用。如何将浮点数组转换为短数组?