其实这个是我自己对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、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

杨绛:人生有命

神明的大自然,对每个人都平等。不论贫富尊卑、上智下愚,都有灵魂,都有个性,都有人性。但是每个人的出身、遭遇和天赋的资质才能,却远不平等。有富贵的、有贫贱的,有天才、有低能,有美人、有丑八怪。凭什么呢?人各有“命”。“命”是全不讲理的。孔子曾慨叹:“命矣夫!斯人也而有斯疾也!斯人也而有斯疾也!”(《论...

Android Studio导入Android 9.0的Launcher3

前言以前记录Android Studio导入Android 9.0的Launcher3的步骤。以前写的,最近重新看到,就放这里了。正文源码信息系统版本             : Android 9.0源码目录             : \packages\apps\Lau...

许立志:行走的肉体

撕开这些枯萎的花朵,垂死的帷幕被风干的命运,喑哑的厂房韶华失色,螺丝拧紧他怯弱的骨头关节,尖锐的疼痛破裂,你深为了解的封闭油腻的齿轮,咬啮辗压红色的童年,一如火车日夜辗压铁轨,呼啸漂泊的流浪间雨又落下,纠缠喧哗的爱情,梦想我看到自己的幸运或者不幸熔进了发展中的工业废水饱蘸叹息的...

IjkPlayer和MediaPlayer常见错误码

前言现在媒体播放使用很多项目都使用bilibili开源的IjkPlayer,当然也用系统自带的MediaPlayer,都有回调onError()和onInfo(),因此这里整理一下常见的INFO码。 @Override public boolean onError(MediaPl...

[摘]替代Beyond Compare软件

前言Beyond Compare是比强大的文件对比软件,但是收费且比较贵。偶尔使用,且不想买,因此找了其他类似功能的软件进行替代。记录一下,方便自己查阅。本文摘抄的,来源《替代BeyondCompare,四款免费文件代码对比工具分享》小结为了省流,下面四款软件,我只试过前面2款。下面说说...

Web网站置灰的几种方式代码

前言众所周知,一般有大事情,很多官方网站的首页就会置灰。对这个比较感兴趣,因此就查询了一下,发现设置全站置灰的方式很简单。记录一下,方便自己查阅。PS: 本文内容摘抄的,文末有原作者连接正文置灰涉及全屏置灰,另外一种是首屏置灰。下面记录一下置灰的代码。全屏置灰方式一亲测,有效。...