【问题标题】:BASH deletes the first letter from line (ffmpeg) [duplicate]BASH从行中删除第一个字母(ffmpeg)[重复]
【发布时间】:2020-07-01 02:45:03
【问题描述】:

输入:

# cat list
video1.mp4
video2.mp4
video3.mp4
video4.mp4

我的脚本:

#!/bin/bash

while IFS= read -r line || [[ -n "$line" ]]; do
  echo $line
  ffmpeg -i $line -c copy -bsf:v h264_mp4toannexb -f mpegts $line.ts
  echo $line

done < "./list";

rm *.ts

每第二次迭代,bash 读取“ideo2.mp4”而不是“video2.mp4”或“ideo4.mp4”而不是“video4.mp4”

全输出

+ IFS=
+ read -r line
+ echo video1.mp4
video1.mp4
+ ffmpeg -i video1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts video1.mp4.ts
...
+ echo video1.mp4
video1.mp4
+ IFS=
+ read -r line
+ echo ideo2.mp4
ideo2.mp4
+ ffmpeg -i ideo2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts ideo2.mp4.ts
...
ideo2.mp4: No such file or directory
+ echo ideo2.mp4
ideo2.mp4
+ IFS=
+ read -r line
+ echo video3.mp4
video3.mp4
+ ffmpeg -i video3.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts video3.mp4.ts
...
+ echo video3.mp4
video3.mp4
+ IFS=
+ read -r line
+ echo ideo4.mp4
ideo4.mp4
+ ffmpeg -i ideo4.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts ideo4.mp4.ts
...
ideo4.mp4: No such file or directory
+ echo ideo4.mp4
ideo4.mp4

当我评论“ffmpg ...”行时,一切正常。
在本地 Ubuntu (bash 4.4.20(1)-release) 和 VPS (debian) (bash 4.4.12(1)) 上进行测试
怎么回事?

【问题讨论】:

  • 我怀疑文件有 CRLF 行结尾,用dos2unix修复它
  • 仅在 Linux 上工作。通过 nano 创建的文件
  • set -x 放在脚本的开头,这样您就可以看到所有正在执行的语句,并扩展了变量。
  • 试试这个:for line in $(&lt; ./list); do [[ -n "$line" ]] || continue; echo $line; ffmpeg -i $line -c copy -bsf:v h264_mp4toannexb -f mpegts $line.ts; echo $line; done 不完美但应该可以测试ffmpeg吃stdin的理论。

标签: bash ffmpeg


【解决方案1】:

当我评论“ffmpg ...”行时,一切正常。

您将./list 的内容作为整个循环的标准输入传递,这意味着循环中的所有命令都可以从该标准输入中读取。

我从未使用过ffmpeg,但可能出于某种原因它正在从标准输入中读取一个字节。如果将&lt; /dev/null 添加到ffmpeg 命令(使其具有自己的空标准输入,而不是从shell 继承),它将无法与循环其余部分使用的标准输入混淆.


顺便说一句,您的引用是错误的。无需引用 ./list(因为它没有特殊字符或扩展名),相比之下,您应该$line 出现的任何地方引用它(因为添加引号更容易,并且有扩展时总是添加引号的习惯,而不是每次都向自己证明在特定情况下永远不需要引号)。所以:

ffmpeg -i "$line" -c copy -bsf:v h264_mp4toannexb -f mpegts "$line.ts" < /dev/null

【讨论】:

  • 感谢“引用”的提示
  • @LubieCiastka 您可以在 ffmpeg 中使用 -nostdin 全局选项而不是 ffmpeg ... &lt; /dev/null(这个问题已经在 SO 上问过几次,因此可能会被标记为重复)。跨度>
  • 这种情况下,可能是-yshould be set as well
猜你喜欢
  • 2023-03-12
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2012-07-19
  • 2017-03-11
  • 2018-11-09
  • 2016-09-04
相关资源
最近更新 更多