質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

2回答

3092閲覧

processingで複数の動画を順番に、時折分岐して再生させたいです。

minemoto

総合スコア11

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2019/07/15 12:19

編集2019/07/15 13:21

動画を順に、時折分岐して再生をさせたいです。

お世話になっております。
ゲームを制作しようと考えていて、そのために動画を順に、時折分岐して再生をさせたいと考えています。

仕様
**・**PC内に保存された再生したい動画を指定(動画1,動画2,動画3,…,動画N)→Enterを押す→同じウィンドウ内で動画をフルスクリーンで順番に再生させたいです。

**・**連続で再生させたいため、途中で停止・つづきから再生などどの機能は必要ありません。

**・**動画を再生して、何も押されなければまた初めから再生、Enterが押されるとその時点ですぐに次の動画を再生というのも入れたいと考えています。

**・**動画を再生した後に3つの動画の中からランダムに1本を再生するということもしたいと考えています。
イメージ説明

勉強始めた手で雑なフローチャートかもしれませんが、こういった具合のものを制作したいと考えています。

動画に関して
拡張子: mp4
動画時間: 1つあたり30秒前後
フレーム: 30フレーム

質問
上記の行いたいことを解決できるような方法をご存知であれば、よろしくお願いします。
(このようなライブラリを使用すれば、できるのではないか など)

調べてみたところ、複数の動画を同時に再生させる方法は見つけることができたのですが、
複数を順番に再生する方法は見当たりませんでした。

環境
processing3, Mac

よろしくお願い致します。

試したこと

import processing.video.*; //ビデオライブラリのインポート int whichMovie; // 状態管理の変数 Movie mov1; // Movieクラスのインスタンス Movie mov2; // Movieクラスのインスタンス Movie mov3; // Movieクラスのインスタンス void setup() { fullScreen(); mov1 = new Movie(this, "01.mp4"); mov2 = new Movie(this, "02.mp4"); mov3 = new Movie(this, "03.mp4"); whichMovie = 1; // 再生されるmovを状態として変数で管理 mov1.loop(); } void draw() { background(0, 0, 0); // 背景白 switch(whichMovie) { case 1: if (mov1.available()) { mov1.read(); } for (float j = 0; j <= height; j += mov1.height) { for (float i = 0; i <= width; i += mov1.width) { image(mov1, i, j, mov1.width, mov1.height); } } break; case 2: if (mov2.available()) { mov2.read(); } for (float j = 0; j <= height; j += mov2.height) { for (float i = 0; i <= width; i += mov2.width) { image(mov2, i, j, mov2.width, mov2.height); } } break; case 3: if (mov3.available()) { mov3.read(); } for (float j = 0; j <= height; j += mov3.height) { for (float i = 0; i <= width; i += mov3.width) { image(mov3, i, j, mov3.width, mov3.height); } } break; } } void keyPressed() { switch(whichMovie) { case '1': mov1.noLoop(); break; case '2': mov2.noLoop(); break; case '3': mov3.noLoop(); break; } case '1': mov1.jump(0); mov1.loop(); whichMovie = 1; break; case '2': mov2.jump(0); mov2.loop(); whichMovie = 2; break; case '3': mov3.jump(0); mov3.loop(); whichMovie = 3; break; } }

これだと、手動で順番に再生することはできたのですが、切り替え前の動画がバックグラウンドで再生されていて、音声が二重、三重に流れてしまいました。

なんとか実現させたいです。よろしくお願いいたします。

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

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

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

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

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

thkana

2019/07/15 13:05 編集

仕様の記述が矛盾しています。 最初は > 動画をフルスクリーンで順番に再生させたいです。 5番目で > 動画1再生した後に3つの動画の中からランダムに1本を再生する さらに下のフローチャートでは動画1の後に分岐はありません。 何が本当なのでしょう。 > 複数の動画を順に再生させる方法は見つけることができたのですが、 複数を順番に再生する方法は見当たりませんでした。 ???
minemoto

2019/07/15 13:04

申し訳ありません。上の文章は例えで述べたものなので、文章とフローチャートはリンクしていません。
thkana

2019/07/15 13:08

済みません、追記しちゃいましたのでそちらも確認して下さい。 で。リンクしていないのは構いませんが、矛盾していては困ります。それでは仕様たりえません。
minemoto

2019/07/15 13:15

ありがとうございます。修正させていただきました。
thkana

2019/07/15 13:18

仕様2番目 > 動画を再生しその動画が最後まで再生されたら、次の動画を再生 仕様4番目 > 何も押されなければまた初めから再生 これもどちらが本当ですか。
minemoto

2019/07/15 13:22

ありがとうございます。こちらも仕様2番目も無駄な文章でしたので削除させていただきました。
guest

回答2

0

ベストアンサー

Video.loop()で再生しているのにはなにか理由がありますか。Video.play()で再生すれば一回しか再生しません。
Video.duration()で動画の全長が、またVideo.time()で再生中の時間が得られます。最後まで再生が終わるとtime()の値がduration()と同じになるみたいなので(明示的なドキュメントは見つけていません)、それを監視していれば再生の終了を検知出来るでしょう。


仕様が修正されたので、少しプログラムを書いてみました。
こんなサンプルで参考になりますでしょうか。(要素の参考にするためで、仕様を書き下したものではありません)

Processing

