我一直在搜索如何将'-show_format_entry'合并到我的Python脚本中,该脚本使用ffprobe从目录中的所有音频和可视文件中提取元数据。 但是,我不希望所有格式都回馈。
我目前的剧本:
#! 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 filename',' - show_format_entry duration',' - show_format_entry size'仅获取输出中的文件名,持续时间和大小。
我还在cmnd中的'filename'之后尝试了grep | duration来隔离输出中的那些值,但它不起作用。另外,如果可以的话,我想摆脱输出中的[FORMAT] [/ FORMAT]标签,但这并非完全必要。 任何反馈都非常感谢。
答案 0 :(得分: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。
答案 1 :(得分: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]
答案 2 :(得分: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