将章节从 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