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

如何在C#中使用LibVLC不播放音频文件获取其时长?

获取LibVLC音频文件时长的简便方法

要获取音频时长,关键是要让LibVLC完成媒体元数据的解析——直接调用SetMedia后立刻获取属性是不行的,因为媒体加载是异步的。下面是两种可行的简便方案:

方案1:同步解析本地媒体(适合本地.ogg/.wav文件)

直接创建VlcMedia对象并主动触发同步解析,解析完成后就能直接读取时长:

using Vlc.DotNet.Core;
using Microsoft.Win32;
using System.IO;

namespace Test
{
    public partial class MainWindow : Window
    {
        private VlcMediaPlayer vlcPlayer;

        public MainWindow()
        {
            InitializeComponent();
            
            string vlcPath;
            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\VideoLAN\VLC"))
                vlcPath = key.GetValue("InstallDir").ToString();

            // 初始化LibVLC环境
            var vlcLibDirectory = new DirectoryInfo(vlcPath);
            var libVlc = new LibVLC(vlcLibDirectory);
            
            // 创建媒体对象并同步解析
            var media = new VlcMedia(libVlc, songFilename, FromType.FromPath);
            // 同步解析本地媒体,等待元数据加载完成
            media.Parse(MediaParseOptions.ParseLocal);

            // 解析完成后获取时长(单位:毫秒)
            long durationMs = media.Duration;
            // 转换为友好的时分秒格式
            TimeSpan duration = TimeSpan.FromMilliseconds(durationMs);

            // 初始化播放器并播放
            vlcPlayer = new VlcMediaPlayer(media);
            vlcPlayer.Play();
        }
    }
}

方案2:异步监听媒体加载事件(适合远程/大文件)

如果担心同步解析阻塞UI,可以监听MediaLoaded事件,异步获取时长:

using Vlc.DotNet.Core;
using Microsoft.Win32;
using System.IO;

namespace Test
{
    public partial class MainWindow : Window
    {
        private VlcMediaPlayer vlcPlayer;

        public MainWindow()
        {
            InitializeComponent();
            
            string vlcPath;
            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\VideoLAN\VLC"))
                vlcPath = key.GetValue("InstallDir").ToString();

            var vlcLibDirectory = new DirectoryInfo(vlcPath);
            var libVlc = new LibVLC(vlcLibDirectory);
            var media = new VlcMedia(libVlc, songFilename, FromType.FromPath);

            // 监听媒体加载完成事件
            media.MediaLoaded += (sender, e) =>
            {
                long durationMs = media.Duration;
                TimeSpan duration = TimeSpan.FromMilliseconds(durationMs);
                // 更新UI需切换到UI线程
                Dispatcher.Invoke(() =>
                {
                    // 示例:更新界面时长显示
                    // durationLabel.Content = $"{duration:mm\\:ss}";
                });
            };

            vlcPlayer = new VlcMediaPlayer(media);
            vlcPlayer.Play();
        }
    }
}

关键要点

  • 避免直接使用VlcMediaPlayer.Play(string)重载,该方式隐式创建媒体但无法暴露解析过程,无法及时获取元数据。
  • Media.Parse()参数:ParseLocal适合本地文件,同步等待解析完成;网络媒体建议用ParseNetwork+异步事件,避免阻塞。
  • Duration返回毫秒数,可通过TimeSpan.FromMilliseconds()转换为易读格式。

内容的提问来源于stack exchange,提问作者Carmen DiMichele

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:01:01