当在 bash 上运行时涉及点时,ffmpeg 会截断输出上的路径

当在 bash 上运行时涉及点时,ffmpeg 会截断输出上的路径

如果我有一条路径中带有点的路径,例如:

/home/user/Documents/hello/test.testing_23-24.123/test.testing_23-24.124

ffmpeg如果您将文件的路径作为参数传递,则可以找到该文件,但它会将路径名截断为在输出文件时在文件路径中遇到的第一个点。

例如,我得到了这个:

#!/bin/sh
src_folder=`pwd`

for filename in "${src_folder}"/*.MP4
  do
    ffmpeg -threads 0 -probesize 100M -analyzeduration 100M -i "${filename}" \
      -c:v libx265 -preset medium -pass 1 -tune grain -x265-params "crf=28:pmode=yes" \
      -c:a libmp3lame -q:a 9 -strict experimental "${filename%%.*}"_1stpass.mkv
  done

输出状态:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/user/Documents/hello/test.testing_23-24.123/test.testing_23-24.124/GOPR2103.MP4':

[..]

Output #0, matroska, to '/home/user/Documents/hello/test_hevc.mkv':

我们看到输出文件的文件夹路径如下:

 /home/user/Documents/hello/test.testing_23-24.123/test.testing_23-24.124

ffmpeg在遇到输出路径中的第一个点后被截断。这只发生在输出的文件名上。它还使用截断的路径作为文件名。

任何人都可以为我指出如何解决这个问题的正确方向吗?

PS:我知道一个糟糕的解决方法应该是避免使用带有点的文件夹:]

答案1

作为吉安 在评论中指出,您(无意中?)告诉 shell 从文件路径末尾删除尽可能多的字符,直到找到第一个点/句点;这就是%%后面跟着的意思.*。您可能打算去掉文件名的“扩展名”(例如MP4),在这种情况下您需要使用单个%,它表示与最短字符数。

由于您知道您正在拾取 MP4 文件,因此您可以进一步简化扩展%,只需直接要求它去掉这 4 个字符即可。

pwd当您唯一需要它的目的是收集当前目录中的文件名时,扩展也没什么意义。

使用更像这样的东西:

for filename in ./*.MP4
  do
    ffmpeg -threads 0 -probesize 100M -analyzeduration 100M \
      -i "${filename}" \
      -c:v libx265 -preset medium -pass 1 -tune grain -x265-params \
      "crf=28:pmode=yes" -c:a libmp3lame -q:a 9 -strict experimental \
      "${filename%.MP4}"_1stpass.mkv
  done

相关内容