Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.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 音轨:为原始pcm 16位wav文件播放噪音_Android_Audio_Pcm - Fatal编程技术网

Android 音轨:为原始pcm 16位wav文件播放噪音

Android 音轨:为原始pcm 16位wav文件播放噪音,android,audio,pcm,Android,Audio,Pcm,我正在尝试播放大小为230mb和20分钟的wav文件,其属性如下: ffmpeg -i 1.wav Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s 我正在学习如何使用audiotrack 我找到了两种使用audiotrack播放此音频播放的解决方案 解决方案1:以下播放音频 int frequency = 44100; int channelConfiguratio

我正在尝试播放大小为230mb和20分钟的wav文件,其属性如下:

ffmpeg -i 1.wav

Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
我正在学习如何使用audiotrack

我找到了两种使用audiotrack播放此音频播放的解决方案

解决方案1:以下播放音频

int frequency = 44100;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_STEREO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

int bufferSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration,audioEncoding);

AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency,
        channelConfiguration, audioEncoding, bufferSize,
        AudioTrack.MODE_STREAM);

int count = 0;
byte[] data = new byte[bufferSize];
try{
    FileInputStream fileInputStream = new FileInputStream(listMusicFiles.get(0).listmusicfiles_fullfilepath);
    DataInputStream dataInputStream = new DataInputStream(fileInputStream);
    audioTrack.play();

    while((count = dataInputStream.read(data, 0, bufferSize)) > -1){
        audioTrack.write(data, 0, count);
    }

    audioTrack.stop();
    audioTrack.release();
    dataInputStream.close();
    fileInputStream.close();
}
catch (FileNotFoundException e){
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
第二种解决方案:播放噪音

int frequency = 44100;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_STEREO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

int bufferSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration,audioEncoding);

short[] audiodata = new short[bufferSize];

try {

    DataInputStream dis = new DataInputStream(
            new BufferedInputStream(new FileInputStream(
                    listMusicFiles.get(0).listmusicfiles_fullfilepath)));

    AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency,
            channelConfiguration, audioEncoding, bufferSize,
            AudioTrack.MODE_STREAM);

    audioTrack.play();

    while (dis.available() > 0) {
        int i = 0;
        while (dis.available() > 0 && i < audiodata.length) {
            audiodata[i] = dis.readShort();
            i++;
        }
        audioTrack.write(audiodata, 0, audiodata.length);
    }

    dis.close();
} catch (Throwable t) {
    Log.e("AudioTrack", "Playback Failed");
}
int频率=44100;
int channelConfiguration=AudioFormat.CHANNEL\u CONFIGURATION\u立体声;
int audioEncoding=AudioFormat.ENCODING_PCM_16位;
int bufferSize=AudioTrack.getMinBufferSize(频率、频道配置、音频编码);
short[]audiodata=新的short[bufferSize];
试一试{
DataInputStream dis=新的DataInputStream(
新建BufferedInputStream(新建FileInputStream(
获取(0.listMusicFiles_fullfilepath));
AudioTrack AudioTrack=新的AudioTrack(AudioManager.STREAM_音乐、频率、,
信道配置、音频编码、缓冲区大小、,
音频跟踪模式(音频流);
音轨播放();
而(dis.available()>0){
int i=0;
while(dis.available()>0&&i
我不熟悉短样本和字节样本。我试着去理解,但没那么容易

我可以理解第一种解决方案是使用字节样本,第二种解决方案是使用短样本


那么,为什么第二个解决方案不起作用。

一个
short
类型的默认大小是。你也可以看看

音频曲目具有推荐的缓冲区大小和采样率,可以使用中建议的方法找到。请看一看

但是,使用建议的采样率(在您的情况下为44100 Hz)和使用以下代码段获得的建议缓冲区大小播放音频非常重要

AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding) 
在使用
short
阵列的实现中,缓冲区大小增加了一倍,因此在播放音频时会产生噪音。我建议,您可以考虑通过使用“代码>短< /COD> >在您的实现中将大小除以两个来改变缓冲区大小。
short[] audiodata = new short[(int) bufferSize / 2];

希望你已经理解了这个问题

现在缓冲区大小是原来的两倍。我尝试了buffersize/2,但噪声仍然存在。请尝试使用
buffersize*2
(即,将缓冲区大小加倍)好吗?简而言之,我是指本教程。但是,在中,建议增加缓冲区大小。请查看我共享的链接。