1

私はさまざまな種類のファイルの情報にアクセスするプログラムを作成しています。これまでのところ、主にMP3ファイルで成功しており、現在はビデオMPGなどの種類に取り組んでいます。

これまでのところ、ビデオのタイトル、年、長さ、ジャンル、ビデオの高さと幅を少しの労力で取得できましたが、今はTagLibのVideoHeaderセクションから少し難しい側面にアクセスしようとしています。

これは、ここでAudioHeadersに関する何かを見つけて取得したコードですが、機能しませんでした。

TagLib.File f = TagLib.Mpeg.File.Create(GetMPG.FileName);

foreach(ICodec codec in f.Properties.Codecs){
  TagLib.Mpeg.VideoHeader G = (TagLib.Mpeg.VideoHeader) codec;
  MPGbps.Text = G.VideoFrameRate.ToString();
}

どこが間違っているのですか?

私の新しい現在のコード:

TagLib.File f = TagLib.File.Create(GetMPG.FileName);
foreach(ICodec codec in f.Properties.Codecs){
  TagLib.Mpeg.VideoHeader G = (TagLib.Mpeg.VideoHeader) codec;
  if (G != null)
    {
      MPGbps.Text = G.VideoFrameRate.ToString();
    }
}

これはエラーで終了しました:

エラー2演算子'!='は、タイプ'TagLib.Mpeg.VideoHeader'および'<null>'のオペランドには適用できません。

注:それ以外の場合は投稿に表示されなかったため、最後のnullにスペースを追加しました

4

1 に答える 1

3

ビデオファイルには、オーディオとビデオの複数のコーデックがあります。コードで何が起こっているのかというと、ループの1回の反復で、コーデックはVideoHeaderではなく、Gが正しく設定されていないことを意味します。これが例外をトリガーするのか、Gが空のVideoHeaderに設定されているのかはわかりません。

以下のコードが機能するはずです。

TagLib.File f = TagLib.File.Create(GetMPG.FileName);

foreach(ICodec codec in f.Properties.Codecs){
  if(codec is TagLib.Mpeg.VideoHeader) {
    TagLib.Mpeg.VideoHeader G = (TagLib.Mpeg.VideoHeader) codec;
    MPGbps.Text = G.VideoFrameRate.ToString();
  }
}

TagLib.File.Createまた、代わりに使用する必要があります。これは静的ファクトリメソッドです。

アップデート

間違ったタイプとしてキャストされていた上記の最初codecの問題に加えて、ファイルがMPEGではなく、実際にはが含まれておらずTagLib.Mpeg.VideoHeaderTagLib.Riff.BitmapInfoHeader代わりに含まれているという問題がありました。によって保証される基本的なプロパティを超えて、TagLib.IVideoCodec個々のファイル形式によって提供される詳細は、ケースバイケースで大きく異なります。どのファイルタイプがスコープ内にあるか、どの機能を検出するかを知り、利用可能な場合はビデオの詳細を抽出することが重要です。

于 2012-07-02T15:16:38.817 に答える