bash - 使用 bash 在 ffmpeg 中添加带空格的 mp3 元数据

标签 bash ffmpeg youtube-dl

这个问题在这里已经有了答案:





When should I wrap quotes around a shell variable?

(5 个回答)


2年前关闭。




我有这个关于下载 youtube 视频的 bash 脚本,然后使用 youtube-dl 和 ffmpeg 将其转换为 mp3。

#!/bin/bash

ytlink=""
outputFileName=""
title=""
artist=""
album=""

while getopts l:o:t:r:b: flag; do
  case "${flag}" in
    l) ytlink="${OPTARG}";;
    o) outputFileName="${OPTARG}";;
    t) title="${OPTARG}";;
    r) artist="${OPTARG}";;
    b) album="${OPTARG}";;
  esac
done

youtube-dl "$ytlink" --add-metadata --extract-audio --audio-format mp3 --output "temp.%(ext)s"

tempFilename="temp.mp3"
outputFileName="$outputFileName.mp3"

args+=("-i" "$tempFilename" "-metadata" "title='$title'" "-metadata" "artist='$artist'" "-metadata" "album='$album'" "-metadata" "comment=Source:$ytlink")
ffmpeg -loglevel debug ${args[@]} -acodec copy "$outputFileName"
rm "$tempFilename"

如果我有一个单词标题/艺术家/专辑,这个脚本很好。但是,如果我有空格,ffmpeg 会将空格之前的每个单词解释为另一个参数。这就是我在命令行上使用它的方式:
./yttomp3.sh -l "https://www.youtube.com/watch?v=KwQnSHAilOQ" -o "Lee - Autumn Day" -t "Autumn Day" -r "Lee" -b "(Free) Lo-fi Type Beat - Autumn Day"
ffmpeg 的调试输出:
Splitting the commandline.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument 'debug'.
Reading option '-i' ... matched as input url with argument 'temp.mp3'.
Reading option '-metadata' ... matched as option 'metadata' (add metadata) with argument 'title='Autumn'.
Reading option 'Day'' ... matched as output url.
Reading option '-metadata' ... matched as option 'metadata' (add metadata) with argument 'artist='Lee''.
Reading option '-metadata' ... matched as option 'metadata' (add metadata) with argument 'album='(Free)'.
Reading option 'Lo-fi' ... matched as output url.
Reading option 'Type' ... matched as output url.
Reading option 'Beat' ... matched as output url.
Reading option '-' ... matched as output url.
Reading option 'Autumn' ... matched as output url.
Reading option 'Day'' ... matched as output url.
Reading option '-metadata' ... matched as option 'metadata' (add metadata) with argument 'comment=Source:https://www.youtube.com/watch?v=KwQnSHAilOQ'.
Reading option '-acodec' ... matched as option 'acodec' (force audio codec ('copy' to copy stream)) with argument 'copy'.
Reading option 'Lee - Autumn Day.mp3' ... matched as output url.
Finished splitting the commandline.

我尝试将参数括在脚本的引号中,但它仍然无法正常工作。我应该如何处理?谢谢。

最佳答案

你正在经历皇家的痛苦来构建一个数组并精心引用你所有的字符串......然后你不引用数组。
您需要在 "${args[@]}" 周围加上双引号

关于bash - 使用 bash 在 ffmpeg 中添加带空格的 mp3 元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57942387/

相关文章:

shell - 合并视频和音频后如何删除下载的视频文件?

sql - 如何通过 ssh 和 psql 从 bash 变量运行 SQL 命令?

linux - 检查 PDF 是否可搜索

opengl - ffmpeg视频到opengl纹理

ffmpeg - 如何启用 FFMPEG 日志记录?

ffmpeg - 如何将 flv 转换为 mp4/mkv?

linux - 查找不以指定字符串结尾的文本文件的快速方法

linux - 从 sed 的更改中排除字符串

audio - 如何以编程方式调整音频文件的文件夹,使它们的响度大致相同?

python - 提取YouTube视频Python的标题