如何解决 QMediaPlayer 占用歌曲导致 PermissionError: [Error 13] 的问题
2023-02-18 16:31:02 时间
问题描述
当我们使用 QMediaPlayer
播放歌曲时,歌曲文件的句柄会被占用。如果想使用 mutagen
库对正在播放地歌曲进行数据写入,就会出现下述问题:
Traceback (most recent call last):
File "D:\Anaconda\envs\Groove\lib\site-packages\mutagen\_util.py", line 251, in _openfile
fileobj = open(filename, "rb+" if writable else "rb")
PermissionError: [Errno 13] Permission denied: 'resource/test_audio/aiko - 微熱.opus'
问题解决
为了对正在播放的歌曲进行数据写入,我们需要先释放当前正在播放歌曲的文件句柄。Qt 中没有直接提供释放句柄的方法,但是我们可以暂时将 QMediaPlayer
的播放列表清空,接着进行数据写入,最后还原播放列表。代码如下所示:
# coding:utf-8
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QMediaPlaylist
class MediaPlayer(QMediaPlayer):
""" Media player """
def __init__(self, playlist: QMediaPlaylist, parent=None) -> None:
super().__init__(parent=parent)
self.mediaPlaylist = playlist
self.currentIndex = None
self.__position = 0
self.__isPlayingBefore = False
self.setNotifyInterval(1000)
self.setPlaylist(playlist)
def isPlaying(self):
""" whether the player is playing """
return self.state() == self.PlayingState
@property
def isPlayingBeforeRelease(self):
return self.__isPlayingBefore
def releaseAudioHandle(self):
""" release the handle of audio file """
self.currentIndex = self.mediaPlaylist.currentIndex()
self.__position = self.position()
self.__isPlayingBefore = self.isPlaying()
# block the signal to prevent switching songs
self.mediaPlaylist.blockSignals(True)
self.blockSignals(True)
self.setMedia(QMediaContent())
def recoverAudioHandle(self):
""" recover the handle of audio file """
self.setPlaylist(self.mediaPlaylist)
self.mediaPlaylist.setCurrentIndex(self.currentIndex)
self.setPosition(self.__position)
self.blockSignals(False)
self.mediaPlaylist.blockSignals(False)
现在只要调用 releaseAudioHandle()
暂时释放文件句柄,之后再 recoverAudioHandle()
就能恢复播放了,以上~~
相关文章
- 记一次 .NET 某自动化采集软件 崩溃分析
- [C# 中的序列化与反序列化](.NET 源码学习)
- .NET 向量类型的运算结果范例——用于学习Vector类所提供百多个向量方法
- 树莓派(香橙派)通过.NET IoT 操作SPI编写屏幕驱动 顺手做个四足机器人(一)
- WPF自定义控件之消息提示
- .NET跨平台框架选择之一 - Avalonia UI
- 篇(16)-Asp.Net Core入门实战-权限管理之用户创建与关联角色(ViewModel再用与模型验证二)
- 学习ASP.NET Core Blazor编程系列十——路由(下)
- 代码生成器(CodeBuilder) 2.9.4 稳定版
- 篇(15)-入门实战-权限管理之用户创建与关联角色(ViewModel再用与模型验证一)
- 篇(14)-Asp.Net Core入门实战-权限管理之角色编辑和赋权(ViewModel-DTO初探)
- 算法-2 选择排序、冒泡排序、插入排序
- 篇(13)-Asp.Net Core入门实战-将功能代码增加异步功能Async和配置简单防范CSRF攻击
- NET 6 实现滑动验证码(一)、创建工程
- 算法-1 算法复杂度
- 在WPF中使用Prism弹出自定义窗体样式的对话框
- 使用Fody时,CS-SCRIPT动态代码无法找到程序集
- C# 使用SIMD向量类型加速浮点数组求和运算(3):循环展开
- aspnetcore两种上传图片(文件)的方式
- WPF输入验证提示