我需要将一些视频文件从 H264 批量转换为 H265。我知道我的 ffmpeg 命令行,我有一个带有相对路径的文件名 csv(我需要文件列表来驱动它,因为该位置中的一些文件已经被转换)。我现在遇到的唯一问题是从文件列表驱动转换。
我的命令行:
cat mkv-analysis.csv | while read file; do $(ffmpeg -i '$file' -c:v libx265 -x265-params crf=23 -preset medium -c:a copy -c:s copy '${file%.mkv}_new.mkv'); done;
以及数据样本:
Folder.A/file.A.mkv
Folder.B/file_b.mkv
Folder_C/file.C.mkv
那么,当我收到“$file:没有这样的文件或目录”消息时,谁能告诉我我做错了什么?
答案1
您使用单引号,$file
这意味着该变量不会扩展:
$ var="foo"
$ echo "$var"
foo
$ echo '$var'
$var
因此,您正在寻找的命令是(还有一些改进):
while read -r file; do
ffmpeg -i "$file" -c:v libx265 -x265-params crf=23 -preset medium -c:a copy -c:s copy "${file%.mkv}_new.mkv"
done < mkv-analysis.csv
请注意,没有必要cat
也绝对没有意义将命令作为命令替换( $(command)
)。仅当您想在变量中捕获命令的输出时才需要这样做。
答案2
我认为你需要类似的东西:
$ cat mkv-analysis.csv | xargs -I % ffmpeg ...
% 是参数,在您的情况下是文件路径。
假设mkv-analysis.csv
具有以下格式:
file-path1
file-path2
...
如果格式不同,您必须使用以下格式进行准备awk
: 例如:
$ awk '...awk script...' mkv-analysis.csv | xargs ffmpeg ...
最主要的是xargs
提供ffmpeg
文件,并且在这个阶段ffmpeg
应该能够找到该文件。