Как я могу получить метаданные видео, используя Qt phonon? - PullRequest
2 голосов
/ 03 марта 2012

Я хочу получить битрейт видео. И я использую Qt Phonon для достижения этой цели. Поскольку существует класс с именем Phonon :: MediaObject, который предоставляет метод metaData (), я использую этот метод, но результат показывает ноль. Вот мой код, мне интересно, почему и как я могу получить метаданные, такие как битрейт в qt с Phonon

    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 ]

2 голосов
/ 17 октября 2012

Я только что понял это.

  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=%s\n", tag->key, tag->value);
  }

  // Close the video file
  av_close_input_file(pFormatCtx);
}
1 голос
/ 03 марта 2012

Когда вы устанавливаете источник данных, MediaObject вводит LoadingState.В этот момент метаданные могут быть недоступны.

Объект выдает сигнал metaDataChanged, когда метаданные готовыВы должны реагировать на этот сигнал и пытаться получить доступ к метаданным только после того, как они были отправлены.

...