Получение ширины и высоты от управления медиаплеером
У меня есть приложение C#, которое отображает видео с помощью элемента управления проигрывателя Windows Media (WMPLib) в Winforms.
Я могу правильно отображать видео, но мне нужно вручную вставить ширину и высоту родительского элемента управления, чтобы видео не выглядело искаженным. Мой вариант использования дошел до того, что я уже не знаю заранее, каковы размеры видео, и поэтому мне нужно найти способ получить фактическую ширину и высоту видео.
Я пытался выяснить, могу ли я сделать это после загрузки видео в плейлист, который нужно воспроизвести, и затем передать эти значения параметрам Width и Height родительского элемента управления, но у меня не получилось...
Это вообще возможно? Или эту информацию можно получить только во время воспроизведения видео? куда мне идти отсюда?
Спасибо!
1 ответ
Вы можете использовать инструмент FFmpeg из приложения C# для получения метаданных из видеофайла, включая информацию о ширине и высоте. Не зная вашего рабочего процесса приложения, я не могу предложить, когда именно вы должны прочитать информацию метаданных. Но один из возможных сценариев заключается в следующем.
- Пользователи выбирают кучу видеофайлов с диска, чтобы сообщить вам приложение о загрузке их в список воспроизведения для воспроизведения.
- Показывая анимацию загрузки, вы запускаете каждое видео через инструмент FFmpeg, чтобы получить информацию метаданных, которую вы либо сохраните в памяти или в базе данных вместе с именем файла.
- После выполнения шага 2 пользователь сможет просматривать видео в плейлисте.
- Когда пользователь выбирает видео для воспроизведения, вы загружаете соответствующую информацию о ширине и высоте и задаете свойства элемента управления медиаплеера в вашем приложении.
- Когда пользователь переходит на другое видео, вы повторяете шаг 4.
Сейчас есть много библиотек C# для FFmpeg. Некоторые платные, а некоторые бесплатные. Но я использовал некоторый код, который я получил от коллеги некоторое время назад. Это больше, чем просто получение метаданных. Он также выполняет преобразование видео в формат FLV. Я загружаю это в github здесь. Фактический метод, который извлекает метаданные, будет выглядеть следующим образом.
public void GetVideoInfo(VideoFile input)
{
//set up the parameters for video info
string Params = string.Format("-i {0}", input.Path);
string output = RunProcess(Params);
input.RawInfo = output;
//get duration
Regex re = new Regex("[D|d]uration:.((\\d|:|\\.)*)");
Match m = re.Match(input.RawInfo);
if (m.Success)
{
string duration = m.Groups[1].Value;
string[] timepieces = duration.Split(new char[] { ':', '.' });
if (timepieces.Length == 4)
{
input.Duration = new TimeSpan(0, Convert.ToInt16(timepieces[0]), Convert.ToInt16(timepieces[1]), Convert.ToInt16(timepieces[2]), Convert.ToInt16(timepieces[3]));
}
}
//get audio bit rate
re = new Regex("[B|b]itrate:.((\\d|:)*)");
m = re.Match(input.RawInfo);
double kb = 0.0;
if (m.Success)
{
Double.TryParse(m.Groups[1].Value, out kb);
}
input.BitRate = kb;
//get the audio format
re = new Regex("[A|a]udio:.*");
m = re.Match(input.RawInfo);
if (m.Success)
{
input.AudioFormat = m.Value;
}
//get the video format
re = new Regex("[V|v]ideo:.*");
m = re.Match(input.RawInfo);
if (m.Success)
{
input.VideoFormat = m.Value;
}
//get the video format
re = new Regex("(\\d{2,3})x(\\d{2,3})");
m = re.Match(input.RawInfo);
if (m.Success)
{
int width = 0; int height = 0;
int.TryParse(m.Groups[1].Value, out width);
int.TryParse(m.Groups[2].Value, out height);
input.Width = width;
input.Height = height;
}
input.infoGathered = true;
}
Код, вероятно, мог бы использовать некоторую оптимизацию, включая реализацию IDisposable и шаблон dispose. Однако это должно быть хорошей отправной точкой для вас. Вам также необходимо скачать исполняемый файл FFmpeg отсюда и обновить файл App.config, указав путь к исполняемому файлу FFmpeg.