使用ffmpeg将youtube-dl输出到脚本看起来没问题,但是在执行时会返回错误

时间:2016-02-19 04:40:54

标签: bash ffmpeg youtube-dl

我正在尝试使用youtube-dl获取某些视频的网址,然后将生成的网址输入到我的脚本输入中。所以在我的终端我做了

youtube-dl --ignore-config -iga ~/Desktop/youtube/videolist.txt | myscript.sh

在我的脚本中,我将事物定义为

command='ffmpeg'        
inputArgs='-i'              
outputArgs='-c:v libx264 -preset ultrafast -qp 0'       
directory="${HOME}/Desktop/Videos/"
output="video${count}"      
extension='mp4'         

我使用echo对其进行测试,以确保所有内容都以正确的顺序显示。

echo "${command}" "${inputArgs}" "${input}" "${outputArgs}" \
"${directory}""${output}${count}"."${extension}"

并且该输出看起来是正确的。但是当我尝试在没有前面的echo命令的情况下运行同样的事情时,即

"${command}" "${inputArgs}" "${input}" "${outputArgs}" \
"${directory}""${output}${count}"."${extension}"

我收到一条错误消息

  

必须至少指定一个输出文件。

因此,对我来说,在尝试执行它时,我做错了。

我试过了:

  • 引用整条线作为一个整体
  • 一起引用不同的部分
  • 在所有内容中使用exec命令

无论我做什么,过程中的某个时刻都会发生错误。我知道这很简单,我做错了。有人可以告诉我这可能是什么吗?

我非常强烈地感到.不应该只是在这样的一切中间,但我真的不知道。

同样,当我在shell参数字符串之前运行echo时,一切看起来都应该如此。

如果需要更多我正在使用的脚本来理解我在说什么,那不是问题。

2 个答案:

答案 0 :(得分:1)

您试图依靠字符串来传达多个参数。您可能希望在所有这种情况下都使用数组。数组易于使用且用途广泛(可与任何任意字符串配合使用),并且不必像抛开引号一样,不必走那么多蛋壳来避免怪癖和安全漏洞。

command='ffmpeg'
inputArgs=(-i)
outputArgs=(-c:v libx264 -preset ultrafast -qp 0
  -metadata 'title=another * string'
  -metadata 'artist=; echo "Just a string'
  -metadata "comment=Processed by my ${command} script.")
directory="${HOME}/Desktop/Videos/"
output="video${count}"
extension='mp4'
outputArgs+=(-metadata "track=${count}")

扩展数组时,引用周围必须有{}。当以"${name[@]}"的形式使用时,它的行为就像您直接在行中键入内容一样。

printf '%q\n'相比,

echo是检查命令的更有用的方法,因为它可以清楚地告诉您什么属于哪个单独的参数。
还可以将数组扩展为另一个数组数组:

whole_thing=("${command}" "${inputArgs[@]}" "${input}"
  "${outputArgs[@]}"
  "${directory}/${output}"."${extension}")

#This will output lines you can paste
# into bash to recreate the array:
printf 'whole_thing=()\n'
printf 'whole_thing+=(%q)\n' "${whole_thing[@]}"

#This will run the command:
"${whole_thing[@]}"

答案 1 :(得分:0)

问题是,因为你把它放在引号"${outputArgs}"中,它被扩展为一个参数。它不会被拆分为单独的参数,因此ffm​​peg只将其视为具有非常长的流说明符的单个-c选项。下一个参数,输出文件被解释为编解码器。

要解决此问题,只需删除引号:

"$command" $inputArgs "$input" $outputArgs "$directory$output$count.$extension"

为了节省空间,我删除了花括号({})。如果您愿意,使用它们没有任何问题。