はじめに
Pythonで動画を扱う際に便利なmoviepy
ライブラリを利用した際に、プログラムを実行すると「ファイルが見つかりません」と表示されました。
ファイルが見つかりません
コードを見直してもファイルパスが間違っているわけではなく、処理は問題なく完了していました。
何が原因なのか気になるので、この謎のエラーの正体を徹底的に調査することにしました。
現象が起きるコード
まず、問題が起きる状況を特定するため、単純なコードで現象が再現するか試しました。
from moviepy.editor import VideoFileClip
VIDEO_FILE_PATH = "video.mp4"
try:
with VideoFileClip(VIDEO_FILE_PATH) as video:
print(f"動画の長さを取得: {video.duration}秒")
print("正常に終了")
except Exception as e:
print(f"MoviePyでエラーが発生: {e}")
このコードを実行した結果、やはり現象が再現しました。
ファイルが見つかりません
動画の長さを取得: 15.02秒
正常に終了
原因調査
エラーの正体を突き止めるため、私は以下のステップで調査を進めました。
1. 原因ライブラリの切り分け
元のコードでは、moviepy
以外にもOpenCV (cv2)
やlibrosa
など、複数のライブラリを使用していました。
そこで、どのライブラリがエラーの原因なのかを特定するため、それぞれを単体で動かしました。
その結果、moviepy
のテストで現象が再現し、エラーメッセージの発生源はmoviepy
ライブラリの初期化処理にあると断定しました。
2. Process Monitorによる裏側の監視
原因がmoviepy
にあることはわかりましたが、moviepy
のコードのどこでエラーが起きているのかは不明です。
moviepy
は内部でffmpeg
という外部プログラムを呼び出しているため、エラーはその過程で起きている可能性が高いと推測しました。
そこで、Windowsの高度なプロセスモニタリングツール「Process Monitor (Procmon)」を使い、プログラムの裏側でどのようなファイルアクセスが行われているのかを監視しました。
Procmon
で以下のフィルタを設定し、実行中のログをキャプチャしました。
-
Process Name
がpython.exe
である -
Result
がNAME NOT FOUND
である -
Path
にffmpeg
という文字が含まれる
判明したエラーの正体
Procmon
のログを確認して、謎が解けました。
当初は、「moviepy
がffprobe.exe
という関連ファイルを見つけられずにエラーを出しているのでは?」と予想していましたが、少し違いました。
表示されたProcess Monitor
のログの抜粋がこちらです。
Process Name Operation Path Result
------------- ------------- ------------------------------------------------------------------------------------------ --------------
python.exe RegOpenKey HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ffmpeg-.... NAME NOT FOUND
これは、moviepy
がffmpeg
を実行しようとした際、Windows自身が「このプログラム(ffmpeg.exe
)に何か特別な実行設定(デバッグオプションなど)はありますか?」とレジストリを確認しにいった記録でした。
もちろん、そんな特別な設定はしていないので、結果は「見つかりません(NAME NOT FOUND)」となります。
これが、エラーメッセージの正体でした。
結論:無視してOK
結論として、moviepy
実行時に表示される「ファイルが見つかりません」は、プログラムの欠損やバグではなく、Windowsが外部プログラムを実行する際に行う正常な内部チェックのログでした。
もし同じ現象に遭遇したら、安心して無視で良いと思います。
おわりに
今回は、一見不可解なエラーメッセージの正体を調査しました。
ライブラリの裏側やOSの挙動を少し覗いてみることで、多くの学びがありました。
この記事が、同じような謎現象に遭遇した方の助けになれば幸いです。