通过 filelist.csv 批量转换

通过 filelist.csv 批量转换

我需要将一些视频文件从 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应该能够找到该文件。

相关内容