我是iOS编程的新手,我正试图操纵音频文件的某些音频特性,这需要音频数据作为能够成功获取的浮点值。
我坚持如何将浮动值作为音频数据播放。我使用其文档调查了很多iOS框架,但大多数都不允许我处理浮点数据。它主要是阅读和播放音频文件&控制一些播放参数。
简而言之:
目标:将浮点值的缓冲区/数组(原始音频数据)作为音频播放。
整体流程:音频文件 - >读取浮动缓冲区(完成) - >操纵(可以) - >播放为音频(不想存储为文件)
如果问题非常幼稚,请道歉。所有帮助表示赞赏。感谢。
答案 0 :(得分:0)
我是第二个sbooth的评论。有关播放的好教程,请查看2014 WWDC Videos。你想看:
答案 1 :(得分:0)
如果使用AVAudioPlayer,则会有一个initWithData将NSData作为参数。所以看起来你的挑战是loading your float buffer into NSData。
您没有评论浮动缓冲区的格式(即pcm,单声道,立体声,交错等)
如果您需要低延迟,更细粒度的功能或更加模糊的音频格式,您还可以使用RemoteIO audio单元播放音频缓冲区。假设您正确初始化AudioStreamBasicDescription以便它与您的音频格式兼容,您应该能够为其提供浮动缓冲区。
答案 2 :(得分:0)
谢谢@jaybers我采用了类似的解决方案。抱歉不提前发布。
解决方案: 1)我在BYTE *类型数组中构建/编码用于回放的标题(PCM是最简单的)。 2)将标头附加到NSDATA阵列。 3)将浮点数据附加到NSDATA数组 4)使用AVAudioPlayer播放....
我遇到的一个问题:我的数据是16位,而IOS中的浮点数为32位,因此将其作为16位PCM / 32位PCM播放引入噪声 - 我认为是因为额外的零。所以我将浮动数据传输到短数据类型数组并将其附加到NSDATA并将其作为16bit-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