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

使用WMPLib与TagLib的C#播放器播放时无法写入音频标签的问询

解决播放时无法保存WAV标签的问题

问题根源

播放状态下,WMPLib的播放器实例会独占锁定音频文件,导致TagLib无法获取文件的写入权限,从而抛出can't save because file in use错误。

解决方案:暂停播放→保存标签→恢复播放

通过临时暂停播放释放文件占用,完成标签保存后再恢复播放,是最直接的解决方式。同时结合async/await处理标签保存操作,避免阻塞UI线程。

修改后的代码示例

// 假设你有WMPLib.WindowsMediaPlayer类型的全局播放器实例,命名为player
private async void t_star_1_Click2(object sender, EventArgs e)
{
    if (listView1.SelectedItems.Count == 0) return;
    
    string soundpath = listView1.SelectedItems[0].SubItems[8].Text;
    bool wasPlaying = player.playState == WMPLib.WMPPlayState.wmppsPlaying;
    double currentPosition = 0;

    // 记录播放状态和位置,暂停播放释放文件
    if (wasPlaying)
    {
        currentPosition = player.Ctlcontrols.currentPosition;
        player.Ctlcontrols.pause();
    }

    try
    {
        // 异步执行标签保存,避免UI卡顿
        await SaveRatingTagAsync(soundpath, 1);
        PlaylistList_update();
    }
    finally
    {
        // 恢复之前的播放状态
        if (wasPlaying)
        {
            player.URL = soundpath;
            player.Ctlcontrols.currentPosition = currentPosition;
            player.Ctlcontrols.play();
        }
    }
}

// 封装异步保存评分标签的方法
private async Task SaveRatingTagAsync(string filePath, int rating)
{
    await Task.Run(() =>
    {
        using (var tagdusound = TagLib.File.Create(filePath))
        {
            Tag tagg = tagdusound.GetTag(TagTypes.Id3v2);
            PopularimeterFrame frame = PopularimeterFrame.Get((TagLib.Id3v2.Tag)tagg, "Windows Media Player 9 Series", true);
            frame.Rating = rating;
            tagdusound.Save();
        }
    });
}

代码说明

  1. 播放状态管理:先判断播放器是否处于播放状态,记录当前播放位置后暂停,释放文件占用锁。
  2. 异步标签操作:将TagLib的文件读写逻辑放到Task.Run中,通过async/await实现异步执行,避免UI线程被阻塞导致界面卡顿。
  3. 状态恢复:在finally块中恢复之前的播放状态,保证无论标签保存成功与否,都会回到用户之前的播放场景。

额外注意事项

  • 确保播放器实例player是全局可访问的,或者通过合适的方式传递到方法中。
  • WAV文件的ID3v2标签兼容性:部分播放器可能不读取WAV格式中的ID3v2标签,测试时注意验证标签是否正确写入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:43:23