不幸的是,kdenlive 不提供向 MKV 文件添加章节的方法,仅提供向 DVD 添加章节的方法。
我如何添加章节?
答案1
2012 年,^rooker发布了解决方案这个问题使用过时的 kdenlive 架构。不幸的是,他的论坛上禁止注册,否则我会把它发布在那里。
我更新了文件,现在您可以将此 XSLT 应用于任何.kdenlive
文件并恢复可用的章节。您所需要的只是xsltproc
和mkvmerge
(mkvtoolnix 的一部分)。
在kdenlive中添加标记并先保存。
我更新的 XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Chapters>
<EditionEntry>
<xsl:for-each select="mlt/playlist/property[contains(@name, 'marker')]">
<xsl:variable name="step1" select="translate(@name, 'kdenlive:marker', '')"/>
<xsl:variable name="time" select="substring($step1, 3, string-length($step1) - 3)"/>
<xsl:variable name="seconds" select="$time mod 60" />
<xsl:variable name="minutes" select="floor($time div 60) mod 60" />
<xsl:variable name="hours" select="floor(($time div 60) div 60)" />
<!-- hh:mm:ss.msec -->
<xsl:variable name="timecode">
<xsl:value-of select="format-number($hours, '00')"/>:<xsl:value-of select="format-number($minutes, '00')"/>:<xsl:value-of select="format-number($seconds, '00.000')"/>
</xsl:variable>
<ChapterAtom>
<ChapterDisplay>
<ChapterString>
<xsl:value-of select="text()"/>
</ChapterString>
</ChapterDisplay>
<ChapterFlagHidden>0</ChapterFlagHidden>
<ChapterFlagEnabled>1</ChapterFlagEnabled>
<ChapterTimeStart>
<xsl:value-of select="$timecode"/>
</ChapterTimeStart>
</ChapterAtom>
</xsl:for-each>
</EditionEntry>
</Chapters>
</xsl:template>
</xsl:stylesheet>
制作章节
xsltproc 4subs.xslt 4subs.kdenlive > chaps
将章节合并到文件
mkvmerge --chapters chaps -o cm2.mkv cm.mkv
答案2
自 20.08.0 以来,kdenlive 配置文件的格式已(再次)更改。增加了难度:标记信息现在在 XML 中编码为 JSON。因此,以下样式表需要 XSLT-3.0 ,所以好老套xsltproc
不再适用。需要Saxon >= 9.7
。mkvmerge 保持不变。此致,斯特芬
java -jar /usr/share/java/Saxon-HE-9.9.1.5.jar -s:4subs.kdenlive -xsl:4subs.xslt -o:chaps
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs math" version="3.0">
<!-- Convert kdenlive guide markers into MKV chapters.
This works with Generation 4: Comma / Point Project files
used in kdenlive 20.08.0 onwards.
https://community.kde.org/Kdenlive/Development/File_format
Earlier versions were different.
-->
<xsl:output indent="yes"/>
<xsl:mode on-no-match="shallow-skip"/>
<xsl:template match="property[@name='kdenlive:docproperties.guides']" >
<Chapters>
<EditionEntry>
<xsl:apply-templates select="parse-json(.)?*">
<xsl:sort data-type="number" select="?pos"/>
</xsl:apply-templates>
</EditionEntry>
</Chapters>
</xsl:template>
<xsl:template match=".[. instance of map(xs:string, item())]">
<xsl:variable name="chaptername" select="?comment"/>
<xsl:variable name="time" select="?pos"/>
<xsl:variable name="milliseconds" select="$time mod 50" />
<xsl:variable name="seconds" select="($time - $milliseconds) div 50" />
<xsl:variable name="timecode">
<xsl:value-of select="format-number(floor( ($seconds div 60) div 60 ) mod 60 , '00')"/>
<xsl:text>:</xsl:text>
<xsl:value-of select="format-number(floor($seconds div 60) mod 60 , '00')"/>
<xsl:text>:</xsl:text>
<xsl:value-of select="format-number($seconds mod 60 , '00')"/>
<xsl:text>:</xsl:text>
<xsl:value-of select="format-number($milliseconds mod 60 , '00')"/>
</xsl:variable>
<ChapterAtom>
<ChapterDisplay>
<ChapterString>
<xsl:value-of select="$chaptername"/>
</ChapterString>
<ChapterLanguage>ger</ChapterLanguage>
</ChapterDisplay>
<ChapterFlagHidden>0</ChapterFlagHidden>
<ChapterFlagEnabled>1</ChapterFlagEnabled>
<ChapterTimeStart>
<xsl:value-of select="$timecode"/>
</ChapterTimeStart>
</ChapterAtom>
</xsl:template>
</xsl:stylesheet>