Какой самый быстрый способ узнать длительность медиа-файла?

Я работаю над программой, которая сканирует удаленные папки для файлов и регистрирует их в другой системе, для которой требуется длительность файла. Лучшее решение, которое мне удалось найти, - это использовать MediaInfo, чтобы получить длительность из заголовка, но по некоторым причинам для получения результата требуется несколько секунд.

Предположим, у меня есть список из 1000 путей к файлам, и я хочу получить продолжительность для каждого из них, но получение продолжительности занимает 15 секунд. Линейная итерация по списку займет чуть более 4 часов, и даже выполнение 8 параллельных задач займет полчаса. С моими тестами это был бы лучший вариант развития событий.

Я пытался использовать MediaInfo DLL, а также вызывать.exe, и у обоих, похоже, было одинаковое время обработки.

Код DLL:

MediaInfo MI;

public Form1()
{
    InitializeComponent();
    MI = new MediaInfo();
}

private void button1_Click(object sender, EventArgs e)
{
    MI.Open(textBox1.Text);
    MI.Option("Inform", "Video;%Duration%");
    label2.Text = MI.Inform();
    MI.Close();
}

Исполняемый код:

Process proc = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = "MediaInfo.exe",
        Arguments = $"--Output=Video;%Duration% \"{textBox1.Text}\"",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    }
};

StringBuilder line = new StringBuilder();
proc.Start();

while (!proc.StandardOutput.EndOfStream)
{
    line.Append(proc.StandardOutput.ReadLine());
}

label2.Text = line.ToString();

Следует отметить, что обрабатываемые файлы находятся на сетевом диске, но я проверил получение длительности локального файла, и это было всего на несколько секунд быстрее. Обратите внимание, что эта программа должна работать на Windows Server 2003 R2, что означает только.net 4.0. Большинство файлов, которые я буду обрабатывать, - это.mov, но я не могу ограничиться этим.

2 ответа

Некоторый лучший код (предпочтительнее вызов DLL, init занимает время) с опциями для уменьшения продолжительности сканирования:

MediaInfo MI;

public Form1()
{
    InitializeComponent();
    MI = new MediaInfo();
    MI.Option("ParseSpeed", "0"); // Advanced information (e.g. GOP size, captions detection) not needed, request to scan as fast as possible
    MI.Option("ReadByHuman", "0"); // Human readable strings are not needed, no noeed to spend time on them
}

private void button1_Click(object sender, EventArgs e)
{
    MI.Open(textBox1.Text);
    label2.Text = MI.Get(Stream_Video, "Duration"); //Note: prefer Stream_General if you want the duration of the program (here, you select the duration of the video stream)
    MI.Close();
}

Существует несколько возможностей для улучшения времени анализа в зависимости от ваших конкретных потребностей (т.е. вам не нужно много функций), но это код, добавляемый непосредственно в MediaInfo (например, для файлов MP4/QuickTime, получение только продолжительности может занять меньше 200 мс, если я отключаю другие функции), добавьте запрос функции, если вам нужна скорость.

Жером, разработчик MediaInfo

apt-get install python-pip
pip install pymediainfo

#!/usr/bin/env python
import pymediainfo
duration = float(pymediainfo.MediaInfo.parse(myfilename).tracks[0])/1000.0
Другие вопросы по тегам