2

ビデオのビットレートを取得したい。そして、この目標を達成するために 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 です

4

2 に答える 2

2

私はこれを自分で理解しました。

  1. 動画ファイルのメタデータにはビットレートが含まれていません。再生に影響を与えないメディアに関する追加情報のみが含まれます。したがって、たとえ Phonon::MediaObject::metaData() がビデオをロードせずに機能したとしても、役に立ちません。

  2. ビットレートを取得するために、ffmpegライブラリの一部であるlibformatを使用することになりました。これがコードです。

これをコピーして貼り付ければ、うまくいくはずです。

ここから 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);
}
于 2012-10-17T16:14:07.387 に答える
1

データ ソースを設定すると、 がMediaObjectに入りますLoadingState。その時点では、メタデータがまだ利用できない可能性があります。

metaDataChangedオブジェクトは、メタデータの準備ができるとシグナルを発します。そのシグナルに反応し、メタデータが発行された後にのみメタデータへのアクセスを試みる必要があります。

于 2012-03-03T09:05:38.910 に答える