我有一个C#应用程序,它使用Winforms中的Windows Media Player控件(WMPLib)显示视频。
我可以正确显示视频,但我必须手动插入父控件的宽度和高度,以便视频看起来不会失真。我的用例已经发展到我不再事先知道视频尺寸是什么的程度,因此我需要找到一种方法来获取视频的实际宽度和高度。
我一直在研究是否可以在视频加载到要播放的播放列表时执行此操作,然后将这些值传递给父控件的宽度和高度参数,但我已经做得很短。 ..
这甚至可能吗?或者是否只能在播放视频时获取该信息?我应该从哪里开始?
谢谢!
答案 0 :(得分:0)
您可以在C#应用程序中使用FFmpeg工具从视频文件中获取元数据信息,包括宽度和高度信息。不知道您的应用程序工作流程,我无法建议您何时应该阅读元数据信息。但有一种可能的情况就是这样。
现在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文件。