我正在使用 Mp3tag 的“工具”功能在 Windows 中批量運行 FFmpeg,以便從 MP3 檔案中批量提取嵌入的歌詞內容(ID3v2 標簽的 USLT 幀),我知道使用 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
(原歌詞使用Simple LRC 格式,每行帶有時間戳,某些行僅包含帶有空歌詞的時間戳)
(歌詞部分之后可能(或可能沒有)額外的元資料(例如上例中的日期和編碼器))
如上所示,反斜杠“\”(原始歌詞中不存在)以某種方式添加在每行歌詞之后,在 Notepad 中看到的 CR(CarriageReturn)和 LF(LineFeed)之間(原始歌詞使用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 字符
uj5u.com熱心網友回復:
- 我建議您
\通過搜索\s*\\\s*并將其替換為\n. (在這里測驗:https ://regex101.com/r/PEBWwm/1 ) - 然后搜索
(?<=lyrics-eng=)(?:[\w ] \s)以捕獲所有歌詞,而無需\它們之間。(在這里測驗:https ://regex101.com/r/8ad6kI/1 )
uj5u.com熱心網友回復:
這增加了@anothergatsby 的答案:
AFAIK,FFmpeg 本身沒有能力只回傳特定的元資料標簽,更不用說修改標簽值了。您唯一的選擇是將 FFmpeg 輸出通過管道傳輸到支持正則運算式的命令(例如,sedLinux 命令,在 Python/PowerShell 等腳本中處理正則運算式)。
例如:
ffmpeg -i "%_path%" -f ffmetadata - | sed -n {regex_expr} "%_folderpath%\%_filename%.txt"
根據文本輸出路徑,您似乎處于 Windows 環境中。如果我是你,我會學習 PowerShell 腳本和它的正則運算式支持。
uj5u.com熱心網友回復:
您正在尋找的正則運算式是這樣的:
(\[[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://www.uj5u.com/qiye/469175.html
