ビデオコレクションを特定のビデオコーデック(x265 High Efficiency Video Codecなど)で標準化したい。たとえば、 'mediainfo filename |を使用して、単一のファイルから使用中のコーデックを取得できることを知っています。 grep "Codec ID" 'これは、次のような各ファイルのビデオコーデックとオーディオコーデックを出力します。
Codec ID : V_VP8
Codec ID : A_VORBIS
man find
を確認しましたが、これを達成する方法がわかりません。何か案は?
作業ディレクトリの下にあるコーデック固有のメディアファイルのソートされたリストを取得するには、次のようにします。
$ mediainfo * | grep -v codec_id | grep .file_extension | cut -f2 -d:> list.txt
ここで、codec_idは問題のコーデック(例:h264)であり、file_extensionは問題のコンテナーの拡張子(例.mkv)です
ただし、ファイル名の名前の間に空白が含まれている場合、コマンドは希望どおりに機能しません。
find
、 ffprobe
、 jq
の組み合わせを使用して、すべての*.avi
、*.mp4
ファイルに関する情報を出力できます。 (現在のディレクトリツリーで)"h264"
ビデオコーデックを使用してエンコードされていないもの:
$ find -name \*.avi -o -name \*.mp4 \
-exec ffprobe -v quiet -show_streams -show_format -of json {} \; |
jq -c '.format.filename as $path |
.streams[]? |
select(.codec_type=="video" and .codec_name!="h264") |
{codec: .codec_name, path: $path}'
ユーティリティをインストールするには、次を実行します。
$ Sudo apt-get install ffmpeg jq findutils
この例は、jq
1.4
で機能します。 apt-get
バージョンが古いバージョンを提供する場合; 新しいjq
バイナリをダウンロードします(ダウンロードしたファイルを$PATH
のどこかに置き、jq
に名前を変更して実行可能にする:chmod +x jq
) 。
この小さなpythonスクリプトをfindと一緒に使用して、特定のコーデックを持つすべてのファイルを印刷できます。
filterByCodec.py
import os
import sys
import json
inputPath = sys.argv[1]
codec = sys.argv[2]
type = sys.argv[3]
cmd = 'ffprobe -v quiet -show_streams -print_format json ' + inputPath
output = os.popen(cmd).read()
output = json.loads(output)
if not 'streams' in output:
sys.exit(0)
for stream in output['streams']:
if stream['codec_name'] == codec and stream['codec_type'] == type:
print inputPath
sys.exit(0)
これはffprobe
を呼び出し、その出力をjson文字列に保存し、すべてのストリームを反復処理し、コーデック名とタイプが一致する場合に入力パスを出力します。これにはffprobe
が必要です。システムにインストールしていない場合は、静的ビルドとして here から取得できます。
次に、次のようにfind
を使用して、すべてのファイルで呼び出すことができます。
find . -type f -exec python filterByCodec.py {} hevc video \;
これにより、HEVCビデオコーデックを含むすべてのビデオが印刷されます。その他の例:
find . -type f -exec python filterByCodec.py {} h264 video \;
find . -type f -exec python filterByCodec.py {} mp3 audio \;
スクリプトを拡張し、それらのファイルを何らかのディレクトリまたはその他の場所に移動できます。これは次のようになります。
cmd = 'mv ' + inputPath + ' onlyhevcDir'
os.system(cmd)
これが最善の方法ではないことは知っていますが、pythonを使用すると、非常に簡単です。