Узнайте скорость передачи данных фильма в Windows Server 2008

Я пытаюсь узнать скорость передачи данных для файла фильма (mp4 или wmv) в Windows Server 2008. Я пытался использовать Windows API Code Pack, а также COM-объекты Shell32 в C#. Это отлично работало в Windows 7, но не дает мне никакой информации в Windows Server 2008.

В Проводнике Windows 7 я могу добавить столбец в список сведений об элементах в папке, чтобы увидеть свойства файла, такие как скорость передачи данных, скорость передачи данных и продолжительность. При попытке сделать это в Windows Server 2008 в этих столбцах ничего не отображается. Если я запущу свою программу с помощью Windows API Code Pack, чтобы узнать скорость передачи файлов на компьютере с Windows 7, и направлю ее для анализа файлов на компьютере с Windows Server 2008 по сети, то я смогу получить свойство скорости передачи данных, но поиск этих свойств по сети занимает намного больше времени, чем при локальном.

Пожалуйста, дайте мне знать, есть ли способ узнать скорость передачи данных с помощью C# в Windows Server 2008! Спасибо!


person Misha    schedule 24.09.2012    source источник


Ответы (3)


Вы можете попробовать с библиотекой ffmpeg. Для этого у вас есть несколько оболочек С#. Ознакомьтесь с этим публикацией SO.

person LavaScornedOven    schedule 01.10.2012
comment
Большое спасибо, я попробовал это, и по большей части это сработало, но для некоторых файлов фильмов были получены неправильные значения битрейта. - person Misha; 03.10.2012
comment
Вы всегда можете сообщить об ошибке на ffmpeg.org, но кто знает, будет ли она исправлена ​​и когда. Ну... По крайней мере, ты можешь попробовать. :) - person LavaScornedOven; 03.10.2012
comment
Я думаю, что это может быть проблема с оболочкой, потому что все, что делает обертка, это «ffmpeg -i ‹filename›», а затем анализирует вывод, чтобы найти битрейт ... в списке из 500 файлов, где 250 из них 1632 КБ/с, а остальные 250 — 850 КБ/с, оболочка сообщает, что более 400 меньше 1000 КБ/с… поэтому мне нужно отладить вывод для 500 файлов, просто нужно найти еще немного времени, чтобы сделать это :) спасибо за помощь! - person Misha; 03.10.2012
comment
Конечно, рад быть полезным. Если вы согласны, было бы здорово, если бы вы могли принять мой ответ и поделиться некоторыми достоинствами. (Я собираю очки для своих наград.) - person LavaScornedOven; 03.10.2012
comment
FFMpeg на самом деле давал мне неточные результаты... при использовании решения MediaInfo я получил правильные результаты скорости передачи данных, но для получения этих значений потребовалась целая вечность.. - person Misha; 05.10.2012

Медиа информация

1: Создайте проект С#

2: Включить в проект этот (нажмите на меня) файл

3: Создайте хороший класс-оболочку для извлечения значений:

вот один для вас;

public class MediaQuery
{
    public Dictionary<string, string> QueryFile(string filePath)
    {
        MediaInfo mediaInfo = new MediaInfo();
        string version = mediaInfo.Option("Info_Version");
        if (!File.Exists(filePath))
            throw new Exception("File Not Found");
        try
        {
            mediaInfo.Option("Inform", "XML");
            mediaInfo.Option("Complete", "1");
            mediaInfo.Open(filePath);

            string xml = mediaInfo.Inform();
            IEnumerable<XElement> el = XElement.Parse(xml, LoadOptions.None).Elements();
            XElement general = el.FirstOrDefault(e => e.Attribute("type").Value == "General");
            XElement video = el.FirstOrDefault(e => e.Attribute("type").Value == "Video");
            XElement audio = el.FirstOrDefault(e => e.Attribute("type").Value == "Audio");
            Dictionary<string, string> values = new Dictionary<string, string>();
            values = GetValues(general, "General");
            values = GetValues(video, "Video", values);
            values = GetValues(audio, "Audio", values);
            return values;
        }
        catch (Exception ex)
        {
            throw new Exception("Problem Querying File", ex);
        }
    }

    private Dictionary<string, string> GetValues(XElement xElement, string rootType)
    {
        Dictionary<string, string> values = new Dictionary<string, string>();
        return GetValues(xElement, rootType, values);
    }
    private Dictionary<string, string> GetValues(XElement xElement, string rootType, Dictionary<string, string> values)
    {
        foreach (XElement element in xElement.Elements())
        {
            string key = rootType + "/" + element.Name.ToString();
            if (!values.ContainsKey(key))
                values.Add(key, element.Value.ToString());
            else
            {
                int count = 1;
                key = rootType + "/" + element.Name.ToString() + count.ToString();
                while (values.ContainsKey(key))
                {
                    count++;
                    key = rootType + "/" + element.Name.ToString() + count.ToString();
                }
                values.Add(key, element.Value.ToString());
            }
        }
        return values;
    }
}

Вставьте этот файл в тот же проект.

4. Загрузите текущую версию MediaInfo: страница загрузки. Выберите наиболее подходящую версию ( только DLL). Убедитесь, что .dll находится в каталоге выполнения приложения.

5: использование:

MediaQuery query = new MediaQuery();
Dictionary<string, string> results = query.QueryFile(@"C:\text.mov");
string videoBitRate;

if (results.TryGetValue("Video/Bit_rate", out videoBitRate) == false)
{ 
   throw new Exception("Video bit rate not found"); 
}
else
{
   // Do whatever you want with this....
   Console.writeline("Video bitrate:" + videoBitRate);
}
person user989056    schedule 02.10.2012
comment
Спасибо завтра утром попробую! - person Misha; 03.10.2012
comment
Я еще не пробовал это ... но похоже, что это сработает, и я ценю помощь! - person Misha; 04.10.2012
comment
Это сработало хорошо, дало мне точные результаты по сравнению с FFMpeg. Но это работало очень-очень медленно, и сканирование каталога с тысячами файлов заняло бы целую вечность. - person Misha; 05.10.2012
comment
Да, я боялся, что это может быть не лучшим решением вашей проблемы, учитывая большое количество файлов, которые у вас есть. MediaInfo собирает гораздо больше данных, чем просто скорость передачи данных, некоторые из которых требуют анализа файла в течение определенного периода времени. Я обнаружил, что MediaInfo дает надежные и точные результаты, но, как вы говорите, это не быстро. - person user989056; 05.10.2012

это довольно простой ответ: Windows Server 2008 не имеет мультиплексора mpeg-4, поэтому вы не можете получить информацию о mp4 на своем компьютере с конфигурацией вашего сервера по умолчанию.

- на вашем компьютере вы можете заметить, что если вы наведете курсор мыши на видеофайл, вы сможете увидеть основную информацию о файле, такую ​​​​как продолжительность ...

- на вашем сервере вы можете обнаружить, что если вы сделаете то же самое с медиафайлом mp4, вы не сможете увидеть эту информацию... (длительность и размеры)

ответ на этот вопрос заключается в том, чтобы перейти к диспетчеру серверов в разделе инструментов администрирования на вашем сервере Windows 2008 r2 из меню «Пуск».

оттуда вам нужно выбрать функции в левой части. после этого вам нужно предварительно добавить функции, выбрать DESKTOP EXPERIENCE и установить.

это первое, что вам нужно сделать, чтобы ваша машина могла читать информацию mp4. после этого вам нужно ввести тип пантомимы для ваших медиафайлов mp4. установить кодеки.

person Shahar Meshulam    schedule 01.10.2013