locked
MediaElementの早送り RRS feed

  • 質問

  • こんにちは。
    MediaElementでの操作について質問させていただきます。

    テキストを参考に動画表示のサンプルを作成したのですが、早送り巻き戻しが
    できずに困っています。
    ソースどおりなのですがなぜか動きません。
    ソースも短いので貼り付けます。

    private void Click_ForwardButton(object sender, RoutedEventArgs e)
            {
                TimelineMarkerCollection tmc = MovieContent.Markers;

                if (markerNum >= 0 && tmc.Count > markerNum + 1)
                {
                    markerNum++;
                }

                TimelineMarker tm = tmc[markerNum];
                MovieContent.Position = tm.Time;
            }
    再生している動画のマーカー情報セットを取得し、その1つのマーカーをPositionプロパティに
    代入して頭出ししているようです。

    いくつかの動画ファイルで試したのですが同じ結果でした。
    早送りボタンを押しても何も変わりません。(ほんの一瞬止まる)


    よろしくお願いいたします。
    2009年3月14日 15:15

回答

  • Silverlight の MediaElement で早送り/巻戻しはできません、と書こうと思ったのですが、早送り再生/巻戻し再生ではなく、「頭出し」という意味ですね。マーカーは何を使って指定されているでしょうか。こちらで Expression Blend を使って、作成したビデオファイルでは特に問題なく頭出しできているようです(MediaElement の CanSeek プロパティは true を返すでしょうか?)

    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。
    マイクロソフト株式会社 デベロッパー&プラットフォーム統括本部 IT技術者アドバンス テクノロジー本部 デベロッパーエバンジェリズムグループ
    2009年4月17日 8:54

すべての返信

  • Silverlight の MediaElement で早送り/巻戻しはできません、と書こうと思ったのですが、早送り再生/巻戻し再生ではなく、「頭出し」という意味ですね。マーカーは何を使って指定されているでしょうか。こちらで Expression Blend を使って、作成したビデオファイルでは特に問題なく頭出しできているようです(MediaElement の CanSeek プロパティは true を返すでしょうか?)

    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。
    マイクロソフト株式会社 デベロッパー&プラットフォーム統括本部 IT技術者アドバンス テクノロジー本部 デベロッパーエバンジェリズムグループ
    2009年4月17日 8:54
  • こんにちは、フォーラムオペレーター大久保です。

    utauta さん、フォーラムのご利用ありがとうございます。
    弊社 大野 が提示いたしました確認ポイントですが、ご覧頂きましたでしょうか?
    utauta さんからご返信をいただけるのが一番いいんですが、ひとまず 大野 の投稿を
    「回答としてマーク」させていただきました。

    もしまだ問題解決されていらっしゃらないようでしたら、遠慮なく返信ください。
    お待ちしております。


    マイクロソフト株式会社 フォーラム オペレーター 大久保 直美
    2009年6月1日 4:58
  • 本日、お客様先で同じような質問を受けたので、アイディアを共有します。

    「(プログレッシブ)ダウンロードで読み込まれているメディア」を前提にして、早送り、巻き戻しについては、音声の連続性を犠牲にすれば、次のような方法が使えます。
    Windows Media Playerのように元のメディアに対する再生速度は変えられませんが、プログラムから意図的にメディアの再生位置を前後に移動させることはできます。移動をゆっくりしていけばコマ送りのようなアクション、移動を速めれば家電での早送り・巻き戻しに近い形になります。

    ポイントは、MediaElement.Position を再生速度と異なる間隔で変化させることです。
    たとえば、なんらかボタンがクリックされたら、0.5秒ごとにPositionTickというメソッドが呼び出されるように設定し、その中でPositionを1秒ずつ進める・戻すことができます。この時、MediaElementが再生中であれば、途中の音が出ますし、一時停止状態であれば音がないコマ送りのようになります。

    // 以下、アイディアレベルをここでタイプしているので、コンパイルエラー・実行時エラーなど検証してないコードです
    // myMEはMediaElementのオブジェクトと想定します
    private DispatcherTimer m_timer;
    private int m_Direction = 0;
    private TimeSpan m_SkipInterval = new TimeSpan(0,0,0,1);
    
    private void CreatePositionTimer(TimeSpan interval)
    {
        if (m_timer == null)
        {
            m_timer = new DispatcherTimer();
            m_timer.Interval = interval; // イベントを発生させる時間間隔
            m_timer.Tick += new EventHandler(OnPositionTick);
        }
         m_timer.Start();
    }
    
    private void StopPositionTimer()
    {
        m_timer.Stop();
    }
    
    private void OnForwardClicked(object sender, RoutedEventArgs e)
    {
        m_Direction = 1; // 早送りボタンがクリックされた状態
        CreatePositionTimer(m_SkipInterval);
    }
    
    private void OnReverseClicked(object sender, RoutedEventArgs e)
    {
        m_Direction = -1;  // 巻き戻しボタンがクリックされた状態
        CreatePositionTimer(m_SkipInterval);
    }
    
    private void OnNormalClicked(object sender, RoutedEventArgs e)
    {
        m_Direction = 0;  // 通常再生モードに戻った状態
        StopPositionTimer();
    }
    
    private void PositionTick(object sender, EventArgs e)
    {    // わかりやすさのために、べたなコードで書いてます。
        if (m_Direction > 0 ) {
            myME.Position += m_SkipInterval;
        }
        else if (m_Direction < 0 ) {
            myME.Position -= m_SkipInterval;
        }    
    }
    
    2009年6月4日 14:09