これらの日数は、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
コードをコピーしましたが、インデントが正しくありません。使用する場合は、コードのインデントを調整してエラーを回避してください。