HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0531
飛角動画の再生とキャプチャ19解決


飛角

リンク

2008/5/31(Sat) 23:59:00|NO.16346

動画関係ですとmmplayとmciが使えると思いますが、Windows Media Playerでは再生できるのに、
HSPのこれらの命令では再生できない動画があります。
WMPだとDirect Show?というのがあるみたいで、それで再生させているようなことまでは分かりました。
どこかにインストール済みのコーデックの動画を再生させる解説かサンプルスクリプト等はありませんか?

それと多分Direct Showを使って指定フレームのキャプチャが出来るみたいですが、HSPで可能ですか?
hspcv.asで標準のAVIなら出来るようですが、汎用性がなく使用は控えております。

詳しい解説ページか、これらの件に詳しい方が居ましたらご教授お願いします。



この記事に返信する


レヴィン

リンク

2008/6/1(Sun) 02:39:17|NO.16349

hmm.dllのDirectShowの説明書の最後の方を読むと
幸せになれるかもしれません。



飛角

リンク

2008/6/1(Sun) 15:15:42|NO.16363

途中でメインPCが壊れてしまい、色々まだ試していませんが、再生はできました。
有難うございます。
終了時にDSHENDが自動で呼び出されるとありますが、状況によっては呼び出されず、"応答なし"になるみたいです。
こちらは終了前に故意に呼び出すことで、一様解決したみたいです。

キャプチャはDSHSETSEEKで位置を指定してHSPのbmpsaveかcvsaveで保存すれば良い
という認識で宜しいのでしょうか?



レヴィン

リンク

2008/6/2(Mon) 00:47:25|NO.16374

>>終了時にDSHENDが自動で呼び出されるとありますが、
>>状況によっては呼び出されず、"応答なし"になるみたいです。
大丈夫。俺もなるw。
状況によってって言うか、ほとんどの場合、呼び出されません。3.0以降では。
バグですが、今のところ、飛角さんの書いてる対策しかないかと。俺もそうしてます。

>>キャプチャはDSHSETSEEKで位置を指定してHSPのbmpsaveかcvsaveで保存すれば良い
>>という認識で宜しいのでしょうか?
DSHSETSEEKで位置を指定ってところはあってます。
ただ、bmpsaveでキャプチャできるのか言われると…試したこと無いんで分かりません。

できなかったら、DSHINITの第2引数を1にしてDirectGraphicsを初期化。
その後、バッファからフレームを取得して画面に表示してDGBMPSAVEで画面を保存って
方法になります。
DSHINITの第2引数〜フレームを取得して画面に表示までは同梱されてるサンプルの
movie2dgbuffer.asを参考にすればできると思います。
まぁ、このサンプル、俺の時代遅れのポンコツマシンにはかなりきついんですけどね。

とりあえず、bmpsaveでキャプチャできるのか試してから、後に書いた方法を
試してください。後のはメンドイし、楽な方がいいのですから。



飛角

リンク

2008/6/2(Mon) 00:53:27|NO.16375

キャプチャに挑戦してみましたが、bmpsaveだと保存されず、cvsaveでjpg保存してみた所
真っ黒で保存されていました。

動画のキャプチャで検索した所ハードウエアアクセラレータをなしにすればキャプチャできる
そうですが、キャプチャするたびにそれをやったのでは、ソフトウエアとして無理があります。

解決策をご存知の方宜しくお願いします。



飛角

リンク

2008/6/2(Mon) 00:58:50|NO.16376

書き込みしていたらレスが入っていました。レヴィンさん有難うございます。
現在サブ機にてテストしているのですが、非力すぎて動画処理にとても耐えられそうにありません。
来週位にはテストできると思うので、DGBMPSAVEの方試してみます。



StarratS

リンク

2008/6/2(Mon) 06:32:37|NO.16379

「○○すると幸せになれるかもしれません」って台詞は相手をバカにしているとしか思えません。



飛角

リンク

2008/6/2(Mon) 20:43:41|NO.16400

DGBMPSAVEで保存できました。まれに真っ黒になることがありますが、
メモリ不足かwait間隔の様な気がします。

