如何在不播放文件的情况下使用 Juce "C++." 读取音频文件的长度

How to read the length of audio files using Juce "C++." Without playing the file

我正在尝试在应用程序的播放列表组件中显示音频文件的长度。 我以前没有使用过 Juce 或 C++,我无法从 Juce 文档中理解如何做到这一点。 我想制作一个函数,该函数采用音频文件的 URL 和 returns 音频的长度(以秒为单位),而不播放该文件或对该文件执行任何其他操作。 我已经尝试了很多东西,但都没有用,这是我最后尝试的东西:

void PlaylistComponent::trackStats(URL audioURL)
{
    AudioFormatManager formatManager;
    std::unique_ptr<AudioFormatReaderSource> readerSource;
    AudioTransportSource transportSource;

    auto* reader = formatManager.createReaderFor(audioURL.createInputStream(false));
    if (reader != nullptr) 
    {
        std::unique_ptr<AudioFormatReaderSource> newSource(new AudioFormatReaderSource(reader, true));
        transportSource.setSource(newSource.get(), 0, nullptr, reader->sampleRate);
        readerSource.reset(newSource.release());

        DBG("PlaylistComponent::trackStats(URL audioURL): " << transportSource.getLengthInSeconds());
    }
    else
    {
        DBG("Something went wrong loading the file");
    }
}

这是 PlaylistComponent 头文件:

class PlaylistComponent  : public juce::Component, 
                           public juce::TableListBoxModel,
                           public Button::Listener,
                           public FileDragAndDropTarget
{
  ...
}

juce::AudioFormatReaderSource 有一个名为 getTotalLength() 的方法,其中 returns 样本总数。 将其除以文件的采样率,得到以秒为单位的总长度。像这样:

if (auto* reader = audioFormatReaderSource->getAudioFormatReader())
    double lengthInSeconds = static_cast<double> (audioFormatReaderSource->getTotalLength()) / reader->sampleRate;