bash变量与ffmpeg循环循环

Mik*_*ike 3 bash loops ffmpeg

我写了一个skript,可以根据在时间戳上记录的视频快速创建简短的预览剪辑,我发现以后值得检查一下以进行剪切。我的带有时间戳的文件是这样写的

FILE_NAME1#MM:SS MM:SS
FILE_NAME2#MM:SS MM:SS MM:SS MM:SS
Run Code Online (Sandbox Code Playgroud)

例:

MAH01728#02:47 03:34 03:44 05:00 06:08 06:55
Run Code Online (Sandbox Code Playgroud)

该脚本如下所示:

#!/bin/bash
while read f
 do

 file=$(echo $f | cut -d"#" -f1)
 filename=${file}".MP4"
 timestamps=$(echo $f | cut -d"#" -f2)

for time in $timestamps 
 do 
  ffmpeg -ss 00:${time}.0 -i "orig/${filename}" -c copy -t 10 "preview/${file}_${time}.MP4"
 done
done < $1
Run Code Online (Sandbox Code Playgroud)

该脚本获得了我想要的预览的一半,另一方面,文件名被弄乱了,ffmpeg抱怨找不到该文件:

orig/714.MP4: No such file or directory
orig/00:58 01:25.MP4: No such file or directory
Run Code Online (Sandbox Code Playgroud)

因此,我修改了脚本以进行故障排除,并在ffmpeg命令前添加了回显-现在所有文件名都是正确的。我想念什么?

ffmpeg -ss 00:01:47.0 -i orig/MAH01714.MP4 -c copy -t 10 preview/MAH01714_01:47.MP4
ffmpeg -ss 00:02:00.0 -i orig/MAH01713.MP4 -c copy -t 10 preview/MAH01713_02:00.MP4
ffmpeg -ss 00:00:58.0 -i orig/MAH01712.MP4 -c copy -t 10 preview/MAH01712_00:58.MP4
ffmpeg -ss 00:01:25.0 -i orig/MAH01712.MP4 -c copy -t 10 preview/MAH01712_01:25.MP4
Run Code Online (Sandbox Code Playgroud)

che*_*ner 6

ffmpeg从标准输入中读取数据$1,并从read循环顶部的命令中使用该数据。从/dev/null以下位置重定向其标准输入:

while IFS="#" read file timestamps; do
  filename="$file.MP4"
  for time in $timestamps; do
    ffmpeg -ss 00:${time}.0 -i "orig/${filename}" \
           -c copy -t 10 "preview/${file}_${time}.MP4" < /dev/null
  done
done < "$1"
Run Code Online (Sandbox Code Playgroud)

echo没有从标准输入,这就是为什么你的修改使它看起来一切正常读取。

  • 或者,在`ffmpeg`中使用`-nostdin`选项。 (2认同)
  • ffmpeg是我见过的最奇怪,最奇特的软件。从stdin读取是使脚本失败并且在进行脚本调试时非常困难的最偷偷摸摸的方法。但是我不希望ffmpeg开发人员理解为什么这样做是非常错误的。感谢您的解决方案顺便说一句。 (2认同)