win下使用PyQt的Phonon播放失败

最近参与了做第三方的Linux网易云音乐客户端时,在win下调试遇到一个致命问题:音乐无法播放,但切到Ubuntu下又是正常的,

使用的代码如下:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4 import QtGui, QtCore
from PyQt4.phonon import Phonon

class Window(QtGui.QPushButton):
    def __init__(self):
        QtGui.QPushButton.__init__(self, ‘Choose File‘)
        self.mediaObject = Phonon.MediaObject(self)
        self.audioOutput = Phonon.AudioOutput(Phonon.MusicCategory, self)
        Phonon.createPath(self.mediaObject, self.audioOutput)
        self.mediaObject.stateChanged.connect(self.handleStateChanged)
        self.clicked.connect(self.handleButton)

    def handleButton(self):
        if self.mediaObject.state() == Phonon.PlayingState:
            self.mediaObject.stop()
        else:
            path = QtGui.QFileDialog.getOpenFileName(self, self.text())
            #path = "test.mp3"
            if path:
                print path
                self.mediaObject.setCurrentSource(Phonon.MediaSource(path))
                print self.mediaObject.currentSource().fileName()
                self.mediaObject.play()

    def handleStateChanged(self, newstate, oldstate):
        if newstate == Phonon.PlayingState:
            self.setText(‘Stop‘)
        elif newstate == Phonon.StoppedState:
            self.setText(‘Choose File‘)
        elif newstate == Phonon.ErrorState:
            source = self.mediaObject.currentSource().fileName()
            print ‘ERROR: could not play:‘, source.toLocal8Bit().data()
            print self.mediaObject.errorString().toLocal8Bit().data()#查看报错的具体信息
if __name__ == ‘__main__‘:

    import sys
    app = QtGui.QApplication(sys.argv)
    app.setApplicationName(‘Phonon‘)
    win = Window()
    win.resize(200, 100)
    win.show()
    sys.exit(app.exec_())

就是这段代码在ubuntu下正常,在win下报错

通过查看   media的errorString

print self.mediaObject.errorString().toLocal8Bit().data()#查看报错的具体信息

得到了错误信息是:

Pins cannot connect due to not supporting the same transport

经查找各方资料,得出的结论(已验证)是:音乐文件的ID3 tag有问题,(具体的mp3文件的结构见:MP3文件格式)

stackoverflow上看到了c++版的去掉ID3 tag的办法:

void removeTags(UDJ::DataStore::song_info_t& song){
  static int fileCount =0;
  if(song.source.fileName().endsWith(".mp3")){
    UDJ::Logger::instance()->log("On windows and got mp3, copying and striping metadata tags");
    QString tempCopy = QDesktopServices::storageLocation(QDesktopServices::TempLocation) + "/striped" + QString::number(fileCount) +".mp3";
    if(QFile::exists(tempCopy)){
      UDJ::Logger::instance()->log("Prevoius file existed, deleting now");
      if(QFile::remove(tempCopy)){
        UDJ::Logger::instance()->log("File removal worked");
      }
    }
    bool fileCopyWorked = QFile::copy(song.source.fileName(), tempCopy);
    if(!fileCopyWorked){
      UDJ::Logger::instance()->log("File copy didn‘t work");
      return;
    }

    TagLib::MPEG::File file(tempCopy.toStdString().c_str()); 
    file.strip();
    file.save();
    Phonon::MediaSource newSource(tempCopy);
    song.source = newSource;
    if(fileCount == 3){
      fileCount =0;
    }
    else{
      fileCount++;
    }
  }}

在python中有专门的模块用来处理音频的metadata : mutagen,文档在:mutagen-doc

这里利用Tutorial中给出的示例,去掉了本地音乐文件的ID3 tag:

from mutagen.id3 import ID3
audio = ID3("example.mp3")
audio.delete()
audio.save()

之后再次调用上面的测试代码,成功播放.

时间: 2024-11-06 19:10:08

win下使用PyQt的Phonon播放失败的相关文章

【GitHub Desktop】MacOS和Win下配置及简单的使用

