我需要从wav文件中删除标题。但是,它们可以是44,46,也可以是字面上任意数量的字节。如何从wav文件中始终删除标题?
答案 0 :(得分:1)
由于PCM(音频)数据总是在这些字节之后开始:
64 61 74 61
也许你可以搜索上面的内容,然后选择他们的位置作为"结束"部分"删除标题" 范围?
在字节数组(或文件阅读器)中进行搜索的伪代码......
//# where... var NAME : DATA TYPE = VALUE;
在您的编程语言中尝试这种逻辑。
var myWAVbytes : ByteArray = your_file_Bytes_with_header; //# WAV data
var byteVal : Int = -1; //# stores value of a byte
var posVal : Int = 0; //# stores position (offset) of a byte
while (true)
{
byteVal = myWAVbytes[ posVal ]; //read value at this offset
if( byteVal == 0x64) //# check for beginning "64" byte
{
//if issues also try as: posVal-1 ...in case offset is ahead by one
byteVal = myWAVbytes[ posVal ].readInteger32(); //# check 4 byte sequence of: "64 61 74 61"
if( byteVal == 0x64617461 ) //# found "data" sequence bytes
{
Print_Log( "0x64617461 data begins at : " + posVal );
break;
}
}
posVal++; //# move forward through bytes
}
带手动检查的备用版本(未使用readInteger
类型选项)...
while (true)
{
byteVal = myWAVbytes[ posVal ]; //read value at this offset
if( byteVal == 0x64) //# check for beginning "64" byte
{
if( (myWAVbytes[posVal] == 0x64) && (myWAVbytes[posVal+1] == 0x61) && (myWAVbytes[posVal+2] == 0x74) && (myWAVbytes[posVal+3] == 0x61) )
{
//# found "data" sequence bytes
Print_Log( "0x64617461 data begins at : " + posVal );
break;
}
}
posVal++; //# move forward through bytes
}
希望它有所帮助。
答案 1 :(得分:1)
始终如一地做任何事情的唯一方法就是先了解它。 WAV文件规范定义了标题的内容,并了解您拥有剥离标题所需的所有信息。信不信由你,几乎所有读取WAV文件的软件程序都能够始终如一地查找数据。
没有花时间理解格式,音频数据前面有4个字节'd','a','t','a'和4字节长度。您可以只搜索文本,跳过4个字节并查找数据。但请注意,如果不检查跳过的信息,您可能没有解释音频数据所需的信息。
如果您有兴趣了解格式,请查看以下链接:http://soundfile.sapp.org/doc/WaveFormat/