ただBMP以外のフォーマットが選択できないのと、ちょっと難しすぎるのが難点です。
これ以外の方法若しくは、jpg保存や少し簡単で処理速度を早くする知恵等がありましたら
教えてください。数世代前のラップトップの為遅いのかもしれません。

以下スクリプトです

#include "hmm.as" #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define FULL_SCREEN_MODE 0 #define WINDOW_MODE 1 sdim Fname, 512 dialog "avi;*.wmv;*.mpg", 16, "ビデオ" Fname = refstr if Fname == "" { dialog "ファイルが選択がされなかったので終了します。" end } dgInit ScrMode = WINDOW_MODE dgScreen SCREEN_WIDTH, SCREEN_HEIGHT, ScrMode, 32, 0 dshInit , 1 dshLoadFname Fname, 0 dshSetMovieTodgBuffer 1, 0 dshsetseek 0, 50000 dshGetOriginalVideoSize 0, VideoWidth, VideoHeight dgGsel 0 dgBlendMode 0 dgScaleAndAngle SCREEN_WIDTH, SCREEN_HEIGHT, 0 dgRect 0, 0, VideoWidth, VideoHeight dgColor 255, 255, 255, 255 dgGcopy 1,2 dgRedraw dgbmpsave "C:\\test.bmp" dshend dgend end



飛角

リンク

2008/6/2(Mon) 22:03:51|NO.16402

今気づいたんですが、このスクリプトちょっとおかしいみたいです。
エディタから2度目以降の実行をした時、違うファイルを選択しても、前回の画像が残ったままで
同じ画像がbmpで保存されます。

もしかして、hmm.dllで呼び出されたバッファはDSHENDを呼び出してもクリアされず残ってしまうのではないでしょうか?
それに加えてDSHINITやDGINITで、ただ単に使用しますというフラグが立つだけで初期化されてないって事はないですか?

どうも挙動がおかしいです。
例えば完全に表示されていてbmpできちんと保存されていたのに、違うファイルで試し駄目だったので、
スクリプト編集して、再度前回成功していたスクリプトとファイルで実行してみると真っ黒で保存される。
こういったことの繰り返しです。

プラグインの紹介にはhsp3以降でも使用できるとありますが、これらのプラグインはきちんと動作確認はされているのでしょうか?

因みにDSHSETSEEKではなくDSHPLAYでrepeat-loopさせた場合はバッファも書き換えられているので普通に再生できました。



レヴィン

リンク

2008/6/3(Tue) 17:38:53|NO.16414

とりあえず、時間があったので俺も作ってみました。

#include "hmm.as" #define WindowWidth 640 ;ウィンドウの幅 #define WindowHight 480 ;ウィンドウの高さ #define ScreenMode 1 ;0でフル,1でウィンドウ(フルスクだと面倒なので今はウィンドウモード) SetFrame=160000 ;取得位置 NowDir=dirinfo(0) ;現在のディレクトリ onexit goto *system_end dialog "avi;*.wmv;*.mpg", 16, "ビデオ" Fname=refstr if (strlen(Fname)==0) { dialog "ファイルが選択がされなかったので終了します。" end } title ""+Fname ;ID0のウィンドウを作成(画面の真ん中に表示するため。あってもなくてもいい。) screen 0,WindowWidth,WindowHight,0,((ginfo_dispx-WindowWidth)/2),((ginfo_dispy-WindowHight)/2) dginit if (stat==DG_ERR):end ;初期化失敗時は停止 dgscreen WindowWidth,WindowHight,ScreenMode,32,0 ;ウィンドウ作成 dshinit 1,1 if (stat==DSH_ERR):end ;初期化失敗時は停止 dshloadfname ""+Fname,1 ;動画読み込み DSHGETORIGINALVIDEOSIZE 1,MovieWidth,MovieHight ;動画のXYサイズを取得 dgbuffer 1,MovieWidth,MovieHight ;バッファ作成 dggsel 1:dgcolor 0,0,0,255:dgclear ;バッファクリア(一応) DSHSETMOVIETODGBUFFER 1,1 ;バッファを関連付け dshplay 1 ;再生 dggsel 0 movie_cap_flag=0 ;フラグ count=0 *main await 0 title ""+Fname+":Seek"+Nowseek+"/"+MaxFrameNo DSHGETPLAYPOSITION 1,Nowseek,MaxFrameNo ;動画の長さを取得 stick key,0 if (key&128):goto *system_end ;ESCで終了 if (key&16):movie_cap_flag=1 dgcolor 0,0,0,255:dgclear ;画面クリア dgcolor 255,255,255,255 dgScaleAndAngle WindowWidth, WindowHight, 0 dgpos 0,0:dgrect 0,0,MovieWidth,MovieHight if (movie_cap_flag):DSHSETSEEK 1,SetFrame dggcopy 1,2 dgredraw if (movie_cap_flag):{ DSHGETPLAYPOSITION 1,Nowseek,MaxFrameNo ;動画の長さを取得 if ((SetFrame>=Nowseek)):{ chdir NowDir DGBMPSAVE "shot.bmp" count ++ } } if (count>60):goto *system_end goto *main ;終了処理 *system_end dshend dgend end

