【问题标题】:bash variable changes in loop with ffmpeg使用ffmpeg在循环中更改bash变量
【发布时间】:2019-02-21 18:18:54
【问题描述】:

我写了一个脚本,以便从我记录在时间戳上的视频快速创建简短的预览剪辑,我发现这些视频值得稍后查看以进行剪辑。 我的带有时间戳的文件是这样写的

FILE_NAME1#MM:SS MM:SS
FILE_NAME2#MM:SS MM:SS MM:SS MM:SS

示例:

MAH01728#02:47 03:34 03:44 05:00 06:08 06:55

脚本如下所示:

#!/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

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

orig/714.MP4: No such file or directory
orig/00:58 01:25.MP4: No such file or directory

所以我修改了故障排除脚本,只是在 ffmpeg 命令前面加上了一个 echo - 现在所有文件名都是正确的。我错过了什么?

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

【问题讨论】:

标签: bash loops ffmpeg


【解决方案1】:

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"

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

【讨论】:

  • 或者,使用ffmpeg 中的-nostdin 选项。
  • 太好了。我不知道您可以在 while 循环中指定 IFS 并分配多个变量。瘦了很多。这对我有用。
  • @LordNeckbeard 谢谢你也试过了,这行它可以工作: ffmpeg -nostdin -ss 00:${time}.0 -i "orig/${filename}" \ -c copy -t 10 "preview2/${file}_${time}.MP4"
  • ffmpeg 是我见过的最离奇、最奇特的软件。从标准输入读取是使脚本失败的最偷偷摸摸的方法,并且在这样做时很难进行故障排除。但我不希望 ffmpeg 开发人员理解为什么这样做是非常错误的。顺便说一句,感谢您的解决方案。
  • 最好解释一下为什么它从标准输入读取,以及 WONTFIXED 错误报告在哪里 :-)
猜你喜欢
  • 1970-01-01
  • 2017-06-15
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2015-10-01
相关资源
最近更新 更多