これらの日数は、Psychopy を使用して映画を再生するためのソリューションを作成する必要がありました。以前に何度か使用したことがありますが、Psychopy は常に更新されており、以前の実装にはあまり満足していませんでした。今日は整理しました。
主に使用するクラスはpsychopy.visual.MovieStim
です。このクラスにはいくつかの便利なメソッドがあります。
映画が終了したかどうかを確認する方法は?#
MovieStim.ifFinished
メソッドを使用すると、while ループ内でこの値が True かどうかを確認することで、映画が再生終了したかどうかを知ることができます。終了した場合は次のタスクに進むことができますが、終了していない場合は再生を続けます。
テスト中に再生画面からキーで抜ける方法は?#
グローバルな終了キーを追加してみましたが、おそらく私のコードに問題があるため、グローバルな終了キーは機能しませんでした。そのため、代わりに再生中にキーが押されているかどうかをチェックすることにしました。
ビデオの再生を停止するには、mov.stop()
メソッドを使用します。
ビデオの再生コード:#
while not mov.isFinished:
mov.draw()
win.flip()
if len(event.getKeys())>0:
mov.stop()
break
ビデオのサイズを自動調整する#
2 つのビデオを用意しましたが、これらのビデオのフレームサイズは異なります。自動調整を実現するために、cv2
ライブラリを使用する必要があります。
ビデオフレームのサイズを自動検出する#
import cv2
def get_movie_frame_size(movie_path):
cap = cv2.VideoCapture(movie_path)
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
cap.release()
return frame_width, frame_height
このコードは chatGPT によって生成されました。最初は chatGPT に Psychopy を使用させようとしましたが、出力が正しくありませんでした。
午後に API ドキュメントを読んだ結果、Psychopy にはmovie.size
があり、ドキュメントにはフレームのサイズを出力することができるとありましたが、テストした結果、出力結果が正しくありませんでした。chatGPT は最初に Psychopy 自体を使用して同様のアプローチをしましたが、それもうまくいきませんでした。おそらく Psychopy のインターフェースが常に更新されているため、chatGPT がそれを学習していないのかもしれません。最終的には opencv を使用してこのタスクを完了しました。
最終的なコード#
for i in range(2): #私は2つのビデオしか持っていません
video_used = cur_movie_path + video_names[i]
mov = visual.MovieStim(win, video_used,
flipVert=False, flipHoriz=False, loop=False)
frame_width, frame_height = \
get_movie_frame_size(cur_movie_path+video_names[i])
mov.size = (frame_width, frame_height)
while not mov.isFinished:
mov.draw()
win.flip()
if len(event.getKeys())>0:
mov.stop()
break
コードはコピーされており、インデントが正しくありません。使用する場合は、コードのインデントを調整してエラーを回避してください。