Re: DxLibで再生可能な動画の形式について ( No.20 ) |
- 名前:774 日時:2017/06/19 23:20
当方でもCitrineさんが書かれている状況が見られました。(SDが無いので色ずれは未検証)
1920x1080 29.97fps ---> △ 再生・シークOK。ただし終了しないことが1回あった (SetAlwaysRunFlagはFALSE)
1920x1080 60fps ---> × 再生後数十秒で動画が停止する。そのときCPU負荷はガクッと下がる
1280x720 29.97fps ---> × 例外発生
1280x720 60fps ---> × 例外発生
1708x960 30fps ---> × 例外発生
|
Re: DxLibで再生可能な動画の形式について ( No.21 ) |
- 名前:管理人 日時:2017/06/20 00:53
お試しいただきありがとうございます
手元の環境ではエラー終了はしませんでしたが、1280x720の動画が正常に再生されない( 色がずれる )現象を確認しました
こちらはメモリの不正なアクセスを行ってしまっているバグで、このバグを修正することで恐らく動画再生直後に
エラーが発生する現象は解消できたと思いますので、何度も申し訳ありませんがよろしければこちらの修正バージョンをお試しください m(_ _;m
https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用
https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』をして下さい)
> 2. 色の乱れ,ずれが生じる
今度こそ修正できたと思います
> @GetMovieTotalFrameToGraph()が、.mp4の時は-1を返すようです。(.ogvはOK)
すみません、失念していました
手元では実装が完了しましたので、次のアップの時には -1 が返らないようになっています m(_ _;m
( すみません、ビルドに1時間以上掛かるので、本日はアップできません orz )
ただ、Media Foundation は『フレーム数』を取得することができず『再生時間』と
『フレームレート』から算出するので、実際のフレーム数とは±1フレーム異なる値が
返るかもしれません…
> A以下のように組んだ場合、.ogvでは表示されますが、.mp4では真っ黒になります。
停止状態での Seek でも真っ黒にならないようにしてみました、よろしければお試しください
> 1920x1080@60pは30〜50秒ほどでアプリが応答しなくなります。
> 1920x1080 60fps ---> × 再生後数十秒で動画が停止する。そのときCPU負荷はガクッと下がる
こちらは手元では再現しませんでした
デコード処理が間に合わないと現象が発生するのかと思い、手元で 1920x1080 60fps の動画を二つ同時に
再生したり、再生しながらDXライブラリのビルドを行いCPU使用率100%の状態にして
再生がカクカクの状態にしたりしてみたのですが、応答しなくなることはありませんでした…
徐々にコマ落ちが激しくなり、30〜50秒ほどで正常に動作しなくなる感じでしょうか?
それとも30〜50秒経過すると突然停止するのでしょうか?
因みに手元の環境は
OS: Windows 7 Ultimate Service Pack 1 64bit
CPU:Intel Core i7-3770@3.50GHz
RAM:32GB
GPU:NVIDIA GeForce GTX 660 Ti (VRAM 2GB)
で、比較的 Citrineさんの環境と近いと思います( Windows10 ではないのが大きいかもしれませんが )
> SetAlwaysRunFlag(TRUE)の件はメインループの継続式にProcessMessage() == 0を入れているので恐らく別の原因だと思われます。
> また、この版になってからDebug,Release問わず高確率で発生するようになってしまいました。
> 1920x1080 29.97fps ---> △ 再生・シークOK。ただし終了しないことが1回あった (SetAlwaysRunFlagはFALSE)
こちらも何回試しても発生しませんでした
再生直後に異常終了するバグはメモリの不正なアクセスを行っていたことが原因だったので、
もしかしたらそのバグの修正に伴いこちらの現象も直っているかもしれません…
> 1708x960 30fps ---> × 例外発生
こちらの解像度のmp4ファイルが手元になかったので試せていませんが、恐らく例外は発生しなくなったと思います
 |
Re: DxLibで再生可能な動画の形式について ( No.22 ) |
- 名前:管理人 日時:2017/06/20 02:49
|
Re: DxLibで再生可能な動画の形式について ( No.23 ) |
- 名前:774 日時:2017/06/20 19:54
メモリ使用量も見てみました。MP4では使用量が徐々に増えていきます。
サイズ FPS 長さ 形式 タスクマネージャで見たメモリ使用量
-----------------------------------------------------------------------
@1280x720 60fps 0:10 MP4 110-->117MB (※短すぎてあまり参考にはならない)
A1280x720 29.97fps 2:10 MP4 110MB--->180MB
B1708x960 30fps 2:24 MP4 例外発生 (下記コードのWaitTimerのところで止まる)
C1708x960 30fps 2:24 OGV 119MBで安定
D1920x1080 60fps 4:21 MP4 190MB--->1766MB(!)
E1920x1080 30fps 2:20 MP4 200--->500MB(!)
F1920x1080 30fps 2:20 OGV 142MBで安定
・CFはOGVで、問題ありません。メモリ使用量は最初しばらくゆるやかに上昇、やがてピタッと停止。
・Bは再生できず。
・@ADEは再生できましたが、メモリ使用量が気になります。(特にDE)
また、MP4の再生が非常に重い? Aは10%、Dは23〜25%です。(※DをWMP12で再生すると2%くらい)
Aは https://vimeo.com/93066207 でDLできるMP4です (by Optieさん)
DはGeForceのshadowPlayでデスクトップを録画したMP4です 50Mb/s
コードは以下の通りです。
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE);
if (DxLib_Init() == -1) return -1;
int MovieGraphHandle = LoadGraph(L"xxxxxxx.mp4");
PlayMovieToGraph(MovieGraphHandle);
while (ProcessMessage() == 0)
{
DrawExtendGraph(0, 0, 640, 480, MovieGraphHandle, FALSE);
WaitTimer(17);
}
DeleteGraph(MovieGraphHandle);
DxLib_End();
return 0;
}
 |
