gpt4 book ai didi

Java - 在 X 位置开始音频播放

转载 作者:行者123 更新时间:2023-11-29 04:15:31 25 4
gpt4 key购买 nike

编辑: 我正在使用 .wav 文件

我正在尝试弄清楚如何在特定位置开始播放音频(例如:进入音频文件 10 秒而不是开始播放)。阅读 SourceDataLine 的文档让我相信这可以通过在以下过程中使用 offset 来实现:

line.write(byte[] b, int offset, int length)

但每次我尝试除 0(我认为是默认值)以外的任何值时,我都会得到 java.lang.IndexOutOfBoundsException,它可能还没有读取 x 字节位置,所以不能写入 x 字节位置?我不确定,只是挠着头。

我认为这是一个足够常见的请求,但似乎无法在网上找到与此相关的任何内容,只能暂停和恢复音频。我可能没有正确搜索。

以防万一,以下是我目前制作音频的方式:

     AudioInputStream stream = AudioSystem.getAudioInputStream("...file...");
AudioFormat format = stream.getFormat();
SourceDataLine.Info info = new DataLine.Info(SourceDataLine.class, format,((int)stream.getFrameLength()*format.getFrameSize()));
SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info);
int bufferSize = line.getBufferSize();
byte inBuffer[] = new byte[bufferSize];
byte outBuffer[] = new byte[bufferSize];
int numRead, numWritten;

do {
numRead = audioStream.read(inBuffer, 0, bufferSize);
if(numRead <= 0) {
myAudio.flushStream();
} else {
myAudio.writeBytesToStream(inBuffer, numRead);
}
do {
numWritten = myAudio.readBytesFromStream(outBuffer, bufferSize);
if(numWritten > 0) {
line.write(outBuffer, 0, numWritten);
}
} while(numWritten > 0);
} while(numRead > 0);

最佳答案

您遇到的问题可能源于您调整偏移量 而不调整长度。如果您的数组长 10 个字节,并且您从偏移量 5 而不是 0 开始读取 10 个字节,那么您读取的是超出其末尾的 5 个字节。

我建议先使用 skip(long) 跳过适当数量的字节在 AudioInputStream 上然后写入行。

AudioInputStream stream = AudioSystem.getAudioInputStream("...file...");
AudioFormat format = stream.getFormat();
// find out how many bytes you have to skip, this depends on bytes per frame (a.k.a. frameSize)
int secondsToSkip = 10;
long bytesToSkip = format.getFrameSize() * ((int)format.getFrameRate()) * secondsToSkip;
// now skip until the correct number of bytes have been skipped
int justSkipped = 0;
while (bytesToSkip > 0 && (justSkipped = stream.skip(bytesToSkip)) > 0) {
bytesToSkip -= justSkipped;
}
// then proceed with writing to your line like you have done before
[...]

请注意,这仅在音频文件未压缩时有效。如果您正在处理类似 .mp3 的内容,您首先必须将流转换为 PCM (参见 https://stackoverflow.com/a/41850901/942774)

关于Java - 在 X 位置开始音频播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52595473/

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