如何在不播放文件的情况下使用 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;
我正在尝试在应用程序的播放列表组件中显示音频文件的长度。 我以前没有使用过 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;