我想编写一个将十六进制数据转换为音频文件的小型Web应用程序。
音频文件的数据将采用十六进制格式,如下所示:
DA1FFFF8B3AEEE2E23BBB9A2221F10400180001EF1C1E7F180F0FC0004FE067C03002FF92B924903450
E0C8D558F2475AF7232A28DF76493A54CE348B37D33F8616EE30A69EF56534D53320656E6320
如何使用PHP做到这一点?
最佳答案
任何数据都可以转换为音频...如果您以每秒500个周期的速度合成正弦波,然后遍历十六进制数据并使用它调制音频,您将听到由十六进制驱动的模式...当前的十六进制值可能会改变您的正弦合成频率
因此,第一步可能是创建一个循环,在该循环中合成原始音频波...进行渲染音频工作,然后使用循环迭代器索引遍历您的十六进制数据数组,并使当前的十六进制值移动您所使用的参数在合成正弦波时使用
这是一些伪代码,它将以合理的采样率和位深度填充原始音频的存储缓冲区,任何播放器都可以将其转换为音频...这是我使用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)...注释掉了,它只是通过incr_freq递增变量freq,您可以使用convert_hex_to_float将当前的十六进制映射替换为incr_freq以 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))
}
关于php - 是否可以从PHP中的十六进制/二进制(原始数据)值生成音频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56124316/