Как использовать TagLib# для получения информации о VideoHeader из видеофайлов

Я создаю программу для доступа к информации о различных типах файлов, до сих пор я был успешен в основном с файлами MP3, и сейчас я работаю над типами видео MPG и т. Д.

До сих пор мне удавалось получить название видео, год, длительность, жанр, высоту и ширину видео без особых усилий, и теперь я пытаюсь получить доступ к чуть более сложным аспектам из раздела VideoHeader TagLib.

Вот код, который мне удалось получить, найдя здесь что-то о 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' и ''

примечание: добавлены пробелы в окончательном нуле, так как в посте он не отображался

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.VideoHeader и имел TagLib.Riff.BitmapInfoHeader вместо. Помимо основных свойств, гарантированных TagLib.IVideoCodecдетали, предоставляемые отдельными форматами файлов, широко варьируются в зависимости от конкретного случая. Важно знать, какие типы файлов находятся в области видимости, какие функции вы хотите обнаружить, и извлекать подробности видео по мере доступности.

Другие вопросы по тегам