我试图使用Java声音(与MP3SPI和VorbisSPI一起)从WAV、MP3和OGG文件中读取音频数据,并将其存储到字节数组中,以便以后从那里播放。为了做到这一点,我使用如下代码:
public Sound loadSound(File file){
AudioInputStream baseStream = AudioSystem.getAudioInputStream(file);
AudioFormat baseFormat = baseStream.getFormat();
AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16,
baseFormat.getChannels(),
baseFormat.getChannels() * 2,
baseFormat.getSampleRate(),
false);
AudioInputStream decodedStream = AudioSystem.getAudioInputStream(decodedFormat, baseStream);
// Buffer audio data from audio stream
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int nBytesRead = 0;
while (nBytesRead != -1) {
nBytesRead = decodedStream.read(buffer, 0, buffer.length);
// Write read bytes to out stream
byteOut.write(buffer);
}
// close streams and cleanup
byte[] samples = byteOut.toByteArray();
return new Sound(samples,decodedFormat);
}
Sound类基本上是一个(Byte[]样本,AudioFormat格式)耦合。完成后,我尝试读取和播放字节数组,如下所示:
public void play(Sound sound) {
InputStream source = new ByteArrayInputStream(sound.getSamples());
AudioFormat format = sound.getFormat();
// use a short, 100ms (1/10th sec) buffer for real-time changes to the sound stream
int bufferSize = format.getFrameSize()
* Math.round(format.getSampleRate() / 10);
byte[] buffer = new byte[bufferSize];
// create a line to play to
SourceDataLine line;
try {
DataLine.Info info
= new DataLine.Info(SourceDataLine.class, format);
line = (SourceDataLine) AudioSystem.getLine(info);
line.open(format, bufferSize);
} catch (LineUnavailableException ex) {
ex.printStackTrace();
return;
}
// start the line
line.start();
// copy data to the line
try {
int numBytesRead = 0;
while (numBytesRead != -1) {
numBytesRead
= source.read(buffer, 0, buffer.length);
if (numBytesRead != -1) {
line.write(buffer, 0, numBytesRead);
}
}
} catch (IOException ex) {
ex.printStackTrace();
} catch (ArrayIndexOutOfBoundsException ex2) {
}
// wait until all data is played, then close the line
line.drain();
line.close();
}
问题出在loadsound
中,在下面的write
调用中没有使用nbytesread
返回值。返回请求的完整字节数不需要read
函数。事实上,如果解码器可以打破它的自然边界,它可能会使解码器更容易实现。这可能就是ogg解码器正在做的事情。此外,如果不使用返回值,那么very read调用不太可能返回所请求的准确大小。
byte[] buffer = new byte[4096];
int nBytesRead = 0;
while (nBytesRead != -1) {
nBytesRead = decodedStream.read(buffer, 0, buffer.length);
// Write read bytes to out stream
byteOut.write(buffer, 0, nBytesRead);
// ^^^^^^^^^^^^^
}
我在许多论坛和YouTube教程中搜索了一些简单的代码来播放声音文件(.mp3),但我找到的所有内容都不适合我。 我总是收到异常,它找不到文件或其他错误,但它总是以异常结束。 有什么我必须先配置的吗? -编辑- 我再次尝试以下代码来显示我得到的解释: 这是我的代码 添加JFXPanel后,我得到了异常:线程“main”中的异常MEDIA Exception:MEDIA _ UNAVAILABLE
我正在使用图书馆(https://github.com/Gagravarr/VorbisJava). 我想从OGG文件中获取PCM数据,并使用AudioTrack播放。使用AudioTrack对我来说是一项要求,因为我以后需要在播放时连接多个PCM数据,以获得最流畅的播放效果。 正如您在下面看到的,我试图用与文件匹配的数据设置AudioTrack,用库读取文件的内容,并将其直接写入AudioTra
我希望我的应用程序从SD卡播放. ogg音频文件,但媒体播放器和SoundPool无法为某些特定的ogg文件执行此操作。我有问题要播放的示例声音属于Telegram。下面的代码适用于其他ogg文件和mp3格式,但在播放此类声音时会给我错误。 示例文件下载链接:http://www.mediafire.com/download/fxr4z4hh7b2gv50/test.ogg 它引发以下异常:
问题内容: 我希望能够在程序中播放声音文件。我应该去哪里看? 问题答案: 我写了下面的代码,效果很好。但我认为它仅适用于格式。
我刚刚开始使用JavaFX。我知道它的基本原理。我尝试使用media和mediaplayer类播放一个声音,叫做“sound.mp3”。我正在eclipse中编程,我在src文件夹中有声音文件,与“(默认包)”相同的文件夹。下面是我的代码: 请告诉我我做错了什么。 下面是来自控制台的错误消息:
我希望能够在我的程序中播放声音文件。我应该去哪里?