【问题标题】:How to get Duration of audio and video files in Qt without using QMediaPlayer如何在不使用 QMediaPlayer 的情况下在 Qt 中获取音频和视频文件的持续时间
【发布时间】:2012-11-13 17:59:02
【问题描述】:

我一直在开发一个应用程序,我可以使用 QDirIterator 遍历系统驱动器并查找音频/视频文件,使用 QStandardItemModel 获取详细信息并将其显示在QTree 视图。我已成功显示文件名、类型、大小、修改日期,但 DURATION 是我无法做到的。

代码如下:

// Displays Files in Detail View on Clicking Drive
void DetailView::on_DriveView_clicked(const QModelIndex &index)
{
int m_count_row = 0;

QStandardItemModel *model = new QStandardItemModel(0,0);
QString sPath = pSystemModel->fileInfo(index).absoluteFilePath();
pSystemTreeViewModel->setRootPath(sPath);
ui->DriveListView->setRootIndex(pSystemTreeViewModel->index(sPath));

pSystemModel->setRootPath(QDir::currentPath());
pSystemModel->setFilter(QDir::NoDotAndDotDot | QDir::AllDirs );
pSystemTreeViewModel->setFilter( QDir::Files | QDir::NoDotAndDotDot );

QStringList m_list;
QDirIterator dirIt(sPath,QDirIterator::Subdirectories);

while (dirIt.hasNext())
{
    dirIt.next();
    if (QFileInfo(dirIt.filePath()).isFile())
    {
        if (QFileInfo(dirIt.filePath()).suffix() == "mp3" ||(QFileInfo(dirIt.filePath()).suffix() == "mts" ) ||(QFileInfo(dirIt.filePath()).suffix() == "m2ts" ))
        {
            m_list << dirIt.filePath();

            QModelIndex m_index = model->index(m_count_row, 0, QModelIndex());
            model->setHeaderData( 0, Qt::Horizontal, "Name" );
            model->setHeaderData( 1, Qt::Horizontal, "Type" );
            model->setHeaderData( 2, Qt::Horizontal, "Size" );
            model->setHeaderData( 3, Qt::Horizontal, "Date Modified" );

            model->setData( m_index, dirIt.fileName(), Qt::DecorationRole );
            QStandardItem *itemName = new QStandardItem(dirIt.fileName());
            model->setItem(m_count_row, 0, itemName);

            model->setData( m_index, dirIt.fileInfo().suffix(), Qt::DecorationRole );
            QStandardItem *itemExtention = new QStandardItem( dirIt.fileInfo().suffix());
            model->setItem(m_count_row, 1, itemExtention);

            model->setData( m_index, dirIt.fileInfo().size(), Qt::DecorationRole );
            float fFileSize = dirIt.fileInfo().size();
            float fFileKB = fFileSize / 1024; //kilobyte
            float fFileMB = fFileKB / 1024; //megabyte
            float fFinalSize = ceilf(fFileMB * 100) / 100;

            QString sSizeValue = QString::number(fFinalSize);
            QStandardItem *itemSize = new QStandardItem(sSizeValue + " MB");
            model->setItem(m_count_row, 2, itemSize);

            model->setData( m_index, dirIt.fileInfo().lastModified(), Qt::DecorationRole );
            QDateTime m_time = dirIt.fileInfo().lastModified();
            QString sTime = m_time.toString("dd/MM/yyyy hh:mm:ss");
            QStandardItem *itemDate = new QStandardItem(sTime);
            model->setItem(m_count_row, 3, itemDate);

            ui->DriveListView->setModel(model);
            ui->DriveListView->setRootIsDecorated(false);
            m_count_row++;
        }
    }

    pSystemTreeViewModel->setNameFilterDisables(false);
}
}

我不确定是否可以使用上述方式获得持续时间,因为我找不到任何此类属性。他们还有其他方法吗?我不想使用 QMediaPlayer。任何其他替代解决方案可以帮助我用 Duration 更新我的上述代码???

【问题讨论】:

    标签: c++ qt qt4 duration qtimer


    【解决方案1】:

    使用 Qt

    你可以尝试探索Qt的Phonon Module

    我认为 Phonon 的 MediaObject 类中的 this function 可能有助于获得您想要实现的目标。

    附:请阅读写在该函数末尾的警告,以避免得到错误的结果。


    编辑 1: 不使用 Qt

    阅读 TagLib 库here。检查他们提到的关于获取文件长度的this 函数。它也在 LGPL 下。

    【讨论】:

    • 感谢您的回复。它说:Get the total time (in milliseconds) of the file currently being played. 但我不想玩。我只想迭代驱动器,搜索文件并在 TreeView 中显示持续时间,就像我在上面给定代码中显示其他属性的方式一样。
    • 哇,这太好了 :) 所以使用 TagLib 我可以使用它的成员函数,比如长度,并在上面给定的 Qt 代码中获取文件的持续时间???
    • @OwaisNabiWani TagLib 用于提取文件的元数据,支持多种音频格式。个人没用过,听说很好用。试试吧,让我们都知道它是否有好处:-)
    • 是啊兄弟,我试试看能不能搞定。会给你一个评论:)
    猜你喜欢
    • 2021-04-25
    • 2016-04-23
    • 2019-02-03
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2013-03-01
    • 2013-10-27
    • 2015-10-13
    相关资源
    最近更新 更多