如何在WPF C#中获取MediaElement的帧率(FPS)?
在WPF中获取视频帧率的有效方案
方案1:使用MediaInfo库(跨平台,简单易用)
MediaInfo是成熟的媒体信息分析库,支持Windows和Linux,可直接读取视频文件的原始帧率,无需播放视频。
实现步骤:
- 通过NuGet安装
MediaInfo.NET包 - 编写读取帧率的代码:
using MediaInfo; public double GetVideoFps(string videoPath) { using var mediaInfo = new MediaInfoWrapper(); mediaInfo.Open(videoPath); // 读取第一个视频流的帧率(索引0对应首个视频流) var fpsStr = mediaInfo.Get(StreamKind.Video, 0, "FrameRate"); if (double.TryParse(fpsStr, out double fps)) { return fps; } return 0; }
方案2:使用Windows Media Foundation API(仅Windows平台)
针对Windows系统,可借助Media Foundation API解析媒体文件元数据,需基于.NET 5+或.NET Core 3.1+框架。
实现步骤:
- 在项目属性的「应用程序」选项卡中,勾选「启用Windows运行时支持」
- 添加对
Windows.Media.Core和Windows.Media.Playback的引用 - 异步读取帧率的代码示例:
using Windows.Media.Core; using Windows.Media.Playback; using System.Linq; public async Task<double> GetVideoFpsAsync(string videoPath) { var mediaSource = MediaSource.CreateFromUri(new Uri(videoPath)); await mediaSource.OpenAsync(); var videoTrack = mediaSource.MediaPlaybackItem.VideoTracks.FirstOrDefault(); if (videoTrack != null) { // 帧率为分子/分母的计算结果 return videoTrack.FrameRate.Numerator / (double)videoTrack.FrameRate.Denominator; } return 0; }
方案3:使用FFmpeg.AutoGen(跨平台,功能强大)
若需更底层的媒体处理能力,可使用FFmpeg的.NET封装库FFmpeg.AutoGen,支持几乎所有媒体格式。
实现步骤:
- 通过NuGet安装
FFmpeg.AutoGen包 - 初始化FFmpeg并读取帧率:
using FFmpeg.AutoGen; public double GetVideoFps(string videoPath) { ffmpeg.av_register_all(); ffmpeg.avformat_network_init(); AVFormatContext* formatContext = null; var result = ffmpeg.avformat_open_input(&formatContext, videoPath, null, null); if (result < 0) { return 0; } result = ffmpeg.avformat_find_stream_info(formatContext, null); if (result < 0) { ffmpeg.avformat_close_input(&formatContext); return 0; } int videoStreamIndex = ffmpeg.av_find_best_stream(formatContext, AVMediaType.AVMEDIA_TYPE_VIDEO, -1, -1, null, 0); if (videoStreamIndex < 0) { ffmpeg.avformat_close_input(&formatContext); return 0; } double fps = ffmpeg.av_q2d(formatContext->streams[videoStreamIndex]->r_frame_rate); ffmpeg.avformat_close_input(&formatContext); return fps; }
关于MediaElement属性的说明
你提到的RenderedFramesPerSecond和DroppedFramesPerSecond是Silverlight专属的MediaElement属性,WPF的MediaElement并未实现这些接口,因此无法直接使用。WPF的MediaElement仅专注于播放控制,不提供媒体元数据的详细读取能力,需借助第三方库或系统API实现需求。
内容的提问来源于stack exchange,提问作者sean trees
相关产品推荐
相关产品推荐

