关于.wav文件无法用playsound播放的问题

1 篇文章 0 订阅

之前遇到一个问题,我录音并加头的一个latestAudio.wav音频文件可以用迅雷看看播放器打开并正常播放,但是用函数playsound就无论如何放不了。


后来我做了实验,将latestAudio.wav改为latestAudio.mp3,然后迅雷看看播放器依然可以播放,至此可以断定,文件的音频流数据应该是没有问题,但是头出错了。

这个时候,就要分析哪里出错了。我是这样做的:

1.找到一个正确的.wav文件做对比,去你的电脑的C:\Windows\Media目录下可以get到很多系统自带的.wav文件,这些文件无疑都是正确的

2.下载Hex Workshop,用来比对两个.wav文件的头。要注意Hex Workshop的高低位是颠倒的,这点接下来再详细介绍。

3.将两个.wav文件拖到Hex Workshop里

4.去网上搜索下“wav头格式“,我这里有两个推荐的网址:

http://blog.csdn.net/xsjm206/article/details/6727023

http://blog.csdn.net/yzhouen/article/details/777459

只要你搜索了数个相关网页,相信你会和我一样迷惑:咋说的都不一样呢?到底哪个是对的啊?

我表示我目前并没有搜到一个答案能解释为什么网上会有那么多.wav格式,如果谁知道跪求告知~

但是呢~ 你手头可是有Windows自带的,wav文件,不管如何,这个.wav头肯定是正解之一,那么对照着它去理解.wav头每个字段的意义,再回过头看我们的音频哪里出问题了


下图是Hex Workshop的截图,可以看到,wav文件的头已经展现在你面前了,第一行是固定字段”RIFF“、”WAVEfmt “以及”音频长度-8“,这个没问题,暂时不管。


接下来分析10H到23H之间的这些字段(即第一行之后,到"data"之前的那部分),最简单的办法就是都抄下来一个个看:

10 00 00 00 01 00 02 00 44 AC 00 00 10 B1 02 00 04 00 10 00

对照这个图:


10 00 00 00 01 00 02 00 44 AC 00 00 10 B1 02 00 04 00 10 00

首先应该是”格式类别10H“,2个字节,然而你看到的是10 00明显不是10H(00 10)这是因为刚刚提到的在Hex Workshop中高低位是颠倒的,所以这里就是00 10

然而再看下一字段,”通道数1或者2“  然而10 00 之后是00 00,显然没有0通道这回事儿,再看这个:


这里面的”格式类别10H“是4个字节,所以在接下来的分析里就不能死死按着表来分析,字节数是可以变的,但是字段就那么几个,一个个对应起来就可以了。

这里直接给结论,字节划分

10 00 00 00 01 00 02 00 44 AC 00 00 10 B1 02 00 04 00 10 00

把颠倒的字节还原:

00 00 00 10   00 01         00 02                   00 00 AC 44       00 02 B1 10     00 04            00 10 

PCM                fmttag       channel               samplespersec  bytepersec       blockalign    bitpersamples

以上就是针对一个Windows系统自带.wav的头分析,参照这个对比自己的wav文件的头很容易看出问题来

当然,这只是个.wav头的一种格式,其他格式可以自己去琢磨琢磨~~




  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Android播放.wav文件的代码示例: ```java import android.media.AudioManager; import android.media.SoundPool; import android.os.Bundle; import android.app.Activity; public class MainActivity extends Activity { private SoundPool soundPool; private int soundID; boolean loaded = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); // 加载音频文件 soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { @Override public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { loaded = true; } }); soundID = soundPool.load(this, R.raw.sound, 1); } public void playSound(View v) { if (loaded) { soundPool.play(soundID, 1, 1, 1, 0, 1f); } } @Override protected void onDestroy() { super.onDestroy(); soundPool.release(); soundPool = null; } } ``` 上述代码使用了Android提供的`SoundPool`类来播放.wav文件。在`onCreate`方法中,首先初始化了`SoundPool`,然后通过`setOnLoadCompleteListener`方法来监听文件是否加载完成,一旦完成就将`loaded`标志设置为`true`。最后调用`load`方法来加载.wav文件。 在`playSound`方法中,如果文件已经加载完成,就可以调用`SoundPool`的`play`方法来播放文件。`play`方法的参数依次为:音频文件的ID、左声道音量(0.0f-1.0f)、右声道音量(0.0f-1.0f)、优先级(0为最低)、循环次数(0表示不循环)、播放速度(1.0f为正常速度)。 最后在`onDestroy`方法中释放`SoundPool`占用的资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值