動画を再生したら、スペースキーを押して下さい。
指定位置をキャプチャします。
キーを押してから1秒間、毎フレームキャプチャします。
何でこうするかというと、
シークセット→キャプチャ→すぐ終了ってやると、
画面が更新される前に終了してしまい、正しくキャプチャできないからです。
「これくらいやれば、大丈夫だろ」ってぐらいの時間を設定しています。
ただ、これは親の速いマシンで作ったので、俺のマシンでは無理でした。

>>これらのプラグインはきちんと動作確認はされているのでしょうか?
おそらくされています。
遅いマシンでは画面の更新が追いついてないだけでしょう。多分。
あとは、こういう使い方をすると思って作ってないということもあるかと思います。

>>hmm.dllで呼び出されたバッファはDSHENDを呼び出してもクリアされず残ってしまうの
>>ではないでしょうか?
>>それに加えてDSHINITやDGINITで、ただ単に使用しますというフラグが立つだけで
>>初期化されてないって事はないですか?
そうかもしれません。dshの方はわかりませんが、dg系は実際前にありました。
ただ、そういうのは「dgcolor 0,0,0,255:dgclear:dgredraw」で消せば何とかなります。

とりあえず、シークセット→キャプチャ→すぐ終了ってやると、
正しくキャプチャできないのは確かです。俺が作ったやつみたいに、
しばらく再生してからでないと難しいかと。
これ以上のものは今の俺では無理です。申し訳ない、力になれなくて。

あと、さっき調べてたら、VFW(Video for Windows)ってのAPIを使えばできるって
ありました。
もっとも、俺はAPI詳しくないからさっぱりなんですが…


>>「○○すると幸せになれるかもしれません」って台詞は相手をバカにしているとしか思えません。
バカにしてるつもりないんですけどね…
飛角さんがそう感じたのなら謝ります。すいません。

ただ、 NO.16378レスの最後で
>>今回はまともな回答でした。(NO.16378より引用)
「今回は」ってことは、これ以外は(実際まともに答えていたとしても)まともに答えて
ないって取られても仕方のないレスをしてる人には言われたくないですよねぇ、StarratSさん?



StarratS

リンク

2008/6/3(Tue) 18:24:45|NO.16416

レヴィンさん>
>飛角さんがそう感じたのなら謝ります。すいません。
ごめん、俺がそう感じた。すいませんでした。



StarratS

リンク

2008/6/3(Tue) 18:28:16|NO.16417

ん?
>>今回はまともな回答でした。(NO.16378より引用)
>「今回は」ってことは、これ以外は(実際まともに答えていたとしても)まともに答えて
>ないって取られても仕方のないレスをしてる人
どうとられてもいいけど

>には言われたくないですよねぇ、StarratSさん?
なんで?



飛角

リンク

2008/6/3(Tue) 19:40:09|NO.16418

