python 文本转语音播放失败_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()

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值