一. GitHub介绍 1.GitHub 是为开发者提供 Git 仓库的托管服务.这是一个让开发者与朋友.同事.同学及陌生人共享代码的完美场所. 总结一下,GitHub 最大的特征是"面向人" 2.GitHub 与 Git 的区别在 Git 中,开发者将源代码存入名叫"Git 仓库"的资料库中并加以使用. 而 GitHub 则是在网络上提供 Git 仓库的一项服务.也就是说,GitHub 上公开的软件源代码全都由 Git 进行管理. (图片来源GitHub 是怎样的

直播疑难杂症排查(1)— 播放失败

本文是<直播疑难杂症排查>系列的第一篇文章,我们从播放开始,因为观看直播最重要的一个环节就是打开播放器,很多问题的直接反馈也是来自观众端. 导致播放失败的原因,有很多种,不一定是播放器本身的问题,不过通过播放器,我们很容易反过来排查服务端或者推流端的问题.下面我们会从播放失败的表现.播放问题排查工具.常见问题分析等多个方面展开讨论. 1. 播放失败的表现 播放失败的表现总结下来包括但不限于以下这些: - 界面上一直显示 "加载中",或者提示播放失败的错误 - 播放画面卡死不

WIN 下的超动态菜单(二)用法

WIN 下的超动态菜单(一)简介 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/         auto_dynamenu 是一个动态生成WINDOWS菜单的c++封装库,设计思路是要尽量简化动态菜单的生成代码,在程序界面任何地方想要显示菜单(特别是右键菜单)的时候,可以方便生成菜单,特别可以根据程序当时的内部数据,内部状态来生成不同的动态菜单.         auto_dynamenu 只封装了一个静态的接口函数,这样处理的目的是把类的实现代码可

win下编译ffmpeg库,Compile and build ffmpeg library and dll on Windows x64( 正版)

转载请注明:来自EricKing,thanks 从没想到编一个library这么坑爹,再次提醒各位百度的东西只能参考,想节约时间还是要到官网上去查看docum.不废话了,开始详细过程: ——>1.搭建Win下的GCC编译环境(因为win下vs不支持ffmpeg的compile 和build,官网上也有说这一点) ——>2.下载latest ffmpeg source(后面附官网地址),想办法将编译后的文件做成dll,这是win下编程调试的核心 (这里就用到vs下的一个vc的bash文件叫vcv

《直播疑难杂症排查系列》之一 :播放失败

直播疑难杂症排查 - 序 <直播疑难杂症排查系列>会涵盖的内容包括但不限于如下一些主题: 播放失败 直播卡顿 首开慢 延时高 音画不同步 马赛克严重 播放黑屏.花屏.绿屏 播放杂音.噪音.回声 点播拖动不准 直播发热问题 其他问题(待续) 第一篇文章我们从播放开始,因为观看直播最重要的一个环节就是打开播放器,很多问题的直接反馈也是来自观众端. 导致播放失败的原因有很多种,不一定是播放器本身的问题,不过通过播放器,我们很容易反过来排查服务端或者推流端的问题.下面我们会从播放失败的表现.播放问题排

win下GIT GUI的使用教程

现在很多都有git来托管项目或者来查找资料,但是看起来操作不是很方便,现在由于win下可以直接使用git gui,让使用git变得方便,当然这只是针对日常简单的使用,如果想详细的使用,可以去参考廖学峰写的教程 git下载地址 http://pan.baidu.com/s/1b8mC3s git安装步骤 1.选择下载的安装包 2.安装步骤省略,直接下一步即可. 出现下面的图片安装成功 使用git GUI克隆已存在的仓库 1.在本地新建一个文件夹test,选中后点击右键,选择Git GUI Here

我Win下常用工具清单

GoAgent 搞研发的没有一个FQ访问Google的工具,真没法工作,所以第一主推这个, 相关按照方式请参考: http://www.cnblogs.com/ghj1976/category/696141.html 另外要用 Gogotester 配合寻找 Goagent 可用的ip , 参考: http://www.anybfans.com/1240.html   Windows Live Writer 写博客的工具,微软出品, 包括 mac下,都没觉得这个方便.下载地址: https://

Win 下 创建 Python 虚拟环境

主要是记录一个 用虚拟环境打包的坑, Virtualenv 不如自带的 venv 香. 需求 最近要对一个 tkinter 小程序打包为 exe. 毕竟业务人员是绝对不可能安装开发环境的. 不论你怎么说它如何强大. 代码是多文件夹的, 写了一个主程序 main.py 来控制主逻辑. 即要对它进行打包 exe. 百度了一下, 主流的方式用第三方库 pyinstaller. 然后创建虚拟环境, 打包, 怎么也打不了, 心态崩溃了好几天... 采坑 Virtualenv 之前有写过一点 web, 第一

又是正版!Win下ffmpeg源码调试分析二(Step into ffmpeg from Opencv for bugs in debug mode with MSVC)

最近工作忙一直没时间写,但是看看网络上这方面的资源确实少,很多都是linux的(我更爱unix,哈哈),而且很多是直接引入上一篇文章的编译结果来做的.对于使用opencv但是又老是被ffmpeg库坑害的朋友们,可能又爱又恨,毕竟用它处理和分析视频是第一选择,不仅是因为俩者配合使用方便,而且ffmpeg几乎囊括了我所知道的所有解编码器,但是正是因为这个导致了一些bug很难定位,所以有必要考虑一下如何快速定位你的ffmpeg bug. sorry,废话多了.首先给个思路: 1.使opencv 的hi