我想将我的视频集标准化为特定的视频编解码器(例如 x265 高效视频编解码器)。我知道我可以从单个文件中获取正在使用的编解码器,例如使用“mediainfo filename | grep "Codec ID"”,它将输出视频编解码器,然后输出每个文件的音频编解码器,例如:
Codec ID : V_VP8
Codec ID : A_VORBIS
我已经查看过了man find
,但似乎不知道该如何实现。有什么想法吗?
答案1
组合find
,ffprobe
,jq
实用程序可用于打印有关所有未使用视频编解码器编码的文件的信息*.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
该示例适用于jq
1.4
。如果apt-get
版本提供了旧版本;您可以下载较新的jq
二进制文件(只需将下载的文件放在中的某个位置$PATH
,将其重命名为jq
并使其可执行chmod +x jq
:)。
答案2
您可以通过以下方式获取工作目录下编解码器特定媒体文件的排序列表:
$ mediainfo * | grep -v codec_id | grep .file_extension | cut -f2 -d: > list.txt
在哪里编解码器 ID所讨论的编解码器是(例如 h264)文件扩展名是相关容器的扩展名(例如 .mkv)
但如果文件名之间有空格,那么该命令将无法按预期工作。
答案3
您可以将这个小型 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
它。您可以从中获取它作为静态构建这里如果您的系统上尚未安装它。
然后,您可以在每个文件上调用它,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 做起来非常简单。
答案4
通过替换修复空格问题
cmd = 'ffprobe -v quiet -show_streams -print_format json ' + inputPath
和
cmd = 'ffprobe -v quiet -show_streams -print_format json ' + "\"" + inputPath + "\""