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

如何在Python PySide6中播放含非ASCII文件名的音频文件?

解决PySide6 QMediaPlayer无法播放含非ASCII字符文件名的音频问题

问题分析

核心问题是QMediaPlayer无法识别含非ASCII字符的本地音频文件路径:直接拼接字符串构造QUrl会触发编码错误,urllib.parse.quote()的编码方式也不符合Qt本地文件URL的要求。同时原代码存在两处基础错误需要修正:

  • Word类中错误引用了不存在的WordInstance,应使用类名Word访问类变量
  • onItemSelected_WordList方法中错误调用全局list对象,需改为self.ui.wordList获取目标列表控件

解决方案

1. 修正Word类的音频路径生成逻辑

使用Qt提供的QUrl.fromLocalFile()方法生成本地文件URL,该方法会自动处理非ASCII字符的编码问题;同时用os.path.join()安全拼接路径,避免手动拼接的格式错误:

import os
from PySide6 import QtCore

class Word(object):
    audioFolderPath = "C:/path/to/the/audio/file/"

    def __init__(self, wordInfo):
        self.text = wordInfo[2]
        self.meaning = wordInfo[6]
        self.audiofile = self.text + ".mp3"
        # 安全拼接路径并生成符合要求的本地文件URL
        full_audio_path = os.path.join(Word.audioFolderPath, self.audiofile)
        self.audioPath = QtCore.QUrl.fromLocalFile(full_audio_path)

2. 修正MainWindow中的列表项点击事件处理

确保正确引用UI列表控件,同时可打印本地路径辅助排查:

class MainWindow(QMainWindow):
    # 其他初始化代码保持不变

    def onItemSelected_WordList(self):
        currentItem = self.ui.wordList.currentItem()
        word = self.ui.wordList.itemWidget(currentItem).word

        self._player.setPosition(0)
        self._audio_output.setVolume(100)
        self._player.setSource(word.audioPath)
        self._player.play()
        # 打印本地路径确认是否正确
        print("当前音频路径:", self._player.source().toLocalFile())

原理说明

  • QUrl.fromLocalFile()会根据本地文件系统的编码规则处理非ASCII字符,生成Qt媒体播放器可识别的本地文件URL格式
  • 直接用字符串构造QUrl时,Qt会将其视为网络URL而非本地文件,导致非ASCII字符的编码逻辑错误
  • os.path.join()可自动适配不同操作系统的路径分隔符,避免手动拼接路径出现的格式问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:32:09