新用户注册
登录
论坛
搜索
帮助
导航
私人消息 (0)
公共消息 (0)
系统消息 (0)
好友消息 (0)
帖子消息 (0)
CuteQt, 酷享Qt
»
Qt通用问题区
» Qt线程中无法播放声音? 什么原因?
返回列表
发帖
发短消息
加为好友
zhu
当前离线
UID
2
帖子
399
精华
3
积分
755
阅读权限
100
在线时间
154 小时
注册时间
2009-4-23
最后登录
2010-9-3
版主
1
#
跳转到
»
倒序看帖
打印
字体大小:
t
T
zhu
发表于 2010-7-9 11:36
|
只看该作者
Qt线程中无法播放声音? 什么原因?
帮转的一个问题,谁能帮忙看看
=============
我想另外开一个线程,在新的线程中实现三个功能:(1)将收到的音频信息写到文件中;(2)写完音频文件之后将音频播放出来;(3)将播放完的音频文件删除。
我写了一个类如下:
class Response:public QThread
{
Q_OBJECT
public:
Response(QObject *parent=0);
Response();
void run();
private slots:
void soundOut();//播放音频文件
void writeFile(QByteArray);//写文件,写完后发出doneWrite()信号
void playOver();//当一个文件播放完毕时触发写函数来删除文件
signals:
void doneWrite();//将音频信息写入文件之后发出此信号
private:
QFile receiveFile;
QMediaPlayer *player;
UdpSocket *receiveUdpSocket;
。
。
。
};
run()实现如下:
void Response::run()
{
receiveUdpSocket=new UdpSocket(this);
receiveUdpSocket->bind(5824);
connect(receiveUdpSocket,SIGNAL(done(QByteArray)),SLOT(writeFile(QByteArray)));
connect(this,SIGNAL(doneWrite()),SLOT(soundOut()));
connect(player,SIGNAL(stateChanged(QMediaPlayer::State)),this,SLOT(playOver()));
exec();
}
soundOut()和playOver()如下:
void Response::soundOut()
{
player->setMedia(QUrl::fromLocalFile("c:\\data\\testReceive"+QString::number(playCount,10)+".amr"));
player->setVolume(90);
player->play();
}
void Response::playOver()
{
if(player->state()==QMediaPlayer::StoppedState){
QDir dir;
dir.remove("c:\\data\\testReceive"+QString::number(playCount,10)+".amr");
}
}
线程启动后,writeFile(QByteArray)能正确运行,但是soundOut()和playOver()都没有结果,即不能播放声音和删除文件。但是经过测试,这两个函数是运行过的(因为在这两个函数里加入在界面上输出内容的语句时,程序会运行后自动退出,删除这些语句后就不会退出)。
我想问问这是什么问题,是因为在另外开的线程中不能使用音频输出设备和删除硬盘上的文件吗?
收藏
分享
发短消息
加为好友
shiroki
(shiroki)
当前离线
UID
3
帖子
751
精华
1
积分
2076
阅读权限
100
在线时间
114 小时
注册时间
2009-4-23
最后登录
2010-9-3
版主
2
#
shiroki
发表于 2010-7-9 17:46
|
只看该作者
补充一个, QMediaPlayer不是标准的Qt类, 是Qt Mobility里带的
bbs和blog站点
http://www.cuteqt.com
喜欢的话就收藏+订阅吧~
TOP
发短消息
加为好友
tingsking
当前离线
UID
570
帖子
53
精华
0
积分
135
阅读权限
20
来自
山东
在线时间
15 小时
注册时间
2010-6-29
最后登录
2010-8-30
注册会员
3
#
tingsking
发表于 2010-7-9 19:44
|
只看该作者
大姐头和zhu是同一个人?
QMediaPlayer是不是继承QWidget?
试试:
1.首先确保在主线程中使用音频输出设备和删除硬盘上的文件可以运行。
2.其次,写一个简单的多线程程序,在子线程中删除文件和使用音频设备。
3.因为在这两个函数里加入在界面上输出内容的语句时,程序会运行后自动退出,删除这些语句后就不会退出
这是在线程中直接操作UI么?自动退出可以看一下调用栈,可以写一下map file 看看是哪里崩溃的。
blog:http://blog.csdn.net/tingsking18/
TOP
发短消息
加为好友
shiroki
(shiroki)
当前离线
UID
3
帖子
751
精华
1
积分
2076
阅读权限
100
在线时间
114 小时
注册时间
2009-4-23
最后登录
2010-9-3
版主
4
#
shiroki
发表于 2010-7-12 17:26
|
只看该作者
晕菜, 当然不是同一个人了
bbs和blog站点
http://www.cuteqt.com
喜欢的话就收藏+订阅吧~
TOP
返回列表
Qt-embedded
Qt中文相关
Qt for 其他平台(S60,WinCE,Maemo等)
Qt 安装和编译
关于本站
Qt!Qt!
Qt通用问题区
Qt 安装和编译
Qt-embedded
C++/C 语言
Qt中文相关
Qt for 其他平台(S60,WinCE,Maemo等)
Qt 衍生品
KDE
脚本Qt
Qtopia/Qt-extended
Qt项目开发区
mii设计器
qt 分享区
cutereader RSS阅读器
3D桌面软件族
Linux!Linux!
Linux使用
Linux开发
Linux 脚本
莫谈技术
招聘、广告发布
闲聊灌水
[收藏此主题]
[关注此主题的新回复]
[通过 QQ、MSN 分享给朋友]