将 wav 文件转换为没有标头的原始二进制文件

Posted

技术标签:

【中文标题】将 wav 文件转换为没有标头的原始二进制文件【英文标题】:Converting wav files into raw binary without header 【发布时间】:2021-05-11 12:58:48 【问题描述】:

我正在尝试将目录中的 wav 文件转换为 16khz、2 通道和签名 int 16,然后转换为原始二进制没有标头信息,这意味着我无法使用 audiowrite。我决定为此编写这个 MATLab 脚本。它是否正确?我觉得我可能忽略了一些东西。谢谢。

clc;clear all;close all
x=1;
while(x<=5)
chr = int2str(x)
FileName1=strcat('meow/',chr) %Loading File Name
FileName=strcat(FileName1,'.wav')
%Read the data to the MATLAB using audioread.
[y,fs] = audioread(FileName);
%change to 16000 sampling rate and sign16 stream
newfile = strcat('meow/',chr);
y = int16(y);
fs2=16000;
y1=[];
y1(:,1) =y(1:fs/fs2:end,1);
y1(:,2) =y(1:fs/fs2:end,2);

fid = fopen(FileName, 'r');
data = fread(fid, [2, Inf], 'int16');
fclose(fid);

data=y1';
bit1 = int16(rem(floor((1 ./ [128, 64, 32, 16, 8, 4, 2, 1].') * double(data(1,:))), 2));
bit2 = int16(rem(floor((1 ./ [128, 64, 32, 16, 8, 4, 2, 1].') * double(data(2,:))), 2));
%https://www.mathworks.com/matlabcentral/answers/386841-how-to-convert-wav-file-into-binary
bit = [bit1 bit2];
FileNameend = strcat(newfile,'.bin');
save(FileNameend, 'bit'); % save using .bin
f = fopen(FileNameend, 'w');
fwrite(f, bit, 'double');
filename=strcat(newfile,'x.wav');
delete(filename);
x=x+1;
end

【问题讨论】:

你为什么认为你可能忽略了一些东西? 在我看来有点过于复杂了。我原以为你可以使用audioread 阅读,然后使用fwrite 写作。但是,如果您所做的工作有效,那么就使用它。 【参考方案1】:

一个建议:使用audiowrite 编写WAV,然后使用sox command line tool 将WAV 转换为无头的原始二进制文件:

sox in.wav out.raw

您甚至可以通过 system 函数从 Matlab 调用 sox。

【讨论】:

在将 wav 转换为无头二进制文件之前,我还可以使用 sox 进行转换吗?例如:sox 1.wav -b 16 -c 2 -r 16k -t raw 1.raw

以上是关于将 wav 文件转换为没有标头的原始二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 将 .wav 文件转换为 .mp3?

音频 .wav 文件的二进制分类

将数据馈送到插孔时声音失真 - .wav 二进制数据转换为数字信号?

究竟是啥导致二进制文件“乱码”?

从 PCM 转换为 WAV。是不是可以?

在 NAudio 中附加 WAV 标头