Разберете скоростта на предаване на филми в Windows Server 2008

Опитвам се да разбера скоростта на данни за филмов файл (mp4 или wmv) в Windows Server 2008. Опитах да използвам Windows API Code Pack, както и COM обектите Shell32 в C#. Това работи перфектно в Windows 7, но не ми връща никаква информация в Windows Server 2008.

В Windows 7 Explorer мога да добавя колона към списъка с подробности за елементите в папка, за да видя свойствата на файла като скорост на данни, битрейт и продължителност. Когато се опитвате да направите това в 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. Имате налични C# обвивки за него. Вижте тази 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 от тях са 1632kb/s, а останалите 250 са 850kb/s, обвивката отчита, че над 400 са по-малко от 1000kb/s... така че трябва да отстраня грешки в изхода за 500 файла, просто трябва да намеря още време за това това :) благодаря за помощта! - person Misha; 03.10.2012
comment
Разбира се, радвам се, че съм полезен. Ако сте съгласни, би било чудесно, ако приемете отговора ми и споделите част от доброто. (Събирам точки за собствени награди.) - person LavaScornedOven; 03.10.2012
comment
FFMpeg всъщност ми даваше неточни резултати.. когато използвах решението MediaInfo, получих правилните резултати за битрейт, но отне цяла вечност, за да получа тези стойности.. - person Misha; 05.10.2012

MediaInfo

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

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 сървър 2008 няма mpeg-4 мултиплексор, така че не можете да получите информация за mp4 на вашата машина с конфигурация по подразбиране на вашия сървър.

-в компютъра си можете да забележите, че ако застанете с курсора на мишката върху видео файл, ще можете да видите основна информация за файла като продължителност...

-на вашия сървър може да разберете, че ако направите същото с mp4 медиен файл, няма да можете да видите тази информация... (продължителност и размери)

отговорът на този проблем е да отидете на мениджъра на сървъра под административните инструменти във вашия windows server 2008 r2 от менюто "Старт".

от там трябва да изберете функции в лявата страна. след това трябва предварително да добавите функции и да изберете DESKTOP EXPERIENCE и да инсталирате.

това е основното нещо, което трябва да направите, за да може вашето устройство да чете mp4 информация. след това трябва да въведете mime за вашите mp4 медийни файлове. инсталирайте кодеци.

person Shahar Meshulam    schedule 01.10.2013