Javasound不是通过JAAD打的.m4a文件(一个SPI)(Javasound not pla

2019-09-16 20:30发布

我试图打一些的.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.");

直到字节读取== -1

对于这个特定的文件,我发现了的AudioFormat baseformat是这样的:每个样品,单声道,未知帧大小,125.0帧/秒的MPEG1L1 48000.0赫兹,未知的比特。

则的AudioFormat decodedFormat是这样的:PCM_SIGNED 48000.0赫兹,16位,单声道,2个字节/帧,小端

我使用这些代码行进行转换:

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

难道我做错了什么吗? 我不完全理解的是第二行确实,但它已经工作得很好解码使用MP3文件MP3SPI 。

我真的很感激这里的任何指导。

Answer 1:

那是你的文件只显示长度1024个+ 512字节的问题? (这将是非常短的音频文件!)或者是关于文件格式的问题? 我见过一些人碰到一个问题,当他们尝试解码恰好是与WAV文件格式的Java语言支持的范围不兼容的.wav文件的MP3。

我假设的“二线”你指的是一个新的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自己,所以,如果这个职位是不是非常有帮助,我可以理解。



文章来源: Javasound not playing .m4a files through JAAD (an SPI)