“for i in * ; do ffpprobe -hide_banner $i 2>&1 | grep ‘ hevc ‘ ; done” とかな python な alternative

いつものように個人的メモに過ぎないのよん。

ffmpeg というか ffprobe を日常使いにしている人は、必中でストレスを感じていると信じている。ひとつには stderr 問題、もうひとつは Windows と MSYS 系から使う場合の Unicode 問題。もちろん後者の問題は ffprobe に限らないけれど、人によっては代表的に目立つのではないかと思う。これはおそらく、たとえば ffmpeg の場合は「単体ビデオしか相手にしない」ケースが多かったり、あるいはそもそもが複雑怪奇にして「素の ffmpeg なんか使ってられん」として最初から python 経由で使うことが多いなどして目立たないのに対し、ffprobe はそこまででもなく「素のあるがままの ffprobe を直接、しかも複数ファイルに対して一気に」使うことが多いから、てことではないかと思う。

Unicode まみれの大量ビデオ、を、エクスプローラで眺めてるぶんには良いが、「cp932 なコンソール」の上で動いてる MSYS (や cmd.exe や powershell.exe)とかからいざ ffprobe しようとすると相当にうっといので、てことで:

ユースケースを相当絞っていて、「色んな ffprobe の使い方」(特に「-show_streams」)を想定してない。入力ビデオのみを与えて得られる stderr に対してゴニョゴニョしたい場合にのみ嬉しい、てシロモノとして作った。ので、例えばカレントディレクトリにある MKV たちのうち「hevc」エンコードされているものを検索してそれの「Duration:」を見たい、て場合は:

1 [me@host: MyVideos]$ globffprobe.py '*.mkv' --search=' Video: hevc ' --extract 'Duration *: *[\d:.]+'

あるいは「hevc」エンコード「されていないもの」なら:

1 [me@host: MyVideos]$ globffprobe.py '*.mkv' --negate --search=' Video: hevc ' --extract 'Duration *: *[\d:.]+'

なお、「cp932 なコンソール」に対して Unicode なファイル名相手に何もせずにこのスクリプトを使う場合、cp932 で扱えない文字を「xmlcharrefreplace」してしまうようにしてあるが、これはもちろん理想とは程遠くて、ファイル名に手心を一切加えたくないならば:

  1. 環境変数 PYTHONENCODING を utf-8 にセットすべし。
  2. コンソールが cp932 のままでは utf-8 文字列は「読めない」ので、Chcp すべし。

てのが一応答え。けれどもこれは「理想は理想だが日常にするのはかなりウザい」ので注意。後者はこれは「cmd.exe の組み込みコマンド」になっていて(たぶん)、ゆえに、MSYS からセットするのはひと手間:

1 [me@host: MyVideos]$ cmd /c 'Chcp 65001'  # 1. 「-c」としてはいけない 2. 65001 は utf-8
2 [me@host: MyVideos]$ cmd /c 'Chcp 932'  # cp932 はいわゆる shift-jis

やってみればわかるんだけど、65001 生活はほとんど成り立たなくなる。例えば cat コマンドで日本語が含まれるファイルを開こうとするだけで「Permission Denied」なんてわけわからんことになる。ので、まぁ理想ばかり追い求めずに、てきとーに諦めるのが肝要かと思う。(この件は無論 ffprobe とは独立した話ね、念の為。)