Re: DxLibで再生可能な動画の形式について ( No.24 ) |
- 名前:Citrine 日時:2017/06/20 21:34
私の環境でも.mp4再生時のメモリ使用量の増加を確認しました
色ずれについてですが仕様外の解像度の動画ではまだ発生するケースがありますね
SetAlwaysRunFlag(TRUE)の件は条件を変えてビルドを行いましたが、x86/x64,Debug/Releaseいずれの組み合わせでもまだ発生します
・正常に再生出来た解像度
512x384
512x392
600x360
640x360
640x384
800x450
854x478
854x480
864x486
1280x720
1920x1080
320x480
480x480
540x720
・色ずれ&異常終了した解像度
720x480
716x480
720x1280
(いずれもH.264/AVCです)
また、追加で検証した際に気づいた点がいくつかありました
1. 解像度、フレームレートに関係なく常時コマ落ちが発生する
2. VFR(可変フレームレート)モードの動画で音ズレが発生する場合がある
3. SetAlwaysRunFlag(FALSE)にした状態でウインドウを非アクティブ状態にし、
再度アクティブ状態にした際にときどき再生が再開されないことがある
4. SetAlwaysRunFlag(TRUE)については再生がそのまま続くのではなく、一定の区間をループする
2.については最小フレームレートと最大フレームレートの差が大きい(fpsの変動が激しい)と起こりやすい気がします
3.は1秒ほどで再開する場合と全く開始しない場合があります
それにしても、MP4の仕様を調べていくとかなり複雑ですね...
|
Re: DxLibで再生可能な動画の形式について ( No.25 ) |
- 名前:管理人 日時:2017/06/21 02:05
お試しいただきありがとうございます
1708x960, 720x480, 716x480 で色ずれ、エラー終了が発生してしまうバグを修正してみましたので、
本当に何度も申し訳ありませんが、よろしければこちらの修正版をお試しください m(_ _;m
( 720x1280 の mp4 ファイルは用意することができなかったので確認できていません… )
https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用
https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』をして下さい)
> ・CFはOGVで、問題ありません。メモリ使用量は最初しばらくゆるやかに上昇、やがてピタッと停止。
『ピタッと停止』とは動画の再生が止まってしまうということでしょうか?
もしそうだとしますと、メモリが足りなくなったのだと思います( 32bitアプリでは 2GB しかメモリを
扱うことができず、アプリ自体が使用できるメモリは更に少ないので… )
> メモリ使用量も見てみました。MP4では使用量が徐々に増えていきます。
こちらの現象、確認できたのですが、改善方法はわかりませんでした
ループ再生を行うと、ループのタイミングで使用メモリがガクッと下がり、
その後また徐々に使用量が増加、を繰り返すので『ループ再生をしていると無尽蔵にメモリを消費してしまう』
ということはありませんでした
何か解放忘れがあったり、キャッシュをクリアするような API があるかもと思い探してみたのですが見つからず…
もう少し時間を掛けて調べる必要がありそうです…
> また、MP4の再生が非常に重い? Aは10%、Dは23〜25%です。(※DをWMP12で再生すると2%くらい)
WindowsMediaPlayer ほど動画再生に特化できていないので、CPUの負荷は WMPよりはどうしても高くなってしまいます
( 主にデコードされた画像をテクスチャに転送する処理が重いです )
申し訳ありませんがご了承ください…
> 1. 解像度、フレームレートに関係なく常時コマ落ちが発生する
再生開始からの経過時間とフレームレートから算出する「表示すべきフレーム番号」の計算が
正しく行えていないのかもしれません、調べてみます
> 2. VFR(可変フレームレート)モードの動画で音ズレが発生する場合がある
VFRの動画が手元にないので、用意してから調べてみます
( もし良いサンプル動画があるサイトなどありましたら、教えていただけると嬉しいです m(_ _;m )
> 3. SetAlwaysRunFlag(FALSE)にした状態でウインドウを非アクティブ状態にし、
> 再度アクティブ状態にした際にときどき再生が再開されないことがある
> 4. SetAlwaysRunFlag(TRUE)については再生がそのまま続くのではなく、一定の区間をループする
ご情報ありがとうございます
本日は「色ずれ+エラー終了」の修正とメモリ使用量が増え続ける現象を調べるだけで時間が尽きてしまったので、
後日調べてみます
> それにしても、MP4の仕様を調べていくとかなり複雑ですね...
動画の圧縮形式は圧縮率を上げるために様々な手法が組み合わせられているので凄く複雑ですよね
圧縮データを渡すだけでフレーム単位のデコードデータを返してくれる Media Foundation や
Ogg Theora ライブラリは本当に素晴らしいです (・・;;( それでも苦戦してしまっていますが )
 |
Re: DxLibで再生可能な動画の形式について ( No.26 ) |
- 名前:774 日時:2017/06/21 06:22
1708x960の動画が再生されることを確認いたしました。ありがとうございます。
>> ・CFはOGVで、問題ありません。メモリ使用量は最初しばらくゆるやかに上昇、やがてピタッと停止。
> 『ピタッと停止』とは動画の再生が止まってしまうということでしょうか?
メモリ使用量の増加が止まる、という意味でした。(紛らわしくてすみません)
OGVも確認してみようということで監視していると、MP4よりゆっくりですが上昇していっていたので
あれ?OGVもかーと思っていたら、ある程度のところでピタっと増加が止まり、最後まで変わりませんでした。
これは動画CもFも同じ挙動でした。
|
Re: DxLibで再生可能な動画の形式について ( No.27 ) |
- 名前:Citrine 日時:2017/06/21 21:38
720x480,716x480,720x1280いずれも正常に再生できることを確認しました。
追加で3840x2160とH.265エンコード,Matroskaコンテナの動画も再生できることを確認しました。(再生負荷は非常に高いですが...)
VFRの件ですが、どういうわけか正常に再生できるようになっていました。
条件も変えて実行しましたがいずれも正常。
今回の版で再生処理に修正が加わったのでしょうか?とりあえず検証を続けます。
|
Re: DxLibで再生可能な動画の形式について ( No.28 ) |
- 名前:yumetodo 日時:2017/06/22 02:43
>VFRの動画が手元にないので、用意してから調べてみます
AviUtlのx264guiExと自動フィールドシフトで簡単に作れますが・・・
あとはWindows 10 には初期標準機能としてゲーム画面を録画できる Game DVRで作ったmp4はvfrです。
参考になりそうなのはL-SMASH/L-SMASH Worksのメインコミッターであるmuken氏がコメントしている
pop.4-bit.jp/?p=5474&cpage=2
とか?
|
Re: DxLibで再生可能な動画の形式について ( No.29 ) |
- 名前:管理人 日時:2017/06/22 03:44
お試しいただきありがとうございます m(_ _)m
本日は
> 3. SetAlwaysRunFlag(FALSE)にした状態でウインドウを非アクティブ状態にし、
> 再度アクティブ状態にした際にときどき再生が再開されないことがある
こちらの件を修正しました、小出しのようで申し訳ありませんが、よろしければお試しください m(_ _;m
https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用
https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』をして下さい)
> メモリ使用量の増加が止まる、という意味でした。(紛らわしくてすみません)
おお、そうなのですか、再生は止まらないのですね
本日も調べてみたのですが、やはりメモリ使用量が増える原因はわかりませんでした
DXライブラリ側のプログラムに不備が見つからなかったので、Media Foundation 内部の
処理によるものの可能性が高いです
なので、とりあえず本件は一先ず保留としたいと思います m(_ _;m
> VFRの件ですが、どういうわけか正常に再生できるようになっていました。
> 条件も変えて実行しましたがいずれも正常。
> 今回の版で再生処理に修正が加わったのでしょうか?とりあえず検証を続けます。
いえ、音との同期関係のプログラムは変更していないはずです…
あと、現状のご確認をさせてください
メモリ使用量が徐々に増える不具合と VFRモードの音ズレの問題を除いた場合、残る不具合は
> @.mp4再生時に数秒停止する
> 自作プログラムを起動して.mp4を読み込ませて再生すると数秒ほど処理が停止します。
> 1. 解像度、フレームレートに関係なく常時コマ落ちが発生する
> 4. SetAlwaysRunFlag(TRUE)については再生がそのまま続くのではなく、一定の区間をループする
こちらの三つという認識で問題ないでしょうか?
> AviUtlのx264guiExと自動フィールドシフトで簡単に作れますが・・・
ご情報ありがとうございます m(_ _)m
そういえば AviUtlで mp4ファイルが作成できたのでした、自分も AviUtlで mp4ファイルを
作成したことがあるのに失念していました (・・;;
 |
Re: DxLibで再生可能な動画の形式について ( No.30 ) |
- 名前:774 日時:2017/06/22 21:31
> こちらの三つという認識で問題ないでしょうか?
さきほど何度か試したときに、「終了しない」件が再度発生しました。(2回目です)
ただ、あれこれいじっていた時だったため、Debug or Releaseだったか、そもそもその時のコードの
内容は正確にはどうだったか、などを控えておりませんでした。(SetAlwaysRunFlagをどっちにしていたか、など)
その後、何度か試したものの再発せず...
使用したMP4は上で書いた 1280x720 29.97fps https://vimeo.com/93066207 です。
そこで、疑似再現?ということで、下記コードを試してみました。(ProcessMessage()をあえて削除)
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE);
if (DxLib_Init() == -1) return -1;
SetDrawScreen(DX_SCREEN_BACK);
SetDrawMode(DX_DRAWMODE_BILINEAR);
SetAlwaysRunFlag(TRUE);
int MovieGraphHandle = LoadGraph(L"movie.mp4");
PlayMovieToGraph(MovieGraphHandle);
// while (ProcessMessage() == 0) <--- あえてここを無くしてみた
{
DrawExtendGraph(0, 0, 640, 480, MovieGraphHandle, FALSE);
WaitTimer(17);
ScreenFlip();
}
DeleteGraph(MovieGraphHandle);
DxLib_End();
return 0;
}
結果ですが、OGVは基本的に、ウィンドウや映像が一瞬表示されて(一瞬鳴って)終了します。
MP4の場合は、実行するたびに挙動が異なります。
1)OGV同様、すぐ終了する
2)音は1秒くらいで止まるが、ウィンドウは出たままで、閉じるボタンは押せない
3)音は先頭の12秒くらいをずっとループする。ウィンドウは出たままで、閉じるボタンが押せる。
⇒押すとウィンドウは閉じるが、終了しない。音は12秒くらいをループ
(なお、何秒か待っていると閉じるボタンは押せなくなる)
上で書いた vimeo にある動画でも 3) がよく発生します。(ただし、1)になる場合も多い)
ここまで書いてから気が付きましたが、
> 4. SetAlwaysRunFlag(TRUE)については再生がそのまま続くのではなく、一定の区間をループする
の件に近いのかも?しれません。
 |
