我使用Mp3Tag的"Tools“特性在Windows中批量运行FFmpeg,为了批量从MP3文件中提取嵌入的歌词内容(USLT框架ID3v2标签),我知道使用FFmpeg可以这样做:
-i "%_path%" -f ffmetadata "%_folderpath%\%_filename%.txt"
"%_path%“= MP3文件的完整路径
"%_folderpath%%_filename%.txt“=导出的txt文件的路径和文件名。
上面的命令从MP3文件中提取所有元数据,并将它们导出到具有以下内容的txt文件中,例如:
;FFMETADATA1
album=name of the album
artist=name of the artist
title=name of the title
lyrics-eng=[00:01.23]line1 of lyrics
\
[00:04.56]line2 of lyrics
\
[00:07.89]line3 of lyrics
\
[01:03.12]3rd last line of lyrics
\
[02:04.34]2nd last line of lyrics
\
[03:05.67]Last line of lyrics
\
date=2020
encoder=Lavf59.23.100
(原歌词使用每行带有时间戳的简单LRC格式
(歌词部分后面可能有(也可能没有)附加元数据(例如上述示例中的日期和编码器) )
如上所示,反斜杠"\“(在原始歌词中不存在)是在每一行歌词、CR (CarriageReturn)与LF (LineFeed)之间的关系(见Notepad++ ) (原始歌词使用CRLF作为EOL字符)之后添加的。
那么,我如何修改给定的命令行,以导出只有的歌词部分(导出所有其他元数据和额外的反斜杠"\"),预期文本文件内容的示例如下所示:
[00:01.23]line1 of lyrics
[00:04.56]line2 of lyrics
[00:07.89]line3 of lyrics
[01:03.12]3rd last line of lyrics
[02:04.34]2nd last line of lyrics
[03:05.67]Last line of lyrics
使用歌词(如CRLF )中的原始EOL字符
发布于 2022-04-30 06:10:44
\
并将它们替换为\n
来删除所有不需要的\s*\\\s*
。(此处测试:https://regex101.com/r/PEBWwm/1)(?<=lyrics-eng=)(?:[\w ]+\s)+
来捕捉他们之间没有\
的所有歌词。(此处测试:https://regex101.com/r/8ad6kI/1)发布于 2022-04-30 14:35:13
这增加了@另一个answer的答案:
AFAIK,FFmpeg本身没有能力只返回特定的元数据标记,更不用说修改标记值了。您的唯一选择是将FFmpeg输出输送到一个具有regex功能的命令(例如,sed
Linux命令,在PowerShell等脚本中处理regex)。
例如:
ffmpeg -i "%_path%" -f ffmetadata - | sed -n {regex_expr} "%_folderpath%\%_filename%.txt"
根据文本输出路径,您似乎处于Windows env中。如果我是你,我会学习PowerShell脚本及其正则表达式支持。
发布于 2022-05-01 02:22:56
你要找的是:
(\[[0-9].*)
无论如何,我不知道如何在提取歌词或使用命令提示符时进行编辑。如果您找不到更好的方法,并且对python有一点了解,您可以创建一个python脚本,下面的代码将其放在一个只包含的文件夹中,该文件夹只包含要编辑和运行的文件。
import re
import os
def main():
for file in os.listdir():
with open(file, "r+") as f:
lyrics = re.findall(r"(\[[0-9].*)", f.read())
f.truncate(0)
f.seek(0)
for lyric in lyrics:
f.write(lyric + "\n")
if __name__ == "__main__":
main()
https://stackoverflow.com/questions/72065693
复制相似问题