如何在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
相关产品推荐
相关产品推荐