Re: DxLibで再生可能な動画の形式について ( No.31 ) |
- 名前:Citrine 日時:2017/06/22 23:14
度々ありがとうございます。
復帰時に再生が再開されない問題が解消されていることを確認しました。
> 4. SetAlwaysRunFlag(TRUE)については再生がそのまま続くのではなく、一定の区間をループする
すみません、これについての説明が不足していました。
正確には、「SetAlwaysRunFlag(TRUE)を実行した状態でMP4動画の再生を行うと、起動中は正常に再生されるが、
ウィンドウを閉じてもタスクが消えず、一定区間の音声のみがループ再生される。」です。
774さんが挙げている3)の状況がまさにそれですね。
残っている問題については管理人様の認識通りです。
あと、メモリ使用量が徐々に増える問題についての追加情報ですが、
音声が入っていない動画ファイルだとこの問題は発生しないようです。
1280x720/CFR 24.00fps/AVC High@L3.1 2675kbps/AAC LC 318kbps/04:06/87.8MB
音声あり->開始直後104MB、終了時277MB
音声なし->常時93〜95MBで安定
|
Re: DxLibで再生可能な動画の形式について ( No.32 ) |
- 名前:管理人 日時:2017/06/23 02:43
 |
Re: DxLibで再生可能な動画の形式について ( No.33 ) |
- 名前:774 日時:2017/06/23 06:32
No.30のコードで試してみましたが、変わりませんでした。
上で書いた症状
1)OGV同様、すぐ終了する
2)音は1秒くらいで止まるが、ウィンドウは出たままで、閉じるボタンは押せない
3)音は先頭の12秒くらいをずっとループする。ウィンドウは出たままで、閉じるボタンが押せる。
⇒押すとウィンドウは閉じるが、終了しない。音は12秒くらいをループ
(なお、何秒か待っていると閉じるボタンは押せなくなる)
の1)と3)のいずれかになりました。正確に言うと 3)の「何秒か待っていると閉じるボタンは押せなくなる」には
ならず、しばらく待っていても押せました。(ただしウィンドウは閉じますが、音はループし続け、終了もしない)
|
Re: DxLibで再生可能な動画の形式について ( No.34 ) |
- 名前:管理人 日時:2017/06/25 01:19
お試しいただきありがとうございます m(_ _)m
> 1)OGV同様、すぐ終了する
> 2)音は1秒くらいで止まるが、ウィンドウは出たままで、閉じるボタンは押せない
> 3)音は先頭の12秒くらいをずっとループする。ウィンドウは出たままで、閉じるボタンが押せる。
> ⇒押すとウィンドウは閉じるが、終了しない。音は12秒くらいをループ
> (なお、何秒か待っていると閉じるボタンは押せなくなる)
ご情報ありがとうございます
手元の Windows10 環境で現象が再現することを確認しました
No.32 で私が推測していた箇所とは別の箇所が原因でした orz
本日こちらのバグと、
> 1. 解像度、フレームレートに関係なく常時コマ落ちが発生する
こちらのバグを修正しましたので、よろしければお試しください m(_ _;m
https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用
https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』をして下さい)
また、こちらの現象
> @.mp4再生時に数秒停止する
についてですが、Media Foundation で ogv のように停止しないようにするには
現在の状態から大きく処理を変更しなければならないことが分かりました
その変更を加えることで恐らく新しいバグが発生して、作業の完了が更に先になってしまうので
申し訳ありませんが今回は見送らせてください m(_ _;m
ただ、SetUseASyncLoadFlag( TRUE ) ; を使用した非同期読み込みを行うことで
処理を停止させずに LoadGraph を完了させることができますので、ogv より少し面倒になりますが
LoadGraph を呼ぶ前に SetUseASyncLoadFlag( TRUE ) ; を実行して、CheckHandleASyncLoad で
読み込みが完了するのを待ってから PlayMovieToGraph で再生するようにしてください m(_ _;m
> あと、メモリ使用量が徐々に増える問題についての追加情報ですが、
> 音声が入っていない動画ファイルだとこの問題は発生しないようです。
音声関係の処理で一つバグを発見したので修正したのですが、手元の環境ではメモリ使用量の増加に
変化はありませんでした
( あと、音声が入っていない動画ファイルでも、手元の環境ではメモリ使用量は増加しました )
ただ、もしかしたら前述のバグの修正で Citrineさんの環境では音声ありのmp4ファイルでも
メモリ使用量が増えなくなったかもしれませんので、よろしければお試しください m(_ _;m
 |
Re: DxLibで再生可能な動画の形式について ( No.35 ) |
- 名前:774 日時:2017/06/25 09:05
確認いたしました。
> 3)音は先頭の12秒くらいをずっとループする。ウィンドウは出たままで、閉じるボタンが押せる。
この件は発生しなくなりました。ありがとうございます。
※音声ありMP4での検証ですが、使用メモリ量は増加します。
MP4再生時に数秒停止する、の件ですが、
1) LoadGraph で時間がかかる
2) PlayMovieToGraph で時間がかかる
の2つの要素があります。「数秒かかる」のは初回ロード時などであり 1) の時間がほとんどですが、
自分的にはここの時間が少々長くても特に問題ありません。(映像と音声はプレイ前にまとめて読むので)
2)に時間がかかる点については、改善可能であればうれしいです。
PlayMovieToGraph を実行した場合、OGVの場合は 0msec で処理から帰ってくるのですが、
MP4では 80〜150msec 程度かかります。
※作っているのがリズムゲームであり、曲の途中で動画を切り替えるものもあるため、
※10フレーム近く停止すると厳しいです。
※Play⇒すぐPause⇒0にSeekしておいて、再生する時に再度Playした場合、10msec程度ですむ場合と
※変化なし(150msec)の場合あり。(もっとも、10msecでも運用は難しいです)
|
Re: DxLibで再生可能な動画の形式について ( No.36 ) |
- 名前:管理人 日時:2017/06/25 20:21
|
Re: DxLibで再生可能な動画の形式について ( No.37 ) |
- 名前:Citrine 日時:2017/06/25 21:20
更新ありがとうございます。
コマ落ちとタスクが消えない問題が解消されていることを確認しました。
メモリ使用量の件ですが、こちらの環境ではまだ起こりますねー
ffmpegで音声データを抜き取った動画ファイルを追加で作って検証しましたが、
こちらはメモリ使用量の増加は発生しないです。
OS起因の問題という可能性もあるような気がしますが、
手元にWindows10以外の環境がないため、こちらでは検証できないですね...
|
Re: DxLibで再生可能な動画の形式について ( No.38 ) |
- 名前:774 日時:2017/06/25 21:59
PlayMovieToGraphでの大幅改善を確認いたしました。ありがとうございます!
(0msecまで下がっている感じです)
メモリ消費量について調べてみました。
ある「音声ありMP4」について、TMPGEnc MPEG Smart Renderer 5で音声無し版を作って比較しました。
1920x1080, 30fps, 2:20程度です。(音声あり211MB、音声無し209MB)
音声あり 開始時メモリ200MB ---> 右肩上がりで最後には500MB!
音声無し 開始時メモリ150MB ---> 途中162MBくらいまで上がるが、基本的に↑↓でほぼ最後には154MBでおさまる
です。
ところで、ちょっと気になったことがあったので以下に示します。
下のコードのようにブレークポイントを設定し、実行してブレークし、PlayMovieToGraphが何msecかかるかを
確認したあと、数秒後にF5で続行すると、音は最初から鳴り始めますが、映像はおそらく「PlayMovieToGraphを
実行してから経過した時間」のフレームから描画されます。
(続行を押したのがブレークから5秒後なら、5秒経過したフレームから)。
これは、OGVもMP4も同じなのですが、仕様でしょうか?
int d6, d7;
d6 = DxLib::GetNowCount();
PlayMovieToGraph(MovieGraphHandle);
d7 = DxLib::GetNowCount();
d7 = d7 - d6; // <--------- この行にブレークポイント
while (ProcessMessage() == 0 && GetMovieStateToGraph(MovieGraphHandle) == 1)
{
DrawExtendGraph(0, 0, 640, 480, MovieGraphHandle, FALSE);
WaitTimer(17);
ScreenFlip();
}
|
Re: DxLibで再生可能な動画の形式について ( No.39 ) |
- 名前:管理人 日時:2017/06/25 22:13
お試しいただきありがとうございます m(_ _)m
コマ落ち問題、タスク消えない問題、PlayMovieToGraph の処理負荷問題が直ったようで何よりです
メモリ使用量についてですが、32bitアプリとして起動をして、PlayMovieToGraph の後に malloc を使用して
NULL が返ってこない限界ギリギリの量を確保して実行させましたが、タスクマネージャで確認できる
メモリ使用量は増えていくもののメモリ不足でエラーが発生するといった現象は発生しませんでした
環境が無いので 32bitバージョンの OSで 32bitアプリを実行した場合も問題なく動作するかは検証することが
できませんが、少なくとも 64bitバージョンの OSでは件の使用メモリ量の増加でアプリの動作に支障がでることは
無いような気がします
原因が分かれば修正するのですが、とりあえずはこれで Media Foundation 対応は完了としたいと思います
長い間お付き合いいただきありがとうございました m(_ _;m
> これは、OGVもMP4も同じなのですが、仕様でしょうか?
はい、仕様となります
ブレークポイントで止められた場合、ウィンドウが非アクティブになってアプリの動作が止まる場合と異なり、
DXライブラリのプログラム側はブレークポイントによってプログラムが止められたことを検知できないので、
実行を再開した際は、OSが勝手に止めてくれているサウンドは止めた直後から再生が再開され、
動画の処理は「1フレーム処理するのに物凄い時間が掛かってしまった」という扱いになりブレークポイントで
止まっていた時間が経過した状態で再生が再開されます
|