3

我需要将 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 文件?也许我需要向这个文件或其他东西写一些标题?

4

1 回答 1

0

关于 FLAC SeekPoints,不能保证会有一个对应于给定秒的 SeekPoints - 整个音频文件中可能只有几个 SeekPoints。

因此,我最近使用搜索功能更新了 jFLAC,以让您至少找到最近的音频帧: https ://github.com/nguillaumin/jflac/commit/585940af97157eb11b60c15cc8cb13ef3fc27ce3

关于写出一个新文件,解码的数据将是原始 PCM 样本。因此,如果您想要一个有效的 FLAC 文件作为输出,则需要将其通过管道传输到 FLAC 编码器中。或者,您可以写出 Wave 标头并转储原始 PCM 样本,然后将生成的 Wave 文件转换为 FLAC 文件。

于 2015-10-26T22:20:08.313 回答