Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Android AudioTrack播放WAV文件示例?_Android_Audio_Wav_Pcm - Fatal编程技术网

如何通过Android AudioTrack播放WAV文件示例?

如何通过Android AudioTrack播放WAV文件示例?,android,audio,wav,pcm,Android,Audio,Wav,Pcm,我在WAV文件中有声音效果,但我想将它们连接起来,并通过Android的AudioTrack播放它们,所以我试图找出如何将WAV样本正确编码到16位PCM中 根据这个有用的答案,我可以通过音轨播放白噪声 然而,由于某些原因,当我把它们输入到AudioTrack时,我似乎根本无法得到我的好音效来产生任何声音 我去掉了44个字符的WAV头,然后将每个小的字节对处理成一个有符号的短字符,如下所示: byte[] arr = baos.toByteArray();

我在WAV文件中有声音效果,但我想将它们连接起来,并通过Android的AudioTrack播放它们,所以我试图找出如何将WAV样本正确编码到16位PCM中

根据这个有用的答案,我可以通过音轨播放白噪声

然而,由于某些原因,当我把它们输入到AudioTrack时,我似乎根本无法得到我的好音效来产生任何声音

我去掉了44个字符的WAV头,然后将每个小的字节对处理成一个有符号的短字符,如下所示:

            byte[] arr = baos.toByteArray();
            short[] shortArr = new short[arr.length/2]; // Half the length
            for (int i=0; i<arr.length; i+=2){ // Need to go 2 at a time because we're converting
                                            // 2 little-endian bytes into one short
                shortArr[i/2] = (short)(arr[i] + (arr[i+1]*256));
            }
我是这样打电话的:

            final short[] hiclick = getWavDataBytesAsPCM16(getResources().openRawResourceFd(R.raw.created_hi_click_188_samples));

            m_audioTrack.write(hiclick, 0, hiclick.length);
我没有得到预期的音效,反而一无所获

从WAV文件中提取样本并将其提供给AudioTrack的正确方法是什么


非常感谢你的帮助

好吧,实际上我的编码似乎还可以,因为我发现一旦我开始循环声音,它们就开始播放得很好了。我认为这与播放前必须填满音轨的缓冲区有关,而与编码无关。我将把这段代码留作一个编码正常的例子,也许,除非有人认为删除它更好。
            final short[] hiclick = getWavDataBytesAsPCM16(getResources().openRawResourceFd(R.raw.created_hi_click_188_samples));

            m_audioTrack.write(hiclick, 0, hiclick.length);