2013-02-26 157 views
6

我正在使用qt5.0。我創建了dll並將所有音頻文件放入dll中。現在我正在創建資源和播放文件。它工作正常。如何播放音頻並刪除QMediaPlayer中的文件?

但問題是播放文件後,我無法刪除該文件並重新創建新文件。

如果我嘗試手動刪除我也得到錯誤。 「使用該文件的其他程序」。一旦我停止該程序,然後只能刪除該文件。

如何在立即返回後刪除文件。在這裏我的代碼

player = new QMediaPlayer; 
connect(player,SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),this,SLOT(mediaStatusChanged(QMediaPlayer::MediaStatus))); 

QFile file2(QDir::tempPath() + "/temp0.mp3"); 

if (file2.open(QIODevice::ReadWrite)) 
{ 
    QFile workFile(":/AUDIO/" + fn +".mp3"); 
    if(workFile.open(QIODevice::ReadOnly)) 
    { 
     file2.write(workFile.readAll()); 
     workFile.close(); 
    } 

    file2.close(); 
} 

player->setMedia(QMediaContent(QUrl::fromLocalFile(QDir::tempPath() + "/temp0.mp3"))); 
player->setVolume(100); 
player->play(); 

void Audio::mediaStatusChanged(QMediaPlayer::MediaStatus state) 
{ 
    if(state==QMediaPlayer::EndOfMedia) 
    { 
     QFile::remove(QDir::tempPath() + "/temp0.mp3"); 
     qDebug()<<"Audio played"; 
    } 
} 

我得到「音頻打出了」的消息,但它不是在delete一個文件。

請幫我解決這個問題。

+0

是否有任何方式直接從DLL流沒有創建任何臨時文件? – Saravanan 2013-02-26 20:47:30

+0

看起來玩家可能會保留文件的句柄。如果刪除播放器對象,那麼該文件是否可以被刪除? – TheDarkKnight 2013-04-26 08:58:59

+0

好吧,我嘗試了所有的東西,但仍然出現錯誤。所以我把音頻文件放在windows/media文件夾中並在應用程序中使用。謝謝。 – Saravanan 2013-05-07 08:20:39

回答

1

docs告訴我們QMediaPlayer :: setMedia:

這個屬性設置爲空QMediaContent會導致玩家 丟棄與當前媒體源和 停止一切信息,所有I/O與該媒體相關的操作。爲什麼我提交了bug report

即使在Qt的IRC頻道的人告訴我,不要在Windows上使用QMediaPlayer這 -

不幸的是,這並不在Windows 7上使用Qt 5.1.1的工作。他們建議使用SDL。多媒體API的跨平臺框架有點奇怪。

3

最近,我遇到了同樣的問題。 我通過將編譯器從msvs更改爲mingw來解決它。 我認爲Qt的人沒有解決這個bug,因爲它的狀態是'需要更多的信息'。發佈媒體文件的代碼可能如下。

player->setMedia(QMediaContent()); 

但是,如果我用MinGW的編譯器,影像不會在一個虛擬機的win7玩的x86和報告DirectShowPlayerService::doRender: Unresolved error code 80040266。這對我來說似乎是一個僵局。