首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Mp3使用FFmpeg提取歌词(USLT帧)?

如何使用Mp3使用FFmpeg提取歌词(USLT帧)?
EN

Stack Overflow用户
提问于 2022-04-30 04:22:40
回答 3查看 303关注 0票数 1

我使用Mp3Tag的"Tools“特性在Windows中批量运行FFmpeg,为了批量从MP3文件中提取嵌入的歌词内容(USLT框架ID3v2标签),我知道使用FFmpeg可以这样做:

代码语言:javascript
运行
复制
-i "%_path%" -f ffmetadata "%_folderpath%\%_filename%.txt"

"%_path%“= MP3文件的完整路径

"%_folderpath%%_filename%.txt“=导出的txt文件的路径和文件名。

上面的命令从MP3文件中提取所有元数据,并将它们导出到具有以下内容的txt文件中,例如:

代码语言:javascript
运行
复制
;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字符)之后添加的。

那么,我如何修改给定的命令行,以导出只有的歌词部分(导出所有其他元数据和额外的反斜杠"\"),预期文本文件内容的示例如下所示:

代码语言:javascript
运行
复制
[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字符

EN

回答 3

Stack Overflow用户

发布于 2022-04-30 06:10:44

  1. 我建议您通过搜索\并将它们替换为\n来删除所有不需要的\s*\\\s*。(此处测试:https://regex101.com/r/PEBWwm/1)
  2. 然后搜索(?<=lyrics-eng=)(?:[\w ]+\s)+来捕捉他们之间没有\的所有歌词。(此处测试:https://regex101.com/r/8ad6kI/1)
票数 0
EN

Stack Overflow用户

发布于 2022-04-30 14:35:13

这增加了@另一个answer的答案:

AFAIK,FFmpeg本身没有能力只返回特定的元数据标记,更不用说修改标记值了。您的唯一选择是将FFmpeg输出输送到一个具有regex功能的命令(例如,sed Linux命令,在PowerShell等脚本中处理regex)。

例如:

代码语言:javascript
运行
复制
ffmpeg -i "%_path%" -f ffmetadata - | sed -n {regex_expr}  "%_folderpath%\%_filename%.txt"

根据文本输出路径,您似乎处于Windows env中。如果我是你,我会学习PowerShell脚本及其正则表达式支持。

票数 0
EN

Stack Overflow用户

发布于 2022-05-01 02:22:56

你要找的是:

代码语言:javascript
运行
复制
(\[[0-9].*)

无论如何,我不知道如何在提取歌词或使用命令提示符时进行编辑。如果您找不到更好的方法,并且对python有一点了解,您可以创建一个python脚本,下面的代码将其放在一个只包含的文件夹中,该文件夹只包含要编辑和运行的文件

代码语言:javascript
运行
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72065693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档