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



我想获得视频的比特率。我使用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

这是我自己想出来的。

  1. 视频文件中的元数据不包含比特率。它只包含有关媒体的额外信息,这些信息对播放没有任何影响。因此,即使Phonon::MediaObject::metaData()在没有加载视频的情况下工作,它也不会对您有所帮助。

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

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

在此处下载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=%sn", tag->key, tag->value);
  }
  // Close the video file
  av_close_input_file(pFormatCtx);
}
设置数据源时,MediaObject将进入LoadingState。到那时,元数据可能还不可用。

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

相关内容

  • 没有找到相关文章

最新更新