0

Mac OS X の Qt 4.8.1 でポッドキャストを聞くアプリケーションを作成しています。現在、MediaObjectポッドキャストの RSS アイテムからエンクロージャー URL を使用するように設定しています。

mediaObj->setCurrentSource(Phonon::MediaSource(QUrl(idx.data(Metadata::Enclosure).toString())));

注:idxは、ユーザーがウィジェットでクリックしたモデル内にQModelIndex対応するです。QStandardItemQTreeView

ただ、現在2つの問題があります。

  1. ストリームを一時停止して再開すると、最初から開始されます。あまり役に立ちません。:-(
  2. ウィジェットを使用してPhonon::SeekSlider、まだバッファリングしていないストリームの一部にスキップすると、ストリームの先頭に戻ってしまいます。

私の (潜在的に欠陥のある) 考えではmediaObj、ストリームの特定の時間から再生を開始する方法を見つけられれば、これらの問題の両方を解決できるというものです。それで、私はこれを試しました:

void BrodCastMainWin::pauseStream()
{
    //save the "left off at" point in the stream
    qDebug() << "current time is:" << currentTime;
    qDebug() << "Saving place at" << currentTimeString
             << "in item" << nowPlaying.data(Qt::DisplayRole).toString();
    //need to use QModelIndex for setData()
    QModelIndex nowPlayingHandle = nowPlaying;
    feed.setData(nowPlayingHandle, QVariant(currentTime), Metadata::LeftOffAt);
    //pause the stream
    mediaObj->pause();
}

void BrodCastMainWin::playStream()
{
    //seek to the "left off at" point in the stream
    qDebug() << "Trying to seek to" << convertTime(nowPlaying.data(Metadata::LeftOffAt).toLongLong())
             << "in item" << nowPlaying.data(Qt::DisplayRole).toString();
    mediaObj->seek(nowPlaying.data(Metadata::LeftOffAt).toLongLong());
    //play the file
    mediaObj->play();
}

注:currentTimeは、最後にtick()信号が発信された時点の時間mediaObjです。currentTime()内のメソッドを使用してこのデータを取得しようとしましたがmediaObj、うまくいきませんでした。しかし、それは別の日の戦いです。同様にcurrentTimeString、人間が読める形式の同じ情報です。

残念ながら、動作しません:-(。これは、ストリームを再生すると、そのコードで何が起こるかです:

current time is: 32153 
Saving place at "00:32" in item "Leo Laporte - The Tech Guy 867" 
switching button to 'play'

グルーヴィー。しかし、もう一度プレイしようとすると:

Trying to seek to "00:32" in item "Leo Laporte - The Tech Guy 867" 
Playing/Loading/Buffering; switching button to 'pause' 
current time is: 0 
Saving place at "00:00" in item "Leo Laporte - The Tech Guy 867" 
switching button to 'play' 
Trying to seek to "00:00" in item "Leo Laporte - The Tech Guy 867" 
Playing/Loading/Buffering; switching button to 'pause' 

私は完全に混乱しています。Phonon を望まない方法で動作させようとしているようです。私が恐れているのは、これは Phonon モジュールの長年にわたる問題のように思われることであり、別の方法でストリームを実装する必要があるかもしれません。ヘルプ?

4

1 に答える 1

1

うーん、派手になりすぎたようです。再生/一時停止に単一のボタンを使用しています。私は単にこれを変更しなければなりませんでした:

void BrodCastMainWin::handleMediaState(Phonon::State state, Phonon::State)
{
    switch (state)
    {
    case Phonon::PlayingState:
    case Phonon::LoadingState:
    case Phonon::BufferingState:
        qDebug() << "Playing/Loading/Buffering; switching button to 'pause'";
        //If we're playing, the button should pause
        ui->playPauseButton->setIcon(QIcon(":/assets/stock_media-pause.svg"));
        connect(ui->playPauseButton, SIGNAL(clicked()),
                this, SLOT(pauseStream()));
        break;
    case Phonon::PausedState:
    case Phonon::StoppedState:
        qDebug() << "switching button to 'play'";
        //if we're paused, the button should play
        ui->playPauseButton->setIcon(QIcon(":/assets/stock_media-play.svg"));
        connect(ui->playPauseButton, SIGNAL(clicked()),
                this, SLOT(playStream()));
    case Phonon::ErrorState:
        //additionally, if there's an error, do error handling.
        break;
    default:
        break;
    }
}

...これに:

void BrodCastMainWin::handleMediaState(Phonon::State state, Phonon::State)
{
    switch (state)
    {
    case Phonon::PlayingState:
        qDebug() << "Playing/Loading/Buffering; switching button to 'pause'";
        //If we're playing, the button should pause
        ui->playPauseButton->setIcon(QIcon(":/assets/stock_media-pause.svg"));
        connect(ui->playPauseButton, SIGNAL(clicked()),
                this, SLOT(pauseStream()));
        break;
    case Phonon::PausedState:
        qDebug() << "switching button to 'play'";
        //if we're paused, the button should play
        ui->playPauseButton->setIcon(QIcon(":/assets/stock_media-play.svg"));
        connect(ui->playPauseButton, SIGNAL(clicked()),
                this, SLOT(playStream()));
        break;
    case Phonon::ErrorState:
        //additionally, if there's an error, do error handling.
        break;
    case Phonon::LoadingState:
    case Phonon::BufferingState:
    case Phonon::StoppedState:
    default:
        break;
    }
}

もちろん、最終的には他の状態も処理したいと思うでしょう。しかし、これは私の最初の問題を解決します。もう 1 つの問題は、おそらく別の日まで待たなければならないでしょう。

于 2012-05-02T00:21:03.357 に答える