【问题标题】:Getting width and height from media player control从媒体播放器控件获取宽度和高度
【发布时间】:2014-04-29 02:28:31
【问题描述】:

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

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

我一直在研究是否可以在视频加载到要播放的播放列表时执行此操作,然后将这些值传递给父控件的 Width 和 Height 参数,但我做得不够。 ..

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

谢谢!

【问题讨论】:

  • 您能否提供有关您的应用程序支持的视频文件类型的更多信息?这可能决定了您需要采取的方法。
  • 我的应用程序支持几乎所有类型的视频文件。在这个线程中,我只请求了 WMPLib 的帮助,这是我用于 .wmv 文件的。其他文件类型由 vlclib 处理

标签: c# winforms video wmplib


【解决方案1】:

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

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

现在有很多 FFmpeg 的 C# 库。有的付费,有的免费。但我一直在使用一些前段时间从同事那里获得的代码。它不仅仅是获取元数据。它还可以将视频转换为 FLV 格式。我正在将其上传到 github here。提取元数据的实际方法如下所示。

    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 模式。但是,这对您来说应该是一个很好的起点。您还需要从here 下载 FFmpeg 可执行文件,并使用 FFmpeg 可执行文件的路径更新您的 App.config 文件。

【讨论】:

  • 感谢您的回复。目前我的应用程序创建了一堆附加到面板的控件,其中一个控件是从某处读取文件并显示它的 wmpcontrol。一旦控件全部创建完毕,它们就会“初始化/激活”并显示出来。
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 2023-04-09
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
相关资源
最近更新 更多