其实这个是我自己对WAV头文件没有理解对,应该早就解决了的。

看图

AudioTrack简单简介之四:wav去掉文件头之解决爆音 AudioTrack简单简介之四:wav去掉文件头之解决爆音

WAV文件头信息由大小44个字节的数据组成:

  • 4字节数据,内容为“RIFF”,表示资源交换文件标识
  • 4字节数据,内容为一个整数,表示从下个地址开始到文件尾的总字节数
  • 4字节数据,内容为“WAVE”,表示WAV文件标识
  • 4字节数据,内容为“fmt ”,表示波形格式标识(fmt ),最后一位空格。
  • 4字节数据,内容为一个整数,表示PCMWAVEFORMAT的长度
  • 2字节数据,内容为一个短整数,表示格式种类(值为1时,表示数据为线性PCM编码)
  • 2字节数据,内容为一个短整数,表示通道数,单声道为1,双声道为2
  • 4字节数据,内容为一个整数,表示采样率,比如44100
  • 4字节数据,内容为一个整数,表示波形数据传输速率(每秒平均字节数),大小为 采样率 * 通道数 * 采样位数
  • 2字节数据,内容为一个短整数,表示DATA数据块长度,大小为 通道数 * 采样位数
  • 2字节数据,内容为一个短整数,表示采样位数,即PCM位宽,通常为8位或16位
  • 4字节数据,内容为“data”,表示数据标记符
  • 4字节数据,内容为一个整数,表示接下来声音数据的总大小

因此在我们要播放WAV格式文件有爆音时,就去除这44个头文件自己即可。

以下是代码片段(之前文章有全部代码)


    /**
     * start play
     *
     * @param soundID
     */
    public void play(final int soundID) {
        if (soundID < 0 || soundID > MAX_SOUMD_NUM - 1) {
            Log.d(TAG, "-----Error Sound ID---:" + soundID);
            return;
        }
        initPlaySoundS(soundID);
        int bufSize = android.media.AudioTrack.getMinBufferSize(SAMPLERATEINHZ,
                AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT);
        /**
         * streamType:音频流类型
         * sampleRateInHz:採样率
         * channelConfig:音频声道
         * audioFormat:音频格式
         * bufferSizeInBytes缓冲区大小:
         * mode:音频数据载入模式
         */
        audioTrack = new AudioTrack(AudioManager.STREAM_NOTIFICATION,
                SAMPLERATEINHZ, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, bufSize,
                AudioTrack.MODE_STREAM);
        audioTrack.flush();

        //去除wav头文件字节
        newAudioData = Arrays.copyOfRange(audioData, 44, audioData.length);

        new Thread(new Runnable() {
            @Override
            public void run() {

                if (audioTrack != null) {
                    try {
                        audioTrack.play();
                        audioTrack.write(newAudioData, 0, newAudioData.length);
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        }).start();
        Log.d(TAG, "Playing");
        return;
    }

我们就只增加一行(红色代码)就完美解决了,这个只能说是我对wav的头文件不太了解导致的。

 历史上的今天

  1. 2023: Android图片旋转(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

Launcher2源码之壁纸设置

上回我们简单介绍了Launcher中的布局,这次我们看看如何设置壁纸。在Launcher界面,长按空白处,就会弹出如上图的壁纸设置对话框。直接上代码Launcher.java1. onCreate() 加载布局和初始化控件 @Override protected v...

Android 设备adb连接后unauthorized解决方法

前言设备开启了debug模式(开发者模式),但adb devices 后还是有如下提示,大意是未授权状态。C:\Users\walter>adb devicesList of devices attachedemulator-5554 unauthorized解决方式对于这...

Square开源框架Coordinators的简单使用

Coordinators简介Coordinators是由知名公司Square开发并开源的框架,Simple lifecycle for your MVWhatever on Android. No kidding.哈哈,比较小众,但很不错的。目前国内没啥资料介绍这个和使用这个。Github地...

git config时fatal not in a git directory

前言最近通过git config修改邮箱和密码是出行如下异常提示:fatal: not in a git directory记录一下,方便自己查阅正文之前使用git config时也没有出行这样的问题,但最近在客户的虚拟机中折腾就出现了。常用命令git config --listg...

嫣然若雪:余生,看淡所有,珍惜拥有

现实生活中,有太多的欲望,求不到,爱不得,为自己搭建了牢笼,囚禁在很深的执念里,得不到,放不下。人生本就不易,生活里本就有太多的苦,烦恼不捡自然无,要捡天天有,没有谁能把日子过得一直顺遂。有些人,因为自己的执念,让生活增添不必要的负担;有些人,因为一点小事,让自己活得心烦意乱。人生的痛苦都是自...

朱光潜:读书不在多,在于选得精,读得彻底

十几年前我曾经写过一篇短文谈读书,这问题实在是谈不尽,而且这些年来我的见解也有些变迁,现在再就这问题谈一回,趁便把上次谈学问有未尽的话略加补充。学问不只是读书,而读书究竟是学问的一个重要途径。因为学问不仅是个人的事而是全人类的事,每科学问到了现在的阶段,是全人类分途努力日积月累所得到的成就,而这成...