Какой самый быстрый способ узнать длительность медиа-файла?
Я работаю над программой, которая сканирует удаленные папки для файлов и регистрирует их в другой системе, для которой требуется длительность файла. Лучшее решение, которое мне удалось найти, - это использовать 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