我有一个文件夹,里面有大约 300 个视频。我想按视频比特率对这些视频进行排序。我使用命令“mediainfo”来获取文件的比特率信息。是否可以编写一个脚本(可能是 Python)来使用此命令对这些视频进行排序。我对脚本不太了解,所以请解释一下 :)。提前谢谢。
答案1
我快速编写了一个 Python 脚本,该脚本针对搜索条件中的每个文件调用 mediainfo 进程,然后根据排序条件进行排序并打印出结果。请根据自己的需要进行修改。
这使用纯字符串对值进行排序。reverse=True
如果需要,您还可以添加排序方法,或者对代码执行任何您想执行的操作。此脚本要求您传递带有 ' 的参数。排序标准参数可以是 mediainfo 从文件返回的任何值。
import os, sys, glob
import pprint
# Call: python mediainfo_sort.py 'search_criteria' 'sort_criteria'
# Call example: python mediainfo_sort.py '*.avi' 'Bit rate'
files = glob.glob(sys.argv[1])
criteria = sys.argv[2]
# Will have data in format: {'file_path': {'Media Attribute', 'Value'}}
file_datas = {}
# Contruct data by calling mediainfo for all files in
for file_path in files:
mediainfo = os.popen('mediainfo "%s"' % file_path).read()
file_data = {}
infos = mediainfo.splitlines()
for info in infos:
if ':' in info:
info_split = info.split(':')
file_data[info_split[0].strip()] = info_split[1].strip()
file_datas[file_path] = file_data
# function for sorted, uses Media attribute (sort_criteria) value as sorting key
def getKey(item):
return item[1][criteria]
sorted_files = sorted(file_datas.items(), key=getKey)
# In the end just join the keys (filenames) with newline and print
print '\n'.join([x[0] for x in sorted_files])
答案2
您可能会发现查看以下内容很有帮助此主题。
以下是评论中所建议的简短摘要:
1)安装 python-nautilus 和 python-mutagensudo apt-get install python-nautilus python-mutagen
2)按照说明设置 PYTHONPATH 变量这里。
3)在 ~/.nautilus 中创建一个名为 python-extensions 的目录
4)下载这个 python 脚本并将其粘贴到 ~/.nautilus/python-extensions
5)使用以下命令重启 nautilus$ nautilus -q && nautilus &
我仍然建议通读该帖子,那里有很多有用的信息。
答案3
就像我在评论中提到的那样,这个mediainfo
命令真的非常非常慢。我认为有更好的替代方案。
话虽如此,这是我的 Python 脚本版本,可以完成这项工作(Python3):
#!/usr/bin/env python3
import os
import subprocess
directory = "/path/to/files"
# list the files in the directory
files_tosort = os.listdir(directory)
filedata = []
for file in files_tosort:
# combine filepath and file, take care of the whitespaces
filepath = directory+"/"+file; command = "mediainfo "+"'"+filepath+"'"
# get the file's data
data = subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
# extract the bitrate from the output
bitrate = [line[line.find(":")+2:].replace("Kbps", "").replace(" ", "") \
for line in data.splitlines() if "Bit rate" in line][0]
# add the found bitrate+filename to he list
filedata.append((int(bitrate), file))
# sort the list by the bitrate
filedata.sort(key=lambda item: item[0])
# print out
for item in filedata:
print("bitrate: "+str(item[0])+" Kbps\t file: "+item[1])
它创建一个输出,如下所示:
bitrate: 606 Kbps file: film1.avi
bitrate: 731 Kbps file: film10.avi
bitrate: 790 Kbps file: film4.avi
bitrate: 802 Kbps file: film3.avi
bitrate: 845 Kbps file: film6.avi
bitrate: 919 Kbps file: film7.avi
bitrate: 984 Kbps file: film5.avi
bitrate: 1023 Kbps file: film2.avi
bitrate: 1088 Kbps file: film8.avi
笔记:
如果存在文件无法读取的风险,则应在脚本中内置“try/except”,以便在这些情况下传递。
如何使用:
与任何脚本一样,将脚本复制到一个空文件中,在脚本头部设置文件路径,另存为sort_video.py
并通过以下命令运行:
python3 /path/to/sort_video.py
答案4
使用命令mediainfo
,sort
我能够在不到 10 秒的时间内对大约 100 多个视频进行排序:
mediainfo --Inform="General;%OverallBitRate% | %CompleteName% (%OverallBitRate/String%)\n" * | sort -n
但是,它根据全局视频文件比特率对视频进行排序,而不仅仅是根据视频流比特率。
示例输出
1091318 | videoA.mkv (1 091 kb/s)
1505121 | videoB.mkv (1 505 kb/s)
8803070 | videoD.mkv (8 803 kb/s)
11192962 | videoC.mkv (11.2 Mb/s)
怎么运行的
通过参数运行mediainfo
模板Inform
我们要求首先OverallBitRate
仅使用数字字符进行打印。
我们要求递归查找文件夹中所有匹配的文件*
。
然后我们将所有结果放入sort
命令中,并使用-n
参数指示我们正在对数值进行排序。
由于后面的字符%OverallBitRate%
是非数字(空格不是数字字符),因此sort -n
只会考虑第一个数字字符。这意味着在分隔总体比特率和文件名的分隔符sort -n
之前查看数字。|
笔记
每行mediainfo
似乎仅限于使用--Inform
参数的一个部分。因此,如果要打印 FileName,您只能获得 OverallBitRate,而不是 BitRate(非常接近),就像部分BitRate
中的BitRate 一样,但是它在部分中,就像文件名一样。Video
OverallBitRate
General
不同之处OverallBitRate
在于视频还包含音频比特率。
正如所见,这并不是一个真正的 Python 脚本:mediainfo
它本身可以完成大部分工作,因此不需要 Python 脚本。