我需要将flac文件拆分成多个部分。我正在使用jFLAC库来读取flac文件
FLACDecoder decoder = new FLACDecoder(inputStream);
然后我试图将父文件解码为SeekPoints
decoder.decode(seekPointFrom, seekPointTo);
我也不太明白如何正确获得秒值的搜索点。例如,我需要从0秒到第二秒到150秒的第一个搜索点。如何正确寻找点对象? Seekpoint cinstructor是
/**
* The constructor.
* @param sampleNumber The sample number of the target frame
* @param streamOffset The offset, in bytes, of the target frame with respect to beginning of the first frame
* @param frameSamples The number of samples in the target frame
*/
public SeekPoint(long sampleNumber, long streamOffset, int frameSamples) {
this.sampleNumber = sampleNumber;
this.streamOffset = streamOffset;
this.frameSamples = frameSamples;
}
解码器也有一些监听器可以监听每个读取的块操作。
@Override
public void processPCM(ByteData pcm) {
try {
outputStream.write(pcm.getData(), 0, pcm.getLen());
} catch (IOException e) {
e.printStackTrace();
}
}
写完后,我想玩新的flac文件,但我的播放器警告该文件不正确。我需要做什么才能打开我的flac文件?也许我需要在这个文件或其他东西上写一些标题?
答案 0 :(得分:0)
关于FLAC SeekPoints,不能保证会有一个与给定秒相对应的 - 在整个音频文件中可能只有几个SeekPoints。
因此,我最近使用搜索功能更新了jFLAC,以使您至少获得最接近的音频帧: https://github.com/nguillaumin/jflac/commit/585940af97157eb11b60c15cc8cb13ef3fc27ce3
关于写出新文件,解码数据将在原始PCM样本中。因此,如果要将有效的FLAC文件作为输出,则需要将其传输到FLAC编码器中。或者,您可以写出一个Wave标头并转储原始PCM样本,然后将生成的Wave文件转换为FLAC文件。