示例输出

示例输出

我有一个文件夹,里面有大约 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

使用命令mediainfosort我能够在不到 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 一样,但是它在部分中,就像文件名一样。VideoOverallBitRateGeneral

不同之处OverallBitRate在于视频还包含音频比特率。

正如所见,这并不是一个真正的 Python 脚本:mediainfo它本身可以完成大部分工作,因此不需要 Python 脚本。

相关内容