博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
win下使用PyQt的Phonon播放失败
阅读量:6423 次
发布时间:2019-06-23

本文共 3234 字,大约阅读时间需要 10 分钟。

hot3.png

最近参与了做时,在win下调试遇到一个致命问题:音乐无法播放,但切到Ubuntu下又是正常的,

使用的代码如下:

#!/usr/bin/env python#-*- coding:utf-8 -*-from PyQt4 import QtGui, QtCorefrom PyQt4.phonon import Phononclass 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文件的结构见:)

在上看到了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 : ,文档在:

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

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

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

转载请注明出处  :  http://my.oschina.net/chinesezhx/blog/466727

转载于:https://my.oschina.net/chinesezhx/blog/466727

你可能感兴趣的文章
传统媒体、网络媒体的乐与悲!
查看>>
shell下操作快捷键
查看>>
Android流量统计TrafficStats类的使用(Android2.2后可用)
查看>>
Linux 命令用法
查看>>
我的友情链接
查看>>
Linux运维之linux下构建Cacti网络监控平台-清小小著作
查看>>
nohup命令
查看>>
陈松松:我是如何制定每一天的视频营销计划
查看>>
【我拼搏的2016】-Python进行时
查看>>
MySQL性能优化的最佳21条经验
查看>>
19.Swift中的闭包
查看>>
LI块级浮动margin或高度多出问题
查看>>
Android混淆打包
查看>>
提高企业内网服务器安全的五点建议
查看>>
第一个自己编写的面向对象的Python例子
查看>>
Horizon View 7 发布Win10桌面二:即时克隆桌面池配置
查看>>
mysql性能优化注意事项以及索引
查看>>
Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
查看>>
Linux文件查找之locate与find
查看>>
JavaScript案例开发之扑克游戏
查看>>