• 9658阅读
  • 7回复

求助:QT播放语音文件 [复制链接]

上一主题 下一主题
离线hasitate
 

只看楼主 倒序阅读 楼主  发表于: 2010-08-08
— 本帖被 XChinux 执行加亮操作(2010-09-04) —
用QT写的程序,需要根据事件播放语音文件。语音文件名是中文的。
先用QSound来实现的,在windows下没问题,但在linux下不能播放中文名字的语音文件。
后来改成用phonon实现,在linux下能播放文件了,但原来程序的中文菜单里的字符都不见了。点击菜单有反应。把中文字符改成英文的也没用。

现有两个问题:
1. 如何让QSound在linux下支持中文文件名的语音文件?
2. 是不是phonon不支持菜单还是字体问题? 如需要恢复菜单。如何作?
貌似把初始化audio的语句
    audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
注释掉,菜单就恢复原样了(但如果这样,就播放不了语音文件了)

不知有没有哪位达人碰到过这个问题? 望不吝赐教
谢谢。
[ 此帖被hasitate在2010-08-08 09:35重新编辑 ]
离线hasitate

只看该作者 1楼 发表于: 2010-08-08
今天试了半天。还是用QSound的方法,问题解决如下:
每次在调用QSound::play(QString str)前,调用QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
貌似QSound::play()只能识别文件名编码为UTF-8。
离线benbenmajia

只看该作者 2楼 发表于: 2010-08-09
回 1楼(hasitate) 的帖子
也不需要每次都调用吧..在程序中直接进行定义就可以
安然.....
离线dbzhang800

只看该作者 3楼 发表于: 2010-08-09
引用第1楼hasitate于2010-08-08 22:23发表的  :
今天试了半天。还是用QSound的方法,问题解决如下:
每次在调用QSound::play(QString str)前,调用QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
貌似QSound::play()只能识别文件名编码为UTF-8。

尽管你的问题解决了,但你的结论很可能错了,play 接受的是QString,而QString内部是Unicode编码。你的问题出在对编码的认识上,比如:送给QString的字符串本身就是错的(国内很多人都会这么写: QString str="中文";,却不知道自己究竟在做什么 )

不当请指正
离线benbenmajia

只看该作者 4楼 发表于: 2010-08-09
回 3楼(dbzhang800) 的帖子
张老师~俺回来跟您请教来了
安然.....
离线longwenbiao
只看该作者 5楼 发表于: 2010-08-09
试试GBK编码
离线hasitate

只看该作者 6楼 发表于: 2010-08-12
引用第3楼dbzhang800于2010-08-09 10:10发表的  :
尽管你的问题解决了,但你的结论很可能错了,play 接受的是QString,而QString内部是Unicode编码。你的问题出在对编码的认识上,比如:送给QString的字符串本身就是错的(国内很多人都会这么写: QString str="中文";,却不知道自己究竟在做什么 )
不当请指正


谢谢。
我想我这边指的UTF-8和unicode是不一样的。
尽管QString内部是Unicode编码的,但是不同的locale下,其编码是不一样的。
因为需要支持中文界面和中文字符串处理,我在main()中加入了
QTextCodec *codec = QTextCodec::codecForName("GBK");
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
在这种情况下,QString str="中文"的编码和locale为UTF-8设置下的编码是不一样的。

由于我设置的locale是GBK,无论我传什么样编码的中文字符进去,QSound::play(QString str)都不能正确decode出中文字符
貌似目前的QSound::play(QString str)只能正确识别UTF-8下编码的中文字符。
我想这是linux下play()函数实现的问题。
我个人觉得如果修改linux下play()函数的实现,肯定可以和windows下一样,不需要额外重新设置locale而避免这个问题的。

我个人觉得我们不太需要关心送给QString的字符串究竟是什么样的数据。只要大环境设好了,我传给QSound::play()的是str="中文",
那么它就应该正确解释出str="中文"而不是其它的。至于这个字符串内部是怎么编码的,对于我来说应该是透明的,我并不需要关心,因为locale是唯一的。所以我觉得是linux下play()函数实现的问题。

[ 此帖被hasitate在2010-08-12 13:28重新编辑 ]

只看该作者 7楼 发表于: 2015-04-28
快速回复
限100 字节
 
上一个 下一个