wav的data chunk里面的data是什么样子的?用16进制表示的2进制数字吗?如果要修改data怎么修改?

作者&投稿:游儿 (若有异议请与网页底部的电邮联系)
android 播放器怎么播放wav格式文件~

WAV格式的细节在互联网上都可以找到,你仅仅需要在Google上搜索下。但是,遗憾的是,我并没有搜索到一个很好的Java库来读取WAV文件,而且可以移植到Android下。因此,我自己写了一些简单的代码。

下面这个方法就是如何读取一个WAV文件的头部:

private static final String RIFF_HEADER = "RIFF";
private static final String WAVE_HEADER = "WAVE";
private static final String FMT_HEADER = "fmt ";
private static final String DATA_HEADER = "data";

private static final int HEADER_SIZE = 44;

private static final String CHARSET = "ASCII";

/* */

public static WavInfo readHeader(InputStream wavStream) throws IOException,
DecoderException {

ByteBuffer buffer = ByteBuffer.allocate(HEADER_SIZE);
buffer.order(ByteOrder.LITTLE_ENDIAN);

wavStream.read(buffer.array(), buffer.arrayOffset(), buffer.capacity());

buffer.rewind();
buffer.position(buffer.position() + 20);
int format = buffer.getShort();
checkFormat(format == 1, "Unsupported encoding: " + format); // 1 means
// Linear
// PCM
int channels = buffer.getShort();
checkFormat(channels == 1 || channels == 2, "Unsupported channels: "
+ channels);
int rate = buffer.getInt();
checkFormat(rate = 11025, "Unsupported rate: " + rate);
buffer.position(buffer.position() + 6);
int bits = buffer.getShort();
checkFormat(bits == 16, "Unsupported bits: " + bits);
int dataSize = 0;
while (buffer.getInt() != 0x) { // "data" marker
Log.d(TAG, "Skipping non-data chunk");
int size = buffer.getInt();
wavStream.skip(size);

buffer.rewind();
wavStream.read(buffer.array(), buffer.arrayOffset(), 8);
buffer.rewind();
}
dataSize = buffer.getInt();
checkFormat(dataSize > 0, "wrong datasize: " + dataSize);

return new WavInfo(new FormatSpec(rate, channels == 2), dataSize);
}
上面的代码中,缺少的部分应该是显而易见的。正如你所看到的,仅仅支持16位,但在你可以修改代码以支持8位(AudioTrack不支持任何其他分辨率的)。

下面这个方法,则是用来读取文件剩余的部分 – 音频数据。

public static byte[] readWavPcm(WavInfo info, InputStream stream)
throws IOException {
byte[] data = new byte[info.getDataSize()];
stream.read(data, 0, data.length);
return data;
}
我们读取的WavInfo结构体,包含采样率,分辨率和声道数已经足够让我们去播放我们读取的音频了。

如果我们不需要将全部音频数据一次性放入内存中,我们可以使用一个InputStream,一点一点地读取。
转载

WAV格式的细节在互联网上都可以找到,你仅仅需要在Google上搜索下。但是,遗憾的是,我并没有搜索到一个很好的Java库来读取WAV文件,而且可以移植到Android下。因此,我自己写了一些简单的代码。

下面这个方法就是如何读取一个WAV文件的头部:

private static final String RIFF_HEADER = "RIFF";
private static final String WAVE_HEADER = "WAVE";
private static final String FMT_HEADER = "fmt ";
private static final String DATA_HEADER = "data";

private static final int HEADER_SIZE = 44;

private static final String CHARSET = "ASCII";

/* ... */

public static WavInfo readHeader(InputStream wavStream) throws IOException,
DecoderException {

ByteBuffer buffer = ByteBuffer.allocate(HEADER_SIZE);
buffer.order(ByteOrder.LITTLE_ENDIAN);

wavStream.read(buffer.array(), buffer.arrayOffset(), buffer.capacity());

buffer.rewind();
buffer.position(buffer.position() + 20);
int format = buffer.getShort();
checkFormat(format == 1, "Unsupported encoding: " + format); // 1 means
// Linear
// PCM
int channels = buffer.getShort();
checkFormat(channels == 1 || channels == 2, "Unsupported channels: "
+ channels);
int rate = buffer.getInt();
checkFormat(rate = 11025, "Unsupported rate: " + rate);
buffer.position(buffer.position() + 6);
int bits = buffer.getShort();
checkFormat(bits == 16, "Unsupported bits: " + bits);
int dataSize = 0;
while (buffer.getInt() != 0x61746164) { // "data" marker
Log.d(TAG, "Skipping non-data chunk");
int size = buffer.getInt();
wavStream.skip(size);

buffer.rewind();
wavStream.read(buffer.array(), buffer.arrayOffset(), 8);
buffer.rewind();
}
dataSize = buffer.getInt();
checkFormat(dataSize > 0, "wrong datasize: " + dataSize);

return new WavInfo(new FormatSpec(rate, channels == 2), dataSize);
}
上面的代码中,缺少的部分应该是显而易见的。正如你所看到的,仅仅支持16位,但在你可以修改代码以支持8位(AudioTrack不支持任何其他分辨率的)。

