8

qt5.0を使用しています。dll を作成し、すべてのオーディオ ファイルを dll 内に配置しました。現在、リソースからファイルを作成して再生しています。それはうまくいっています。

しかし問題は、ファイルを再生した後、そのファイルを削除して新しいファイルを再作成できないことです。

手動で削除しようとすると、エラーが発生します。「そのファイルを使用している他のプログラム」。プログラムを停止すると、ファイルのみを削除できます。

即時再生後にファイルを削除する方法。ここに私のコード

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";
    }
}

「オーディオが再生されました」というメッセージが表示されますが、ファイルは削除されません。

この問題を解決するのを手伝ってください。

4

2 に答える 2

4

Recently,I met the same problem. I solved it by changing the compiler from msvs to mingw. I think the Qt guys did not solve this bug as its status is 'need more information'. The code to release media file could be as follows.

player->setMedia(QMediaContent());

However, if I use mingw compiler, the video does not play in a VM win7 x86 and reports DirectShowPlayerService::doRender: Unresolved error code 80040266. This seems a deadlock to me.

于 2015-04-06T21:25:13.030 に答える
2

ドキュメントはQMediaPlayer::setMedia について教えてくれます:

このプロパティを null QMediaContent に設定すると、プレーヤーは現在のメディア ソースに関連するすべての情報を破棄し、そのメディアに関連するすべての I/O 操作を停止します。

残念ながら、これは Qt 5.1.1 を搭載した Windows 7 では機能しません。これがバグ レポートを提出した理由です。

Qt irc チャンネルの人々でさえ、Windows で QMediaPlayer を使用しないようにと私に言いました。彼らは SDL の使用を提案しました。マルチメディア API を使用したクロス プラットフォーム フレームワークとしては、少し奇妙です。

于 2013-11-10T19:06:20.450 に答える