audio - 无法播放已处理的音频数据(无符号字符)

标签 audio wav pcm alsa unsigned-char

处理完音频数据后,我无法播放它们。
我使用的唯一API是C语言中Linux(Ubuntu)上的alsa lib API。
我使用read()从无符号char数组(称为buffer1)中的16位整数波形文件中获取数据,并且buffer1可以正常播放。我希望将数据传递到另一个相同大小的无符号char数组(称为buffer2)。如果我仅使用buffer2 [i] = buffer1 [i]进行循环,则可以正常工作:buffer2可以正常播放。但是为了处理数据,我将其转换为float数组,然后再转换回unsigned char(直到现在我不操纵音频数据;我只是将它们转换为float,然后再转换为unsigned char以测试其工作原理)。但是现在,尽管buffer2的所有值都与buffer1的值严格相同(但我制作了具有很多buffer1和buffer2的值的printf;它们都是相同的),但是现在它没有发出声音……我所做的只是从unsigned转换为float反之亦然...

请问出什么问题了吗?

胜利者

最佳答案

buffer1和buffer2中的值不能相同,否则将起作用。也许您在printf命令中使用的格式掩盖了差异(%i,%f等)。而不是使用printf,而是尝试设置断点并使用调试器查看值。这可能有助于揭示实际出了什么问题。

编辑:

考虑到您对 Actor 表演奏方式的评论,我认为我现在可以提供帮助。传入的原始数据的类型为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

关于audio - 无法播放已处理的音频数据(无符号字符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9930927/

相关文章:

Java .wav 获取二进制数据

python - librosa 不会规范化 [-1, 1] 之间的 wave 文件

javascript - audio.play()和多个效果播放?

audio - 如何用ffmpeg覆盖两个音频?

javascript - 我如何实现不使用 es6 的react-wavesurfer 实例?

python - 通过fft查找wav文件的频率幅度和相位

audio - PCM/RAW音频容器,用于流式传输

android - 具有我自己的音频PCM轨道的多路视频

c# - 如何读取 IMediaSample 24 位 PCM 数据

ios - 面向初学者的 iOS 音频分析