下面这个方法,则是用来读取文件剩余的部分 – 音频数据。

public static byte[] readWavPcm(WavInfo info, InputStream stream)
throws IOException {
byte[] data = new byte[info.getDataSize()];
stream.read(data, 0, data.length);
return data;
}
我们读取的WavInfo结构体,包含采样率,分辨率和声道数已经足够让我们去播放我们读取的音频了。

如果我们不需要将全部音频数据一次性放入内存中,我们可以使用一个InputStream,一点一点地读取。

我也遇到和你同样的问题,不知道你处理的怎么样了
我目前的做法是:
wav文件是以16进制代码的形式存储的,从百度上可以找到除data chunk部分外的各代码的意思,你也可以将其转呈asic代码,如果要改属性的话根据代码意义直接修改16进制代码,然后再update进去就成了。
我碰到的问题是我想修改data部分的数值大小,整体放大或缩小,不知道你有什么高招没有

using System.Data;
using System.Data.SqlClient;

//混合登录模式 用户名(uid)为sa 密码(pwd)为123456; 没得密码就是 uid=sa;pwd=";
string connString = "Data Source=localhost;database=MyDatabase#1;uid=sa;pwd=123456";
//Windows登录
string connString = "Data Source=localhost;database=MyDatabase#1;"Trusted_Connection=SSgPI"
SqlConnection conn = new SqlConnection(connString);


涿鹿县17549035159: 急!!!!wav文件中采样值代表什么意义? -
迟泊小儿: wav文件data Chunk中的采样值代表采样频率.即44100HZ,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几! 采样频率也可以理解成采样点,就是一秒采44100次,我们把这...

涿鹿县17549035159: 【求大神指导】wav文件数据区(文件头后面的)怎么用c语言编写啊? -
迟泊小儿: 实在很难跟你解释,首先WAV文件只是一个容器,存放的声音数据,这些数据由WAV文件头定义的(包括它们的格式),所以WAV其实可以放很多种编码的最常见的应该是PCM那种编码了,可以从微软的MSDN里查到相关的WAV结构,不过WAV数据都是一些波形的采样,这个一般不需要你去写的,如果你有自己的波形生成算法,才需要这么做,一般录音的话直接调微软的wavoutwrite那套API就OK了

涿鹿县17549035159: 24位wav要经过多少位文件头才到真正音频数据? -
迟泊小儿: 不好说.WAV 文件结构:头:Chunk ID "RIFF" Chunk 数据大小---------------------- RIFF 类型ID "WAVE"--------------------- 头a:Chunk ID "fmt" Chunk 数据大小 Sample Format info--------------------- 头b:Chunk ID "data" Chunk 数据大小 这里便是 Digital Audio 采样数据 非常详细细致的 描述见: http://www.sonicspot.com/guide/wavefiles.html

涿鹿县17549035159: 如何用java从wav文件中获取音频信息制作任意时刻的频谱图? -
迟泊小儿: cfgfutfvbnmjhgy;yuiyu7pkl[o;[lijuutyirtyoj'bhhiuunkuyjhk.,io0poilumnutyjuunk ijbl9mn8jthyuiyi7uytyuiopkjtyunjio8p9

涿鹿县17549035159: 如何用Vc读wav 格式的文件 -
迟泊小儿: 1.1 RIFF文件和WAV文件格式在Windows环境下,大部分的多媒体文件都依循着一种结构来存放信息,这种结构称为"资源互换文件格式"(Resources lnterchange File Format),简称RIFF.例如声音的WAV文件、视频的AV1文件等等均是...

涿鹿县17549035159: 将wav格式的音乐存在哪里,matlab才可以使用 -
迟泊小儿: matlab启动以后会显示“当前工作路径”,就是你现在使用的m文件是存在那个文件夹,放进这个文件夹就可以直接使用.如果音乐文件和m文件不在同一路径,那么在音乐文件前增加完整路径名也可以读取

涿鹿县17549035159: 用C#如何合并两个wav文件 -
迟泊小儿: 先去了解WAV文件的数据格式,知道它怎么标识一个文件的开始和结束就行了.你再用读取文件的方式,将2个文件的内部写入到一个数据流中,保存为wav文件就行了

涿鹿县17549035159: 热血传奇data文件夹里哪些是没○有用的 -
迟泊小儿: Wav主要作用是存储着传奇所有游戏音效WidgetData是盛大语音工具的文件夹可以删除,但文件不大,删除意义也不大 查看原帖>>

涿鹿县17549035159: C# 写wav文件 -
迟泊小儿: c#获取wave文件文件头信息 using system; using system.io; using system.text; namespace wav { /// /// summary description for wav. /// public class wav { public wav() { // // todo: add constructor logic here // } [stathread] static void main(string[] args) { // ...

涿鹿县17549035159: 热血传奇data文件夹里哪些是没有用 -
迟泊小儿: Data主要作用是存储着传奇所有游戏道具,装备,魔法,怪物,地表原件,NPC,小地图原件,登陆框的原件等 Map主要作用是存储着传奇所有游戏地图 Wav主要作用是存储着传奇所有游戏音效,如:怪物的叫声,人物被攻击的声音,拿下武...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网