teratail header banner
teratail header banner
質問するログイン新規登録
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

2回答

5899閲覧

C#動画の再生中連続静止画キャプチャについて

tarataar

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2017/02/17 02:47

編集2017/02/17 06:42

0

0

閲覧ありがとうございます。

現在visalstudioにてform上の動画を再生すると再生中は静止画連続キャプチャし続けるアプリケーションを作成しています。

foreach文だとエラーが発生してしまったので、for文に再生時間ループする文を記述したのですが再生時間の秒数ぶんしかピクチャできません。
エラーはでないのですが30秒なので30枚しかピクチャできていない状態です。

for文に問題があるとは思うのですがどのように記述すれば良いかわからず困っています。
ご教示いただけると幸いです。よろしくお願い致します。

c#

1 2 private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e) 3 { 4 switch (e.newState) 5 { 6 //停止状態に入った時 7 case (int)WMPLib.WMPPlayState.wmppsStopped: 8 9 break; 10 11 //再生中に入った時 12 case (int)WMPLib.WMPPlayState.wmppsPlaying: 13 //foreach (var i in axWindowsMediaPlayer1.status) 14 for(int i=0;i < axWindowsMediaPlayer1.currentMedia.duration; i++) 15 { 16 17 18 // クライアント領域を表す四角形を取得 19 var r = this.ClientRectangle; 20 21 // スクリーンキャプチャするためのBitmapオブジェクトの生成 22 var bmp = new Bitmap(r.Width, r.Height, PixelFormat.Format32bppArgb); 23 24 // Graphicsオブジェクトの生成 25 var g = Graphics.FromImage(bmp); 26 27 // 転送元の左上座標取得 28 var upperLeftSource = this.PointToScreen(new Point(0, 0)); 29 30 // 転送先の左上座標取得 31 var upperLeftDestination = new Point(0, 0); 32 33 // CopyFromScreenメソッドでキャプチャ 34 g.CopyFromScreen( 35 upperLeftSource, upperLeftDestination, 36 this.ClientSize, CopyPixelOperation.SourceCopy); 37 38 39 //確認用にファイル出力 40 bmp.Save("C:\\entrypic\\"+i+".png"); 41 } 42 43 break; 44 45 46 //再生が全て終了した時 47 case (int)WMPLib.WMPPlayState.wmppsMediaEnded: 48 49 break; 50 51 default: 52 break; 53 } 54 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2017/02/17 03:48 編集

「途中でエラー表示され」エラーメッセージを質問に追加いただくと回答が得られやすくなると思います。
tarataar

2017/02/17 03:51

エラー内容追加させていただきました。ご指摘ありがとうございます。
guest

回答2

0

※私が回答を書いている間に質問が編集されたようなので、回答を書き直しました。

axWindowsMediaPlayer1は、AxWindowsMediaPlayer のインスタンスだと仮定します。

c#

1for(int i=0;i < axWindowsMediaPlayer1.currentMedia.duration; i++)

intでループを回しているので、axWindowsMediaPlayer1.currentMedia.durationが秒数だとすると秒ごとの画像しか保存できません。
無理やりやるなら、ここのループをforではなくwhileで回す、でしょうか。
ただ、ちょっとどうかなとは思います……。

PlayStateChangeイベントではなく、PositionChange イベントで画像を保存してはどうでしょうか。

投稿2017/02/17 06:48

編集2017/02/17 08:55
alg

総合スコア2019

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarataar

2017/02/17 07:11

回答ありがとうございます。 foreach文ですがこの記述だと実現したい事と違ったのでfor文に書き換えました。 画像の保存方法も少し考え直してみます。
guest

0

こんにちは。
パット見で回答ですが、

//確認用にファイル出力
bmp.Save("C:\entrypic\"+i+".png");

の部分で、iの中に、pathに使用することができない文字が含まれていたりしませんか?
確認していないなら、一度出力して確認してみたほうがいいと思います。

投稿2017/02/17 05:55

tamoto

総合スコア4346

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarataar

2017/02/17 06:25

こんにちは。 statusだとパスの表示はできてはいるのですが途中でパスが無くなりエラーがでている状態です。 他の方法を探ってみます。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問