返回列表 发帖

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()都没有结果,即不能播放声音和删除文件。但是经过测试,这两个函数是运行过的(因为在这两个函数里加入在界面上输出内容的语句时,程序会运行后自动退出,删除这些语句后就不会退出)。
我想问问这是什么问题,是因为在另外开的线程中不能使用音频输出设备和删除硬盘上的文件吗?

补充一个, QMediaPlayer不是标准的Qt类, 是Qt Mobility里带的
bbs和blog站点 http://www.cuteqt.com
喜欢的话就收藏+订阅吧~

TOP

大姐头和zhu是同一个人?
QMediaPlayer是不是继承QWidget?
试试:
1.首先确保在主线程中使用音频输出设备和删除硬盘上的文件可以运行。
2.其次,写一个简单的多线程程序,在子线程中删除文件和使用音频设备。
3.因为在这两个函数里加入在界面上输出内容的语句时,程序会运行后自动退出,删除这些语句后就不会退出
这是在线程中直接操作UI么?自动退出可以看一下调用栈,可以写一下map file 看看是哪里崩溃的。
blog:http://blog.csdn.net/tingsking18/

TOP

晕菜, 当然不是同一个人了
bbs和blog站点 http://www.cuteqt.com
喜欢的话就收藏+订阅吧~

TOP

返回列表