Audio 无法播放已被操纵的音频数据(无符号字符)

Audio 无法播放已被操纵的音频数据(无符号字符),audio,wav,pcm,alsa,unsigned-char,Audio,Wav,Pcm,Alsa,Unsigned Char,在音频数据被操纵后,我无法播放它们。 我使用的唯一API是C中Linux Ubuntu上的alsa lib API。 我使用read从一个名为buffer1的无符号字符数组中的16位整数波形文件中获取数据,buffer1可以正常播放。我希望将数据传递给另一个大小相同的名为buffer2的无符号字符数组。如果我只是用buffer2[I]=buffer1[I]做一个循环,它就工作了:buffer2可以正常播放。但是为了操纵数据,我将其转换为浮点数组,然后再转换回无符号字符,直到现在我才操纵音频数据;

在音频数据被操纵后,我无法播放它们。 我使用的唯一API是C中Linux Ubuntu上的alsa lib API。 我使用read从一个名为buffer1的无符号字符数组中的16位整数波形文件中获取数据,buffer1可以正常播放。我希望将数据传递给另一个大小相同的名为buffer2的无符号字符数组。如果我只是用buffer2[I]=buffer1[I]做一个循环,它就工作了:buffer2可以正常播放。但是为了操纵数据,我将其转换为浮点数组,然后再转换回无符号字符,直到现在我才操纵音频数据;我只是将它们转换为float,然后再转换回unsigned char来测试它的工作原理。但是现在buffer2没有发出声音,尽管它的所有值都与buffer1的值完全相同,我对buffer1和buffer2的许多值进行了打印;他们都一样。。。我所做的就是从未签名到浮动,反之亦然

你知道怎么了吗


Victor

buffer1和buffer2中的值不能相同,否则会起作用。您在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;
}

你好,谢谢你的回答。我在古典音乐中做演员,我想:因为I=0;I当我比较buffer1[I]和buffer[2]值时,它们不相等buffer2[I]大于buffer2[I]
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