>>「○○すると幸せになれるかもしれません」
コピペネタ系だと思うので特に気になりませんよ。
失礼ですが雑談は他所でお願いします。

お手数かけてすみません。
PLAYせずにDGでSEEKのみだと更新されてないみたいです。DSHでSEEKのみだと表示されますので
DGBUFFERを使うと、内容の更新がきちんと出来ていないのが根本的な原因みたいですね。
DSHPLAYで再生位置指定してやることしか今の所無理なのかもしれません。

VFWは確かhspcvで扱える程度のAVIにしか対応していなかったと思います。
Directshowならインストール済みコーデックは全て再生できるので、この方法で乗り切るか
Directshow直に扱うしかなさそうです。勿論後者は私のスキルではとても無理なので、
引き続き何方か知恵をお貸しください。
宜しくお願いします。



p

リンク

2008/6/3(Tue) 21:57:13|NO.16419

hspsdk31の中に入ってるhspcv.dllのソースコードに、
ffmpegのlibavcodecを追加してやれば、
libavcodecでサポートしている動画形式なら動いてくれそうな予感がします。

スキル不足で無理でしたがorz



StarratS

リンク

2008/6/4(Wed) 06:40:54|NO.16423

飛角さん>
俺はレヴィンさんと話していたのであって、あなたとではありません。まったく…(禁止ワードにより自動的に元の文章を消しました.)だから。



StarratS

リンク

2008/6/4(Wed) 06:41:30|NO.16424

ちょwww



StarratS

リンク

2008/6/4(Wed) 06:44:33|NO.16425

はは〜ん・・・まともな回答をしたにも関わらず、因縁つけられるっていうことは、
実はそう言っておきながら、陰では俺のまともでない回答を期待していたりするんですかねぇ。



おにたま(管理人)

リンク

2008/6/4(Wed) 11:40:48|NO.16426

>StarratS さん

HSP掲示板はHSPについての話題を扱う共用の場所です。
個人的なことや、多くの人にとって関係のない書き込みはしないようお願いします。
今後も、同じような状況が続くようであれば、管理者として
アクセス制限など何らかの対策を行なっていくこともありますので、ご了承下さい。
また、このメッセージについての返信などありましたら、メールにてお願い致します。



飛角

リンク

2008/6/4(Wed) 19:33:58|NO.16434

pさん有難うございます。
しかし私のスキルではとても敷居が高くチンプンカンプンです。
ハードウエアアクセラレータの設定がレジストリにありそうなので、一時的に書き換える
という方法を思いつきましたが、逃げ道としてはちょっと頂けないかな?と思いました。

現在までの私に出来うる方法をまとめると、
1.hmm.dllでDGBUFFER及びDSHPLAYにてキャプチャする。
2.アクセラレータのレジストリ値を一時書き換え、hmm.dllのDSHSEEKでbmpsaveかcvsaveでキャプチャ
どちらもいまいちパッとしません。

やりたいことは、複数の動画の指定位置をキャプチャすることなんですが、1.だと仮に100個の動画をキャプチャ
すると、とんでもなく時間がかかるし、CPU負荷が偉いことになりそうです。

申しわはけございませんが、知恵をお貸しください。宜しくお願いします。



飛角

リンク

2008/6/6(Fri) 00:03:23|NO.16445

色々試してみたのですが、解決には至りませんでした。
現状ではHSPで動画を扱うのには、結構な制限があることが分かりイメージしていたソフトは
開発中止することにしました。

根本的にどうすることも出来なかった原因に、DGBUFFERを使うと幾つかのmpg(mpg意外にもあるかもしれません)
の再生時にタイトルがActive Movie WindowというHSPの別ウインドウで開いてしまう
という問題が出たためです。

これは当方ではどうにもなりませんでした。
サンプルであるmovie2dgbuffer.asでも同じ状況でしたので、こちらのミスではなさそうです。
ある程度作ったのですが、諦めました。

残念ですが解決にします。アドバイスくれたレヴィンさん、pさん有難うございました



ONION software Copyright 1997-2023(c) All rights reserved.