1import processing.video.*; 2 3final int MOVIENUM=11; 4 5Movie[] movie=new Movie[MOVIENUM]; 6int n=0;//再生中の動画番号 7Movie currentMovie;//再生中の動画オブジェクト 8 9void setup() { 10 size(320, 240); 11 for (int i=0; i<MOVIENUM; i++) {//連番の動画ファイルを取得 12 movie[i]=new Movie(this, "mv"+(i+1)+".mov");//ファイルは適宜変更 13 } 14 currentMovie=movie[n];//動画を設定 15 currentMovie.loop(); 16} 17 18void draw() { 19 image(currentMovie, 0, 0); 20} 21 22void movieEvent(Movie m) { 23 m.read(); 24} 25 26void keyPressed() { 27 if (currentMovie!=null) {//オブジェクトの準備が出来る前はアクセス禁止 28 currentMovie.stop();//これまで再生中だった動画を停止 29 if (key==' ') { //スペースで順送り 30 n=(n+1)%MOVIENUM; 31 } else if (key==ENTER) { //Enterでランダム 32 n=int(random(3, 6)); 33 } 34 currentMovie=movie[n];//再生動画を設定 35 currentMovie.loop();//次の動画をループ再生 36 } 37}

上のフローチャートのように、分岐した後、動画7に必ずたどり着くようなプログラム

なんかそんな気がしていた、結局そっちも聞かれるんじゃないか、と。(質問を新しくした方がいいような気がするが)
もちろん方法はいろいろありますが、そこそこ融通を効かせられるようにこんな「考え方」はどう?

Processing

1final int[][] StoryBoard={ //再生のプログラム表 2 {0}, //選択肢を羅列する。要素一つだと選択の余地なし 3 {1}, 4 {2}, 5 {3, 4, 5}, //複数記述するとその中のどれか 6 {6}, 7 {7, 8, 9}, 8 {10} 9}; 10 11int storyIndex=0; 12int playIndex; 13 14void setup() { 15 textSize(24); //見栄えだけ 16 textAlign(CENTER, CENTER); //見栄えだけ 17 playIndex=getFirst();//最初の要素を選択 18} 19 20void draw() { 21 background(0); 22 text(playIndex+1, width/2, height/2); 23} 24 25void keyPressed() { 26 playIndex=getNext();//次の要素を選択 27} 28 29int getPlay() { 30 int n=StoryBoard[storyIndex].length; 31 return StoryBoard[storyIndex][(int)random(0, n)];//選択肢分のランダムでピックアップ 32} 33int getFirst(){ 34 storyIndex=0; 35 return getPlay(); 36} 37int getNext(){ 38 storyIndex=storyIndex+1; 39 if(storyIndex>=StoryBoard.length){ 40 storyIndex=0; 41 } 42 return getPlay(); 43}

投稿2019/07/15 13:11

編集2019/07/20 10:05
thkana

総合スコア7639

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

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

minemoto

2019/07/16 00:31

丁寧に解説していただき、本当にありがとうございます。 プログラミングをこれからきちんと学びたいと考えているので質問させていただきます。 currentMovie や movieEvent(Movie m) といった文言を今回の件で調べているとよく見かけるのですが、調べてもなかなか理解ができません。教えていただけると嬉しいです。
thkana

2019/07/16 14:47

currentMovieは適当に付けた名前なので調べてどうなるというものじゃありませんが。 int a; なんかと同じで、 Movie currentMovie; と変数を宣言してるわけで。(名前は動作に影響しないので、なんならMovie a;として、以降のcurrentMovieを全部aとしても動作は変わりません) aに値を代入するのと同様、currentMovieにmovie[n]を入れるわけです。movie[n]を入れてあるcurrentMovieについてcurrentMovie.loop()としたならばmovie[n].loop()するのと同じことになります。 movieEvent()の方は、Movieクラスに関連していて、https://processing.org/reference/libraries/video/movieEvent_.html に解説があります。再生中のMovieクラスのインスタンスで画面が準備出来ると(draw()と次のdraw()の合間に)この関数を呼び出し、引数には画像を用意したクラスインスタンスが与えられます。引数がmだったら、m.read()でその画像を読み出してmインスタンス内に蓄えるので、image(m,x,y)でその画像が表示出来る、ということになります。
thkana

2019/07/16 14:57 編集

> プログラミングをこれからきちんと学びたいと考えている のなら、ProcessingよりはJavaを勉強したほうがいいかも知れません。 Processingは、Javaに「コンピュータの専門家でなくても使えるような」ガワをかぶせたもの、という面もあります。Javaの方がプリミティブというか生というか。 そして、プログラミングについての情報はJavaの方が圧倒的に多いですから。Processingでちょっと凝ったことをやろうとするとすぐにJavaの情報を調べることになります...
minemoto

2019/07/20 05:54 編集

時間が空いてしまいました。すみません。 丁寧に教えていただき、ありがとうございます。 前回教えていただいたプログラムで、ランダムに分岐させるものがありましたが、上のフローチャートのように、分岐した後、動画7に必ずたどり着くようなプログラムを書くことができません。 switch〜とcase〜というのを使って、必ず動画7を表示させるボタンを作れば、スマートではありませんが、目的が達成できるかと思ったのですが、なかなか思った通りに動いてくれません。 なんどもお願いしてしまい大変申し訳ないのですが、よろしければ教えていただくことはできませんでしょうか。
minemoto

2019/07/21 12:22

ありがとうございます。なんとか読み取ってみます!!
guest

0

mov2.read();と呼び出す前にmov1.stop();のようにstopさせれば良いのではないでしょうか?

また、複数のウィンドウに複数の動画を表示する方法ですが、以下のサイトを参考にすると良いと思います(韓国語ですが、Chromeで開いて翻訳すれば読めます)。
https://talkingaboutme.tistory.com/372

複数のウィンドウの表示方法は、以下のサイトが分かりやすいので参考にしてください。
https://gist.github.com/atduskgreg/666e46c8408e2a33b09a

投稿2019/07/15 12:34

bamboo-nova

総合スコア1408

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問