将章节从 xml 转换为 ffmetadata?
Convert chapters from xml to ffmetadata?
我想在我的编码 mkvs 中添加章节,但是当我从网上下载它时我得到了 *.xml
个文件。那么有什么方法可以将它转换为 FFMETADATAFILE
以便当我使用 ffmpeg 对其进行编码时我可以将章节添加到我的 mkv 中??
示例输入
<?xml version="1.0"?>
<!-- <!DOCTYPE Chapters SYSTEM "matroskachapters.dtd"> -->
-<Chapters>
-<EditionEntry>
<EditionFlagDefault>1</EditionFlagDefault>
<EditionFlagHidden>0</EditionFlagHidden>
-<ChapterAtom>
<ChapterUID>95534594</ChapterUID>
<ChapterTimeStart>00:00:00.000000000</ChapterTimeStart>
<ChapterTimeEnd>00:01:30.000000000</ChapterTimeEnd>
<ChapterFlagHidden>0</ChapterFlagHidden>
<ChapterFlagEnabled>1</ChapterFlagEnabled>
-<ChapterDisplay>
<ChapterString>Chapter 1</ChapterString>
<ChapterLanguage>und</ChapterLanguage>
</ChapterDisplay>
</ChapterAtom>
</EditionEntry>
</Chapters>
示例输出
;FFMETADATA1
title=bike\shed
;this is a comment
artist=FFmpeg troll team
[CHAPTER]
TIMEBASE=1/1000
START=0
#chapter ends at 0:01:00
END=60000
title=chapter \#1
[STREAM]
title=multi\
line
顺便说一下,我只在 cli 模式下使用 ffmpeg。
好吧,我写了这个方便的花花公子脚本,正是这样做的。
link 至 gist
脚本
from bs4 import BeautifulSoup # pip install bs4
import re
with open(r"PATH/TO/CHAPTERS/XML/FILE.xml", 'r') as f:
soup = BeautifulSoup(f.read(), 'html.parser')
chapters = soup.select('editionentry > chapteratom')
chapters_array = []
for chapter in chapters:
time = re.search(r'(\d{2}):(\d{2}):(\d{2})', str(chapter))
hrs = int(time.group(1))
mins = int(time.group(2))
secs = int(time.group(3))
minutes = (hrs * 60) + mins
seconds = secs + (minutes * 60)
timestamp = (seconds * 1000)
chap = {
"title": re.sub(r'(=|;|#|\n)', r'\', chapter.find('chapterstring').text),
"startTime": timestamp
}
chapters_array.append(chap)
text = ";FFMETADATA1\n\n"
for i in range(len(chapters_array)-1):
chap = chapters_array[i]
title = chap['title']
start = chap['startTime']
end = chapters_array[i+1]['startTime']-1
text += f"\n[CHAPTER]\nTIMEBASE=1/1000\nSTART={start}\nEND={end}\ntitle={title}\n"
text = text.strip()
print(text)
如何使用?
将 PATH/TO/CHAPTERS/XML/FILE.xml
替换为 xml 文件的实际文件路径。
确保安装了 python 3。
运行 python -m pip install bs4
安装依赖项。
只有 运行 脚本。 (例如 python script.py
其中 script.py 是您用来保存脚本的名称)
如果您欣赏我的回答,请将其标记为该问题的已接受答案。
PS:此脚本的灵感来自 https://ikyle.me/blog/2020/add-mp4-chapters-ffmpeg
我想在我的编码 mkvs 中添加章节,但是当我从网上下载它时我得到了 *.xml
个文件。那么有什么方法可以将它转换为 FFMETADATAFILE
以便当我使用 ffmpeg 对其进行编码时我可以将章节添加到我的 mkv 中??
示例输入
<?xml version="1.0"?>
<!-- <!DOCTYPE Chapters SYSTEM "matroskachapters.dtd"> -->
-<Chapters>
-<EditionEntry>
<EditionFlagDefault>1</EditionFlagDefault>
<EditionFlagHidden>0</EditionFlagHidden>
-<ChapterAtom>
<ChapterUID>95534594</ChapterUID>
<ChapterTimeStart>00:00:00.000000000</ChapterTimeStart>
<ChapterTimeEnd>00:01:30.000000000</ChapterTimeEnd>
<ChapterFlagHidden>0</ChapterFlagHidden>
<ChapterFlagEnabled>1</ChapterFlagEnabled>
-<ChapterDisplay>
<ChapterString>Chapter 1</ChapterString>
<ChapterLanguage>und</ChapterLanguage>
</ChapterDisplay>
</ChapterAtom>
</EditionEntry>
</Chapters>
示例输出
;FFMETADATA1
title=bike\shed
;this is a comment
artist=FFmpeg troll team
[CHAPTER]
TIMEBASE=1/1000
START=0
#chapter ends at 0:01:00
END=60000
title=chapter \#1
[STREAM]
title=multi\
line
顺便说一下,我只在 cli 模式下使用 ffmpeg。
好吧,我写了这个方便的花花公子脚本,正是这样做的。 link 至 gist
脚本
from bs4 import BeautifulSoup # pip install bs4
import re
with open(r"PATH/TO/CHAPTERS/XML/FILE.xml", 'r') as f:
soup = BeautifulSoup(f.read(), 'html.parser')
chapters = soup.select('editionentry > chapteratom')
chapters_array = []
for chapter in chapters:
time = re.search(r'(\d{2}):(\d{2}):(\d{2})', str(chapter))
hrs = int(time.group(1))
mins = int(time.group(2))
secs = int(time.group(3))
minutes = (hrs * 60) + mins
seconds = secs + (minutes * 60)
timestamp = (seconds * 1000)
chap = {
"title": re.sub(r'(=|;|#|\n)', r'\', chapter.find('chapterstring').text),
"startTime": timestamp
}
chapters_array.append(chap)
text = ";FFMETADATA1\n\n"
for i in range(len(chapters_array)-1):
chap = chapters_array[i]
title = chap['title']
start = chap['startTime']
end = chapters_array[i+1]['startTime']-1
text += f"\n[CHAPTER]\nTIMEBASE=1/1000\nSTART={start}\nEND={end}\ntitle={title}\n"
text = text.strip()
print(text)
如何使用?
将 PATH/TO/CHAPTERS/XML/FILE.xml
替换为 xml 文件的实际文件路径。
确保安装了 python 3。
运行 python -m pip install bs4
安装依赖项。
只有 运行 脚本。 (例如 python script.py
其中 script.py 是您用来保存脚本的名称)
如果您欣赏我的回答,请将其标记为该问题的已接受答案。
PS:此脚本的灵感来自 https://ikyle.me/blog/2020/add-mp4-chapters-ffmpeg