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

视频文件有多个编解码器,一个音频和一个视频。您的代码发生的情况是,在循环的一次迭代中,编解码器不是 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.VideoHeadera 而是有 a TagLib.Riff.BitmapInfoHeader。除了由 保证的基本属性之外TagLib.IVideoCodec,各个文件格式提供的详细信息因具体情况而异。了解范围内的文件类型、要检测的功能以及提取可用的视频详细信息非常重要。

于 2012-07-02T15:16:38.817 回答