gpt4 book ai didi

android - 音轨:为原始pcm 16bit WAV文件播放噪音

转载 作者:行者123 更新时间:2023-12-03 01:38:24 30 4
gpt4 key购买 nike

我正在尝试播放大小为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

我正在学习如何使用音轨。

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

解决方案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");
}

我是简短样本和字节样本的新手。我试图理解,但这并不容易。

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

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

最佳答案

short类型的默认大小为two bytes。您也可以看看this documentation

音轨具有建议的缓冲区大小和采样率,可以使用this answer中此处建议的方法找到。请看一看。

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

AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding) 

在使用 short数组的实现中,缓冲区大小加倍,因此在播放音频时会产生噪音。我建议,您可以考虑通过使用 short在实现中将缓冲区大小除以二来更改缓冲区大小。
short[] audiodata = new short[(int) bufferSize / 2];

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

关于android - 音轨:为原始pcm 16bit WAV文件播放噪音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49838804/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com