c++ - 如何使用TagLib-C++从MP3文件读取XingHeaders,VBRIHeaders和sampleCount

标签 c++ qt audio taglib

有没有办法确定音频文件的比特率是否可变,并通过LibTag提取sampleCount()?我需要找出原因,因为Qt QMediaPlayer类错误地计算了具有可变比特率的音频文件的持续时间,而纠正的唯一方法是发现音频是否具有可变比特率,并将长度除以sampleCount()持续时间。

由于文档TagLib有点混乱,我设法只创建了fileref

void MainWindow::playerOnMediaStatusChanged(QMediaPlayer::MediaStatus status)
{
if (status == QMediaPlayer::BufferedMedia) {     
QString mediafile = playlist->currentMedia().canonicalUrl().toString();
TagLib::FileRef fr(reinterpret_cast<constwchar_t*>(mediafile.utf16()),true);
        //…
    }
}

但是我不知道如何发现音频是否具有可变的比特率及其sampleCount()

是的,我知道这是topic,但是与夏普语言有关

你能帮助我吗?

提前致谢

最佳答案

您需要使用TagLib::MPEG::File才能访问XingHeader。这是一个例子:

static void printXingHeader(const char *fileName)
{
    TagLib::FileRef ref(fileName);
    TagLib::MPEG::File *file = dynamic_cast<TagLib::MPEG::File *>(ref.file());

    if(!file)
        return;

    TagLib::MPEG::Properties *properties = file->audioProperties();
    const TagLib::MPEG::XingHeader *xingHeader = properties->xingHeader();

    if(!xingHeader)
        return;

    std::cout << "total frames: " << xingHeader->totalFrames()
              << " total size: " << xingHeader->totalSize()
              << std::endl;

}

关于c++ - 如何使用TagLib-C++从MP3文件读取XingHeaders,VBRIHeaders和sampleCount,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39592116/

相关文章:

c++ - OpenMP 从并行 for 循环调用并行函数

c++ - 在工作线程中使用 QT MainWindow

qt - 如何在 QSlider 中直接跳转而不损害性能

Android 录制的语音变形或操纵为有趣的声音

c++ - 在 O(1) 复杂度中连接 C++ 中的两个列表

c++ - 为什么有些共享库以 d.so 而不是 .so 结尾?

c++ - 需要数学编辑器来编写数学公式

javascript - 使用JavaScript和HTML5音频存储和播放本地文件

ios - wav 到 aac 转换 interruptListener 不在 ios 中调用

c++ - 如何解决类构造函数中的 "redefinition of default parameter"