Re: SaveDrawScreenについて ( No.1 ) |
- 名前:けんけん 日時:2017/02/17 13:53
上記に追加で、SaveDrawScreen以外にも、SaveDrawScreenToPNG,SaveDrawScreenToJPEGがあるようですが、
Bitmap形式で保存するSaveDrawScreenの保存ファイル名を".png"とすると、Png形式で保存されていましたが、
このような使い方は良くないのでしょうか?
|
Re: SaveDrawScreenについて ( No.2 ) |
- 名前:はるかぜ 日時:2017/02/17 17:24
ファイル名を引数に渡すものは、
ファイル名のみを渡した場合は実行ファイルのあるフォルダに保存されます。
他のフォルダに保存したい場合は絶対パスか相対パスを渡してください。
絶対パスの例:"C:/保存用フォルダ/test.bmp"
相対パスの例:"../../test.bmp"
絶対パスとか相対パスとかの説明は検索すれば色々とでてきます。
また、SaveDrawScreenのファイル名を.pngにするとpng形式で保存されるわけではなく、名前がpngになっているだけで中身はbmpです。
png形式で保存したい時はSaveDrawScreenToPNGを使ってください。
|
Re: SaveDrawScreenについて ( No.3 ) |
- 名前:けんけん 日時:2017/02/20 12:11
はるかぜ様
返信ありがとうございます。
パスを設定して任意のフォルダに保存することができました。
>また、SaveDrawScreenのファイル名を.pngにするとpng形式で保存されるわけではなく、名前がpngになっているだけで中身はbmpです。
>png形式で保存したい時はSaveDrawScreenToPNGを使ってください。
わかりました!ありがとうございます。
また、現在動画を再生し動画を画像として保存するようにしているのですが、
bmp形式で保存するとサイズが大きくなってしまうので、pngまたはjpgで保存をしてみたところ
動画の再生がカクカクしてしまいました。なぜこのようになってしまうのでしょうか?
ちなみにProcessMessage()のループの中にSaveDrawScreenToPNGなどを入れて画像を保存しています。
|
Re: SaveDrawScreenについて ( No.4 ) |
- 名前:yumetodo 日時:2017/02/20 17:58
一般的な動画はfpsが29.97です(ConstantFrameRateと仮定)。
処理落ちさせないためには、1frameあたり33msで処理を終える必要があります。
Dxlibを使わずに書いてみるとわかりますが、
動画の大きさが720*408とした時、7200rpmのHDDへの書き出し速度はpng/jpegで40ms、bmpで70msかかります(Disk I/Oがボトルネック)
動画のdecodeもそこまでではなくてもやはり負荷がかかります。
対策としては
- DirectShow pluginを変えて動画decode時にハードウェアアクセラレーションできるようにする(LAV Filtersとか)
- 書き出し先をSSDやRAM diskにしてDisk I/Oの速度を上げる
- 書き出し先と読み込み元のdiskを物理的に別にする
- 書き出しをキャッシュして書き出す(OpenCV使用、いつかメモリーあふれる)
- リアルタイム処理を諦めて、確実にdecodeする(AviUtlの連番画像書き出しがこれ)
- 書き出すframeを半分くらいdropする
- 動画の読み込み/decodeと画像書き出しを別スレッドにしてタスクキュー構造で処理する(DxLibをつかわない、ffmpeg/L-SMASH WorksとOpenCV併用とか)
などがありますが、なかなか大変です。(そもそもSaveDrawScreenToxxxはそういうことに使うものではない)
リアルタイム処理を諦めて、確実にdecodeする場合はやはりDxLibではなくOpenCVを推奨します。
さすがにffmpeg直に叩いたりL-SMASH Works叩くのは辛いでしょうし(もっとも自由度は高いが)。
docs.opencv.org/3.2.0/d0/da7/videoio_overview.html
一応OpenCVでもQSVはむりでもcudaでのハードウェアアクセラレーションはありますし
(OpenCVのバックエンドのFFmepg自体はQSV対応しているが多分OpenCVからは使えなかったはず)。
プレビュー画面も欲しい場合は、OpenCVでdecodeした画像をDxLibで表示することもできます(ぐぐればここの掲示板にやり方が見つかるはず)
・・・で、それってもうAviUtlでいいのでは、という。
とにかく動画処理はDiskIOとメモリIO速度との戦いです。ハードウェアで殴れない場合は何かを妥協するしかありません。
|
Re: SaveDrawScreenについて ( No.5 ) |
- 名前:管理人 日時:2017/02/21 00:54
yumetodoさんもご返信されていますが私も…
> bmp形式で保存するとサイズが大きくなってしまうので、pngまたはjpgで保存をしてみたところ
> 動画の再生がカクカクしてしまいました。なぜこのようになってしまうのでしょうか?
bmp形式は無圧縮形式なので HDD や SSD への書き込み速度が間に合えばカクカクすることなく
保存することができますが、png形式や jpg形式は圧縮形式で、圧縮処理に非常に時間が掛かるため
大抵の場合は圧縮の処理が間に合わずカクカクしてしまうのです
|
Re: SaveDrawScreenについて ( No.6 ) |
- 名前:けんけん 日時:2017/02/21 15:56
yumetodo様
いろいろとありがとうございます。
勉強になりました。
管理人様
やはり圧縮の影響なんですね、、、
説明不足だったのですが、DXライブラリを用いた理由としまして、
背景となる動画を再生し、その上に画像を表示している状態です。
この状態を新たに動画として作成したかったため、描画先のウィンドウ
の画面を一度画像として保存したかったので今回dxライブラリを用いました。
|
Re: SaveDrawScreenについて ( No.7 ) |
- 名前:管理人 日時:2017/02/21 23:41
どのようなご事情なのかはわかりませんが、DXライブラリの動画機能はゲーム内で
『タイトル画面で放置していたらデモ動画が再生される』くらいの用途しか想定していないものですので、
動画の編集でしたらそれ専用のソフトを使用されたほうがよいと思います (・・;;
|