Tkinter で簡易的なメディアプレイヤーを作ろうとしたとき、OpenCVが真っ先に登場しますが、残念ながら動画再生のみで、音声まで再生してくれません。
ほかにもっと簡単な手段は無いかと探したところ、VLC Media Player を使う方法を見つけました。
Pythonから VLC の動画再生機能を使う場合、VLC Media Player のインストールが必要ですが、ポータブル向けにZip圧縮されたものが公開されているので、ここから必要なものを入手することができます。
PythonでVLCを制御するためのDLLを入手する
1.VLC Media Player ポータブル版をダウンロードする
下記のリンクに飛んで、画面をスクロースすると、一番最後に "last/" のリンクが見つかるので、これをクリックします。
https://download.videolan.org/pub/videolan/vlc/
最後に、"vlc-3.0.21-win64.zip" のリンクをクリックすると、Zip ファイルがダウンロードできます。
2.Zip ファイルを解凍し、必要なDLLを取り出す
Zip ファイルを解凍し、2つのDLLと1つのフォルダを取り出し、任意のフォルダにコピーします。
必要なDLL:libvlc.dll 、 libvlccore.dll
必要なフォルダ:plugins
python-vlc を pip でインストールする
Pythonからvlc を扱うには、 python-vlc をインストールする必要があります。
pip install python-vlc
TkinterにPythonを埋め込むコードのサンプル
下記がTkinterにVLCの動画再生機能を埋め込んだサンプルになります。
先ほど取り出した2つのDLLと1つのフォルダを、任意のフォルダにコピーしてもらいましたが、Pythonにその場所を教える必要があります。
os.add_dll_directory( DLLが置かれているフォルダのパス )
Pyファイル実行時のカレントディレクトリに DLL を入れても正しく参照してくれないので、上記の1行を記述して参照場所を明示的に指定します。
下記のサンプルは、カレントディレクトリに DLL を置いたという前提で、os.getcwd() でカレントディレクトリのパスを設定しています。
import os
# Pythonから、カレントフォルダに置かれたDLLが参照できるようにする
os.add_dll_directory(os.getcwd())
import vlc # VLCメディアプレーヤーライブラリをインポート
import tkinter as tk
# Tkinterウィンドウの作成
root = tk.Tk()
root.title("動画再生")
# 動画を表示するためのフレームを作成
frame = tk.Canvas(root)
frame.pack()
# VLCメディアプレーヤーの作成
instance = vlc.Instance("--no-xlib")
player = instance.media_player_new()
media = instance.media_new('O:\TestData\Movie/437_1280x720.mp4')
player.set_media(media)
player.set_hwnd(frame.winfo_id())
# 動画の再生/停止ボタン
start_button=tk.Button(text="再生/一時停止",width=30,command=lambda : player.pause())
start_button.pack()
# 動画再生を開始
player.play()
# Tkinterウィンドウを表示
root.mainloop()
実行すると下記の画面が表示されます。ちゃんとTkinterの画面で動画が表示されていますね。
まとめ
PythonのTkinterで音声と動画を再生させたい場合、VLC Media Player のDLLを使うのが一番手っ取り早いです。
VLC Media Player のポータブル版から、libvlc.dll 、 libvlccore.dll plugins の3つを任意のフォルダにコピーして、os.add_dll_directory() で DLL のパスを指定するところがポイントです。