2012-03-29 50 views
1

我操作后播放音频数据时遇到问题。 我使用的唯一API是在Linux(Ubuntu)中的C的alsa lib API。C 我使用read()和buffer1可以正确地播放来自16位整数波形文件的数据在无符号字符数组(称为buffer1)中。我希望数据被传递给另一个相同大小的unsigned char数组(称为buffer2)。如果我只是用buffer2 [i] = buffer1 [i]做一个循环,它就会起作用:buffer2可以正常播放。但为了操作数据,我将它转换为浮点数组,然后返回到无符号字符(直到现在我不操作音频数据;我只是将它们转换为浮点数,然后返回到无符号字符以测试它的工作原理)。但是,现在buffer2并没有发出声音,尽管它的所有值都与buffer1的值完全相同(我做了一个buffer1和buffer2的printf值;它们都是相同的)......我所做的只是从unsigned到float反之亦然...无法播放已操作的音频数据(无符号字符)

请问有什么不对吗?

维克多

回答

0

在缓冲器1和缓冲器的值不能是相同的或者它会工作。也许你在printf命令中使用的格式掩盖了差异(%i,%f等)。不要使用printf,请尝试设置断点并使用调试器查看值。这可能有助于揭示实际发生了什么问题。

编辑:

鉴于你关于你如何执行转换的意见,我觉得我现在可以提供帮助。原始数据是unsigned char类型。在大多数平台上,这将是一个介于0和255之间的整数值。您希望将此值转换为浮点数来执行操作。为了使数据对于任何操作都具有浮点类型的意义,您希望将该范围缩放到+/- 1.0之间。这是以下代码中“scale”变量的用处。

#include <iostream> 
#include <math.h> 

int main() 
{ 

    const int BUFFER_LEN = 6; 
    const unsigned char channelDataIN[] = {0,255, 1, 254, 2, 253}; 

    unsigned char channelDataOUT[BUFFER_LEN]; 
    float channelDataF[BUFFER_LEN]; 

    std::cout.precision(5); 

    float scale = powf(2.f, 8.f*sizeof(unsigned char)) - 1.f; 


    for (int mm = 0; mm < BUFFER_LEN; ++mm) 
    {   
     std::cout << "Original = " << (int)channelDataIN[mm] << std::endl; 

     channelDataF[mm] = (float)(channelDataIN[mm]) * 2.f/scale - 1.f; //Float cast 
     std::cout << "Float conversion = " << channelDataF[mm] << std::endl; 

     channelDataOUT[mm] = (unsigned char) ceil( (1.f+channelDataF[mm]) * scale/2.f ); 
     std::cout << "Recovered = " << (int)channelDataOUT[mm] << std::endl; 

     if (channelDataIN[mm] == channelDataOUT[mm]) 
      std::cout << "The output precisely equals the input" << std::endl << std::endl; 
     else 
      std::cout << "The output != input" << std::endl << std::endl; 
    } 

    return 0; 
} 

将值转换回来后的无符号字符输出数组与输入数组相同。这是代码的输出。 。 。

Original = 0 
Float conversion = -1 
Recovered = 0 
The output precisely equals the input 

Original = 255 
Float conversion = 1 
Recovered = 255 
The output precisely equals the input 

Original = 1 
Float conversion = -0.99216 
Recovered = 1 
The output precisely equals the input 

Original = 254 
Float conversion = 0.99216 
Recovered = 254 
The output precisely equals the input 

Original = 2 
Float conversion = -0.98431 
Recovered = 2 
The output precisely equals the input 

Original = 253 
Float conversion = 0.98431 
Recovered = 253 
The output precisely equals the input 
+0

你好,谢谢你的回答。我在古典中扮演角色,我认为:for(i = 0; i victor 2012-03-30 08:12:06

+0

当我比较buffer1 [i]和buffer [2]值时,它们不相等(buffer2 [i]大于buffer2 [i]) – victor 2012-03-30 08:57:16