2

ディレクトリ内のすべてのオーディオ ファイルとビジュアル ファイルからメタデータを抽出するために ffprobe を使用する Python スクリプトに「-show_format_entry」を組み込む方法を数日間探していました。ただし、フォーマットが返すものすべてが欲しいわけではありません。

私の現在のスクリプト:

    #! usr/bin/python
import os, sys, subprocess, shlex, re, fnmatch
from subprocess import call

def probe_file(filename):
    cmnd = ['ffprobe', '-show_format', ,'-pretty', '-loglevel' filename]
    p = subprocess.Popen(cmnd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err =  p.communicate()
    print out

mp3box=[]
for root, dirs, files in os.walk('/home/username/Music'):
  for fname in files:
    name,ext=os.path.splitext(fname)
    if fname.lower().endswith('.mp3'):
        mp3box.append(fname)
        probe_file(fname) 

出力は次のようになります。

[FORMAT]
filename=test.mp3
nb_streams=1
format_name=mp3
format_long_name=MPEG audio layer 2/3
start_time=0:00:00.000000
duration=0:03:32.943917
size=2.437 Mibyte
bit_rate=95.999 Kbit/s
TAG:album=compliments of grimriper2u@yahoo.com
TAG:artist=Charley Barnet, V=Trudy Richard
TAG:disc=sound changed and copyright for public Domain. not for resale.
TAG:genre=Jazz
TAG:TLEN=000000212342
TAG:title= Ill Wind 
TAG:date=1949
[/FORMAT]

[FORMAT]
filename=barnet.mp3
nb_streams=1
format_name=mp3
format_long_name=MPEG audio layer 2/3
start_time=0:00:00.000000
duration=0:03:32.943917
size=2.437 Mibyte
bit_rate=95.999 Kbit/s
TAG:album=compliments of grimriper2u@yahoo.com
TAG:artist=Charley Barnet, V=Trudy Richard
TAG:disc=sound changed and copyright for public Domain. not for resale.
TAG:genre=Jazz
TAG:TLEN=000000212342
TAG:title= Ill Wind 
TAG:date=1949
[/FORMAT]

私が望むのは、一般的なffprobeオプション「-show_format_entry」を使用し、「-show_format_entryファイル名」、「-show_format_entry期間」、「-show_format_entryサイズ」を指定して、出力でファイル名、期間、サイズのみを取得できるようにすることです.

出力でこれらの値を分離するために、cmnd の 'filename' の後に grep|duration も試しましたが、機能しません。また、可能であれば、出力の [FORMAT][/FORMAT] タグを取り除きたいのですが、それは完全に必要というわけではありません。フィードバックは大歓迎です。

4

3 に答える 3

2

これは、Windows 7でFFProbe 1.1.3を使用して私にとってはうまくいきました:

ffprobe -show_entries format=filename,size,duration -i d:\demos\demo1.mp3 2>NUL

FFProbe doc http://ffmpeg.org/ffprobe.htmlには、show_format_entry オプションが非推奨であり、代わりに show_entries を使用することが記載されています。

于 2013-03-28T15:00:20.587 に答える
2

出力をフォーマットするには、-ofオプションを使用します。それらのいくつかは、INI スタイル、フラット、JSON で利用できます。詳細については、 http://www.ffmpeg.org/ffprobe.html#Writersを参照してください。

$ ffprobe -show_entries format=filename,size,duration -of json -i DSC_2309.MOV 2>/dev/null
{
    "format": {
        "filename": "DSC_2309.MOV",
        "duration": "14.139125",
        "size": "19488502",
        "tags": {

        }
    }
}

$ ffprobe -show_entries format=filename,size,duration -of flat -i DSC_2309.MOV 2>/dev/null
format.filename="DSC_2309.MOV"
format.duration="14.139125"
format.size="19488502"

$ ffprobe -show_entries format=filename,size,duration -of ini -i DSC_2309.MOV 2>/dev/null
# ffprobe output

[format]
filename=DSC_2309.MOV
duration=14.139125
size=19488502

[format.tags]
于 2013-12-31T13:32:58.590 に答える
1

これはおそらく最も洗練された解決策ではありませんが、印刷する前に線をフィルタリングすることができます。それ以外の

print out

あなたは次のようなものを持つことができます

for line in out.split('\n'):
    line = line.strip()
    if (line.startswith('filename=') or
        line.startswith('duration=') or
        line.startswith('size=')):
        print line
于 2012-07-03T20:53:46.147 に答える