none
IMFMediaEngineで再生中の動画が突然停止する RRS feed

  • 質問

  • お世話になります。

    DirectX11でIMFMediaEngineを使用して動画を再生し、再生中の動画からフレームを取り出して
    テクスチャにコピーして表示するプログラムを作成しています。

    Windows8.1環境で、とある動画を再生したときに突然再生が停止する(新しいフレームが返ってこなくなる+音が止まる)現象が発生し困っています。
    エラーが発生しているかと思いましたが、IMFMediaEngineに設定したコールバックからMF_MEDIA_ENGINE_EVENT_ERRORが
    返ってこないため、エラーは発生していないようです。
    また、動画からフレームを取り出す際に判定するIMFMediaEngine::OnVideoStreamTick(LONGLONG *pPts)からは、
    停止した際もずっとS_OKが返ってきています(pPtsは停止したときの時間のままになっています)
    IMFMediaEngine::TransferVideoFrameからも同じフレームが返ってきます。

    停止する場所は毎回バラバラです。
    色々試したところ、大きなファイルサイズの動画を再生すると発生しやすい?ようです。
    動画データはIMFByteStreamで読み込み、IMFMediaEngineへと渡しています。
    Windows10環境で試した際には同様の現象は確認できていません。
    実装は下記のサンプルソースを参考に行っています。

    本事象の回避方法をご存じの方がいればご教示頂きたいです。
    よろしくお願いします。

    ■サンプルソース
    https://code.msdn.microsoft.com/windowsapps/Media-Engine-Playback-ce1c82f0

    ■問題の動画

    形式:wmv
    再生時間:1分57秒
    1600x904
    ファイルサイズ:316MB

    ■動作環境Win8.1
    Windows 8.1 pro 64bit
    メモリ 4GB
    1366x768
    Intel(R) HD Graphics 3000


    ■開発環境
    Visual Studio 2017 pro ver 15.9.16
    C++
    DirectX11.1
    Windows Kits 10.0.17763.0
    Windows 10 pro 1809 64bit
    NVIDIA GeForce GTX 1050
    2019年10月3日 11:00

回答

  • こちらの問題ですが、調べたところ自分のプログラムのバグが原因であることがわかりました。
    動画のデータを読み込む際にIMFMediaEngine::SetSourceの代わりに、IMFByteStreamを使っていたのですが、
    このIMFByteStreamの動画を読み込む処理が途中で停止していたため、IMFMediaEngineにデータが供給されなくなり、
    停止していたようでした。
    IMFMediaEngine::SetSourceを使用することで、動画の遅延は発生するのですが停止は発生しなくなったため、
    解決とさせていただきます。

    失礼しました。
    • 回答としてマーク gama55 2019年10月16日 11:01
    2019年10月16日 11:01

すべての返信

  • 調査の途中ですが、いろいろ分かったことがあるので追記します。

    まず、Win8.1だけでなく、Win10のPCでも再現しました。
    問題が発生するPCの共通点は、スペックが低めで、機能レベルが最大10_1となっています。

    また、IMFMediaEngineEx :: GetStatisticsを用いて停止した際の状況を調べました。
    停止する環境では、フレームの遅延が正常に再生する環境と比べて多く発生していました。
    このことから、機能レベルが足りていない(スペックが低い)環境では、フレームの遅延が多く発生し、
    一定の遅延が発生した場合は再生を自動的に停止する仕様になっているのではないかという風に推測しています。
    ただ、IMFMediaEngineインターフェースはDirectX11相当の機能が必須というわけではないことから、
    単純に低スペック環境(フレームのデコードで遅延が発生する環境)では起こりうる事象なのかと考えています。

    また分かったことがあれば追記します。

    ■問題が発生する環境1
    ThinkPad X121e Intel 30456GJ
    Windows 8.1 Pro 64-bit
    DDI Version: 10.1
    Feature Levels: 10.1,10.0,9.3,9.2,9.1
    Driver Model: WDDM 1.2
    Intel(R) HD Graphics 3000

    ■問題が発生する環境2

    Dell System XPS L702X
    Windows 10 Home 64-bit
    DDI Version: 11.1
    Feature Levels: 10_1,10_0,9_3,9_2,9_1
    Driver Model: WDDM 1.2
    Intel(R) HD Graphics 3000
    2019年10月10日 11:00
  • gama55さん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    おっしゃったとおりに、これは低スペック環境に関わる可能性があります。
    そしてリンクコードに問題が表示されないので、バグのように見えます。API でもエラーが発生しません。
    フィードバック ハブにフィードバックすることをお勧めします.

    どうぞよろしくお願いします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年10月11日 8:36
    モデレータ
  • Haruka 様

    回答ありがとうございます。
    確かにバグっぽい感じですね。フィードバック試してみます。
    ありがとうございます。
    2019年10月15日 1:55
  • こちらの問題ですが、調べたところ自分のプログラムのバグが原因であることがわかりました。
    動画のデータを読み込む際にIMFMediaEngine::SetSourceの代わりに、IMFByteStreamを使っていたのですが、
    このIMFByteStreamの動画を読み込む処理が途中で停止していたため、IMFMediaEngineにデータが供給されなくなり、
    停止していたようでした。
    IMFMediaEngine::SetSourceを使用することで、動画の遅延は発生するのですが停止は発生しなくなったため、
    解決とさせていただきます。

    失礼しました。
    • 回答としてマーク gama55 2019年10月16日 11:01
    2019年10月16日 11:01
  • 動画の遅延に関して追記します。
    結論として動画の遅延は、WindowsUpdateで最新になっていないWin8.1の一部の環境で、wmv形式の動画を再生したときに発生します。
    一部の環境としたのは、私の所有しているWin8.1のPC2台で片方のみ遅延が発生したためです。
    バグなのかわかりませんが、WindowsUpdateで最新に更新することで遅延が解消されました。
    Win8.1はWindowsUpdateが行われなくなる不具合がある(私の所有PC2台で再現)ため、この遅延の症状が発生する可能性が高いと思います。
    そのため、IMFMediaEngineを使う際はwmvではなく、mp4などの別の形式を使うのがいいかもしれません。
    2019年10月28日 4:05