如何使用Qt声子获取视频元数据?

时间:2012-03-03 08:36:39

标签: qt video metadata phonon

我想获得视频的比特率。我使用Qt Phonon来实现这一目标。 由于有一个名为Phonon :: MediaObject的类并提供了一个名为metaData()的方法,我使用该方法但结果显示为零。这是我的代码,我想知道为什么以及如何使用Phonon获取qt中的比特率等元数据

    QString source="E:\\sh.mp4";
    Phonon::MediaObject media;
    media.setCurrentSource(Phonon::MediaSource(source));
    QMap <QString, QString> metaData = media.metaData();
    int trackBitrate = metaData.value("bitrate").toInt();
    qDebug()<<trackBitrate;

结果始终为0

2 个答案:

答案 0 :(得分:2)

我自己就是这么想的。

  1. 视频文件中的元数据不包含比特率。它仅包含有关对播放没有任何影响的媒体的额外信息。所以即使Phonon :: MediaObject :: metaData()在没有加载视频的情况下工作,它也无济于事。

  2. 我最终使用libformat,ffmpeg库的一部分来获取比特率。这是代码。

  3. 如果你复制并粘贴它,它应该可以工作。

    在此处下载FFMpeg:http://dranger.com/ffmpeg/tutorial01.html 第一篇教程将告诉您如何链接:http://dranger.com/ffmpeg/tutorial01.html

    #include <QString>
    #include <QMultiMap>
    
    #include <stdio.h>
    
    #include <libavformat/avformat.h>
    #include <libavutil/dict.h>
    
    void processMedia(const char* mediaFile)
    {
      AVFormatContext *pFormatCtx = NULL;
      AVDictionaryEntry *tag = NULL;
    
      // Register all formats and codecs
      av_register_all();
    
      // Open video file
      if(avformat_open_input(&pFormatCtx, mediaFile, NULL, NULL)!=0)
        return;
    
      // Retrieve stream information
      if(av_find_stream_info(pFormatCtx)<0)
        return;
    
      //Get Bitrate
      float bitRate = pFormatCtx->bit_rate;
    
      //Get Meta
      QMultiMap<QString, QString> metaData;
      while ((tag = av_dict_get(pFormatCtx->metadata, "", tag,
              AV_DICT_IGNORE_SUFFIX)))
      {
        QString keyString(tag->key);
        QString valueString(tag->value);
        metaData.insert(keyString, valueString);
        printf("%s=%s\n", tag->key, tag->value);
      }
    
      // Close the video file
      av_close_input_file(pFormatCtx);
    }
    

答案 1 :(得分:1)

设置数据源后,MediaObject会输入LoadingState。此时,元数据可能尚未可用。

当元数据准备好时,对象会发出metaDataChanged信号。您应该对该信号做出反应,并且只有在元数据发出后才尝试访问它。