JavaSound不能通过JAAD(一种SPI)播放.m4a文件

4

我想播放一些.m4a文件,我了解JAAD仅支持解码AAC,但是有些歌曲我可以从中获取sourceDataLine,然后当我尝试播放它们时,出现以下行为:

我们读取:1024字节。

我们读取:512字节。

我们读取:-1字节。

运行此代码时:

// read from the input
bytesRead = audioInputStream.read(tempBuffer, 0, tempBuffer.length);

System.out.println("We read: " + bytesRead + " bytes.");

直到bytesRead == -1

对于这个特定的文件,我得到了AudioFormat baseformat如下: MPEG1L1 48000.0 Hz,未知位数每个样本,单声道,未知帧大小,125.0 帧/秒。

然后将AudioFormat decodedFormat设置为如下: PCM_SIGNED 48000.0 Hz,16 bit,单声道,2 字节/帧,little-endian。

我使用以下代码进行转换:

AudioFormat baseFormat = audioInputStream.getFormat();
AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
                baseFormat.getSampleRate(),
                16,
                baseFormat.getChannels(),
                baseFormat.getChannels() * 2,
                baseFormat.getSampleRate(),
                false);

这里我有做错什么吗?我不太理解第二行的作用,但是使用MP3SPI解码MP3文件一直都很好用。

非常感谢您的指导。

1个回答

2
问题是您的文件只显示1024 + 512字节的长度吗?(这对于音频文件来说非常短!)还是关于文件格式的问题?我见过一些人在尝试解码不兼容Java支持的wav文件格式范围的mp3或.wav文件时遇到问题。
我假设您所指的“第二行”是创建新的FileFormat,是吗?那只是根据从输入流解码的格式创建一个新格式的行为。您可能会在播放中使用新格式。
新格式的目的可能是确保数据以与您的系统兼容的格式播放。它说: (1)无论输入的编码格式如何,都将使用有符号PCM。 (2)将使用相同的采样率(我的系统仅支持44100,很惊讶看到您的系统允许48000)。 (3)每个样本的新位数为16位,而不管原始文件中使用的位数。 (4)将使用与原始文件相同的通道数。 (5)通道数* 2将被视为帧大小(考虑到每个样本16位,这是有意义的) (6)相同的帧速率 (7)无论输入文件顺序如何,字节顺序都将是小端。
您可以在此链接的“构造函数详细信息”下查看此构造函数的API(一些良好的文档):http://docs.oracle.com/javase/6/docs/api/javax/sound/sampled/AudioFormat.html 如果您需要转换一些音频数据以允许播放,那么事情就会变得更加复杂。您是否阅读过有关音频文件和格式转换的教程?http://docs.oracle.com/javase/tutorial/sound/converters.html 我希望这至少能部分地帮到您。我自己没有使用过JAAD,所以如果这篇文章没有什么帮助,我可以理解。

我很快就会浏览所有这些信息,现在对我来说是期末考试周末,事情很忙碌。不过还是谢谢你提供的信息!如果最终能解决我的问题,我会回报的。 - Nico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接