Eri*_*sen 6 iphone cocoa objective-c core-audio audioqueueservices
我试图通过AudioQueue读取音频数据.当我这样做时,我可以验证文件的位深度是16位.但是当我得到实际的样本数据时,我只看到-128到128的值.但我也看到了可疑的交错数据,这让我非常确定我只是没有正确读取数据.
首先,我可以验证源文件是44100,16位单声道wav文件.
我的缓冲区是这样分配的:
char *buffer= NULL; buffer = malloc(BUFFER_SIZE); assert(buffer);
所有相关值均已设置并用于:
AudioFileReadPackets(inAudioFile,false,&bytesRead,NULL,packetNum,&numPackets,buffer);
作为测试,只是为了让我可以看到检索到的数据,我运行:
for(int i=0;i<BUFFER_SIZE;i++){
NSLog(@"%i", buffer[i]);
}
现在,我知道我的源文件到处都是峰值,但是我看到的值只有最大值为-128和128.由于这是一个16位文件,我希望这些值代之以-32768到32768.
此外,数据中似乎有两种模式.以下是返回数据的示例:
70 -13 31 -11 -118 -9 -15 -7 116 -4 31 -1 28 1 84 2 -123 3 -97 4 110 5 54 6 126
现在看一下从第二行开始的每一行:-13.看看它是如何增加的,而不是均匀的,但至少是顺利的?奇数行并不接近那些平滑的行.
我的第一个想法是这是交错的立体声数据,但不是,它只是一个通道,所以不应该有任何交错,对吧?
我最好的猜测是我只是错误地读取数据,因此样本数据跨越两个返回.知道如何正确阅读吗?
感谢您阅读整个问题,以及您可以提供的任何见解.
Run Code Online (Sandbox Code Playgroud)char *buffer= NULL;
这就是原因.您正在迭代有符号字节,而不是16位样本.
将变量声明为包含指向双字节值的指针:
SInt16 *buffer = NULL;
Run Code Online (Sandbox Code Playgroud)
然后,迭代一半的样本作为字节:
for(int i=0;i < (BUFFER_SIZE / sizeof(*buffer));i++){
NSLog(@"%i", buffer[i]);
}
Run Code Online (Sandbox Code Playgroud)
我将重新命名BUFFER_SIZE,以BUFFER_SIZE_BYTES澄清它.
| 归档时间: |
|
| 查看次数: |
3825 次 |
| 最近记录: |