通过媒体播放器控制获取宽度和高度

本文关键字:取宽度 高度 获取 控制 媒体播放器 | 更新日期: 2023-09-27 18:00:39

我有一个C#应用程序,它使用Winforms中的Windows Media Player控件(WMPLib)显示视频。

我可以正确显示视频,但我必须手动插入父控件的宽度和高度,这样视频看起来就不会失真。我的用例已经发展到我不再事先知道视频尺寸是多少的地步,因此我需要找到一种方法来获得视频的实际宽度和高度。

我一直在挖掘我是否可以在视频加载到要播放的播放列表时这样做,然后将这些值传递给父控件的"宽度"answers"高度"参数,但我做得不够。。。

这可能吗?还是只有在播放视频时才能获得这些信息?我该从这里去哪里?

谢谢!

通过媒体播放器控制获取宽度和高度

您可以在C#应用程序中使用FFmpeg工具从视频文件中获取元数据信息,包括宽度和高度信息。由于不了解您的应用程序工作流程,我无法建议您应该在什么时候阅读元数据信息。但一种可能的情况是这样的。

  1. 用户从磁盘中选择一组视频文件,告诉您的应用程序将它们加载到播放列表中进行播放
  2. 在显示加载动画时,您可以通过FFmpeg工具运行每个视频,以获得元数据信息,这些信息与文件名一起存储在内存或数据库中
  3. 完成步骤2后,用户就可以看到播放列表中的视频
  4. 当用户选择要播放的视频时,您将加载相应的宽度和高度信息,并在应用程序中设置媒体播放器控件的属性
  5. 当用户移动到另一个视频时,重复步骤4

现在有许多用于FFmpeg的C#库。有些是付费的,有些是免费的。但我一直在使用一些代码,这些代码是我不久前从一位同事那里获得的。它所做的不仅仅是获取元数据。它还执行视频到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可执行文件,并使用FFmpeg执行文件的路径更新App.config文件。