You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WPF C#中获取MediaElement的帧率(FPS)?

在WPF中获取视频帧率的有效方案

方案1:使用MediaInfo库(跨平台,简单易用)

MediaInfo是成熟的媒体信息分析库,支持Windows和Linux,可直接读取视频文件的原始帧率,无需播放视频。

实现步骤:

  1. 通过NuGet安装MediaInfo.NET包
  2. 编写读取帧率的代码:
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+框架。

实现步骤:

  1. 在项目属性的「应用程序」选项卡中,勾选「启用Windows运行时支持」
  2. 添加对Windows.Media.Core和Windows.Media.Playback的引用
  3. 异步读取帧率的代码示例:
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,支持几乎所有媒体格式。

实现步骤:

  1. 通过NuGet安装FFmpeg.AutoGen包
  2. 初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:27:38