2012-03-03 1 views
2

私はビデオのビットレートを取得したい。そして私はこの目標を達成するためにQt Phononを使います。 Phonon :: MediaObjectというクラスがあり、metaData()というメソッドを提供するので、私はそのメソッドを使用しますが、結果はゼロになります。ここに私のコードは、私は疑問に思うなぜ、どのように私は、このようなフォノン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

てみましたか? – Mat

+0

地図のサイズは0です...なぜか分かりません。 – Himiko

答えて

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); 
} 
1

0であるとQTでビットレートなどのメタデータを取得することができ、MediaObjectが入り、 LoadingState。その時点で、メタデータはまだ使用できない可能性があります。

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

+0

まずはありがとう、それは私が思う問題です。ビデオを再生せずにメタデータを取得したいのであれば、ウィジェットに表示させずに、どうすればいいのですか? Qtを使用してメタデータを取得するにはどうすればよいですか?ありがとうございます。 – Himiko

関連する問題