web-dev-qa-db-ja.com

特定のコーデックでエンコードされていないメディアファイルを見つけるにはどうすればよいですか?

ビデオコレクションを特定のビデオコーデック(x265 High Efficiency Video Codecなど)で標準化したい。たとえば、 'mediainfo filename |を使用して、単一のファイルから使用中のコーデックを取得できることを知っています。 grep "Codec ID" 'これは、次のような各ファイルのビデオコーデックとオーディオコーデックを出力します。

Codec ID                                 : V_VP8
Codec ID                                 : A_VORBIS

man findを確認しましたが、これを達成する方法がわかりません。何か案は?

2
Elder Geek

作業ディレクトリの下にあるコーデック固有のメディアファイルのソートされたリストを取得するには、次のようにします。

$ mediainfo * | grep -v codec_id | grep .file_extension | cut -f2 -d:> list.txt

ここで、codec_idは問題のコーデック(例:h264)であり、file_extensionは問題のコンテナーの拡張子(例.mkv)です

ただし、ファイル名の名前の間に空白が含まれている場合、コマンドは希望どおりに機能しません。

1
Pavel Sayekat

findffprobejq の組み合わせを使用して、すべての*.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

この例は、jq1.4で機能します。 apt-getバージョンが古いバージョンを提供する場合; 新しいjqバイナリをダウンロードします(ダウンロードしたファイルを$PATHのどこかに置き、jqに名前を変更して実行可能にする:chmod +x jq

1
jfs

この小さな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を使用すると、非常に簡単です。

1
incBrain