使用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(); } }); }
代码说明
- 播放状态管理:先判断播放器是否处于播放状态,记录当前播放位置后暂停,释放文件占用锁。
- 异步标签操作:将TagLib的文件读写逻辑放到
Task.Run中,通过async/await实现异步执行,避免UI线程被阻塞导致界面卡顿。 - 状态恢复:在
finally块中恢复之前的播放状态,保证无论标签保存成功与否,都会回到用户之前的播放场景。
额外注意事项
- 确保播放器实例
player是全局可访问的,或者通过合适的方式传递到方法中。 - WAV文件的ID3v2标签兼容性:部分播放器可能不读取WAV格式中的ID3v2标签,测试时注意验证标签是否正确写入。
内容的提问来源于stack exchange,提问作者Stegau
相关产品推荐
相关产品推荐

