使用 webm,而不是 m4a

使用 webm,而不是 m4a

以下软件包用于下载和编码音频:

/usr/local/bin/youtube-dl --playlist-reverse -o "%(upload_date)s %(title)s.%(ext)s" --write-annotations --download-archive ".archive" --add-metadata --write-sub --sub-lang en --write-auto-sub -f "bestaudio[ext=m4a]" -i "https://www.youtube.com/channel/CHANNEL_ID"
for name in *.m4a; do
  /usr/bin/ffmpeg -y -hide_banner -loglevel info -i "$name" -metadata artist="ArtistName" -metadata album="AlbumName" -acodec libmp3lame -ar 44100 -ac 1 -ab 192k "${name%.*}_192.mp3"
done

当在十六进制查看器中查看生成的文件时,可以以二进制形式查看原始视频的描述,但是在 Tag&Rename 3.5.5 中加载该文件时,标准“描述”ID3 标签中没有任何内容。

并且标准的“URL”ID3 标签既不显示在标签和重命名中,也不以二进制形式存在。

如何将描述和 URL 导入到正确的位置?

答案1

使用 webm,而不是 m4a

M4A 多路复用器不包含 URL 元数据,因此您的 MP3 命令一开始就没有它。

改用 WebM 。youtube-dl使用-f "bestaudio[ext=webm]"-f "bestaudio[ext=m4a]"

因此现在将包含 URL 元数据。但是,这只能部分解决 URL 和评论/描述元数据问题。

ffmpeg MP3 元数据很奇怪

由于某种原因ffmpeg使用用户定义文本信息框(TXXX) 用于注释/描述和 URL,而不是正确的标签标识符。因此,尽管元数据在那里,但您的播放器/标记器可能会忽略它。

我不知道有哪个工具可以让你重新分配现有的标签,所以可以考虑询问softwarerecs.stackexchange.com

否则,您必须使用工具手动执行此操作,例如在使用 WebM 文件中的元数据eyeD3对 MP3 进行编码后:ffmpeg

eyeD3 --user-url-frame ":$(ffprobe -v error -show_entries format_tags=PURL -of csv=p=0 "input.webm")" --add-comment "$(ffprobe -v error -show_entries format_tags=DESCRIPTION -of csv=p=0 "input.webm")" --remove-frame TXXX input.mp3

更新

在 eyeD3 命令行参数中,冒号应该正确转义,否则它们将被识别为分隔符:

#!/bin/bash
name="f.webm"
# Get the URL
video_url=$(ffprobe -v error -show_entries format_tags=PURL -of csv=p=0 "$name")
# Replace ":" with "\:"
video_url="${video_url//:/\:}"
# Write the URL
eyeD3 --user-url-frame ":$video_url" "${name%.*}.mp3"

更新 2

如果描述文本为空,eyeD3则会引发异常,并且不会执行此步骤后应执行的任何任务。我查看了它的源代码 - 这种行为是设计使然,无法通过某些命令行开关关闭。这意味着在检查相应变量不为空后,应单独执行每个操作:

if [[ ! -z "$video_url" ]]
then
  # Run eyeD3 only if variable is not empty because eyeD3 raises an exception and will not do any other tasks that might succeed
  eyeD3 --user-url-frame ":$video_url" "${name%.*}.mp3"
fi
if [[ ! -z "$video_dsc" ]]
then
  # Run eyeD3 only if variable is not empty because eyeD3 raises an exception and will not do any other tasks that might succeed
  eyeD3 --add-comment "$video_dsc" "${name%.*}.mp3"
fi
eyeD3 --remove-frame TXXX "${name%.*}.mp3"

相关内容