我正在尝试将一个WAV文件放在AudioBuffer中,以便我可以操作它。我以前从AudioBuffer创建了WAV文件,并且需要将Float32Array转换为包含Int16值的DataView。我使用了这个方便的功能:
function floatTo16BitPCM(output, offset, input){
for (var i = 0; i < input.length; i++, offset+=2){
var s = Math.max(-1, Math.min(1, input[i]));
output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
}
}
好吧,我现在需要做的就是反转这个(WAV文件是从服务器加载的,所以我不再拥有原始数据了)。我无法弄清楚该函数实际发生了什么或数据是如何转换的。
答案 0 :(得分:2)
这似乎有用。我在响应类型为“arraybuffer”的ajax调用中加载数据。否则,响应最终成为一个字符串,这是一个混乱的工作。然后我转换为16位数组。然后我以与WAV编码一起使用的方式将其转换为Float32数组。我还需要丢弃WAV的标题,并在结尾处丢弃一些元数据。
public function new_user()
{
$this->_set_validation_rules();
if($this->form_validation->run())
{
if($user_id = $this->User_model->insert($this->_prepare_new_user_array()))
{
$this->common_functions->_send_message("New User created successfully. | user_id: " . $user_id);
}
else {
$this->common_functions->_send_message("Unable to create new User record.");
}
}
}
答案 1 :(得分:0)
数组输入的每个实数据都减少到区间[-1,1]
然后将-1和1之间的实数转换为带符号的16位整数。
无论是正数还是负数乘以32767或-32768,它都只保留一个整数部分。这相当于在二进制表示中只保留小数点后的16个有效位。
16位整数存储在缓冲区中的两个字节的小端字节中,一个接一个地存储(根据将二进制转换为两个的偏移量)
对于反向操作,只需在int16中放置两个连续的字节。将其转换为符号后面的真实区分两种情况并除以32768或32767.但操作将在数据丢失的情况下完成。