我更新的 XSLT

我更新的 XSLT

不幸的是,kdenlive 不提供向 MKV 文件添加章节的方法,仅提供向 DVD 添加章节的方法。

我如何添加章节?

答案1

2012 年,^rooker发布了解决方案这个问题使用过时的 kdenlive 架构。不幸的是,他的论坛上禁止注册,否则我会把它发布在那里。

我更新了文件,现在您可以将此 XSLT 应用于任何.kdenlive文件并恢复可用的章节。您所需要的只是xsltprocmkvmerge(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> 

相关内容