是否可以从PHP中的十六进制/二进制(原始数据)值生成音频文件?

时间:2019-05-14 06:35:58

标签: php file audio binary hex

我想编写一个小型Web应用程序,将十六进制数据转换为音频文件。

音频文件的数据将采用十六进制格式,如下所示:

DA 1F FF F8 B3 AE EE 2E 23 BB B9 A2 22 1F 10 40
01 80 00 1E F1 C1 E7 F1 80 F0 FC 00 04 FE 06 7C
03 00 2F F9 2B 92 49 03 45 0E 0C 8D 55 8F 24 75
AF 72 32 A2 8D F7 64 93 A5 4C E3 48 B3 7D 33 F8
61 6E E3 0A 69 EF 56 53 4D 50 33 20 65 6E 63 20

是否可以使用PHP做到这一点?

1 个答案:

答案 0 :(得分:-1)

任何数据都可以转换为音频...如果您以每秒500个周期的速度合成一个正弦波,然后遍历十六进制数据并使用它调制音频,您将听到由十六进制驱动的模式...当前的十六进制值可能会改变您的sin回路正在合成的频率

因此,第一步可能是创建一个循环,在其中合成原始音频波...使此工作呈现音频,然后使用循环迭代器索引遍历您的十六进制数据数组并使当前的十六进制值移位合成正弦波时使用的参数

这是一些伪代码,它将以合理的采样率和位深度填充原始音频的存储缓冲区,任何播放器都可以将其呈现为音频……这是我使用OpenAL编写的概念证明的一部分进行音频渲染

hex_buffer gets defined and populated above

float freq = 100.f;
float incr_freq = 0.1f;

int seconds = 4;
unsigned sample_rate = 44100;
double my_pi = 3.14159;
size_t buf_size = seconds * sample_rate; // define buffer size

// allocate PCM audio buffer        
short * samples = malloc(sizeof(short) * buf_size);

printf("\nhere is freq %f\n", freq);
int i=0;
int index_hex = 0;
for(; i<buf_size; ++i) {

    samples[i] = 32760 * sin( (2.f * my_pi * freq)/sample_rate * i );

    /*
    freq += incr_freq; // comment out to synthesize pure sin wav

    if (100.0 > freq || freq > 5000.0) {

        incr_freq *= -1.0f;
    }
    */

    freq += convert_hex_to_float(hex_buffer(index_hex++))
}

上面的内容将带您进入球场……在这里,我们遍历十六进制值的序列(index_hex)……注释掉了,它只是将变量freq增加了incr_freq,您可以将incr_freq替换为当前十六进制的映射到使用convert_hex_to_float浮动

这是一个辅助函数,用于将单个十六进制字符转换为整数

int hex2int(char ch) {

    if (ch >= '0' && ch <= '9')
        return ch - '0';
    if (ch >= 'A' && ch <= 'F')
        return ch - 'A' + 10;
    if (ch >= 'a' && ch <= 'f')
        return ch - 'a' + 10;
    return -1;
}

在下面,我将忽略我们如何从您的两个char十六进制数字中提取左右十六进制字符

func convert_hex_to_float(given_hex) { // return float

    left_hex_char = pluck_out_first_hex_char(given_hex)
    right_hex_char = pluck_out_second_hex_char(given_hex)

    return (16.0 * hex2int(left_hex_char) + 1.0 * hex2int(right_hex_char))
}