Получение ширины и высоты от управления медиаплеером

У меня есть приложение C#, которое отображает видео с помощью элемента управления проигрывателя Windows Media (WMPLib) в Winforms.

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

Я пытался выяснить, могу ли я сделать это после загрузки видео в плейлист, который нужно воспроизвести, и затем передать эти значения параметрам Width и Height родительского элемента управления, но у меня не получилось...

Это вообще возможно? Или эту информацию можно получить только во время воспроизведения видео? куда мне идти отсюда?

Спасибо!

1 ответ

Вы можете использовать инструмент FFmpeg из приложения C# для получения метаданных из видеофайла, включая информацию о ширине и высоте. Не зная вашего рабочего процесса приложения, я не могу предложить, когда именно вы должны прочитать информацию метаданных. Но один из возможных сценариев заключается в следующем.

  1. Пользователи выбирают кучу видеофайлов с диска, чтобы сообщить вам приложение о загрузке их в список воспроизведения для воспроизведения.
  2. Показывая анимацию загрузки, вы запускаете каждое видео через инструмент FFmpeg, чтобы получить информацию метаданных, которую вы либо сохраните в памяти или в базе данных вместе с именем файла.
  3. После выполнения шага 2 пользователь сможет просматривать видео в плейлисте.
  4. Когда пользователь выбирает видео для воспроизведения, вы загружаете соответствующую информацию о ширине и высоте и задаете свойства элемента управления медиаплеера в вашем приложении.
  5. Когда пользователь переходит на другое видео, вы повторяете шаг 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.

Другие вопросы по тегам