播放 VLC 播放列表中每个视频的最后 x 秒

播放 VLC 播放列表中每个视频的最后 x 秒

使用 VLC CLI,有没有办法播放播放列表中每个视频的最后 x 秒?

我知道:

--start-time=开始时间

The stream will start at this position (in seconds).

--stop-time=停止时间

 The stream will stop at this position (in seconds).

--run-time=运行时间

 The stream will run this duration (in seconds).

但如果没有一些精妙的逻辑,这一切都不会达到我想要的效果。

这是用于审查运动触发的视频,其中最后 15 秒通常是最有趣的,用于确定您是否要观看或保存整个视频。

答案1

如果您还ffmpeg安装了,则可以使用以下脚本。它很简单,不会处理诸如短于 15 秒的视频或有缺陷的文件(您必须延长它)之类的边界情况。但除此之外,它还会使用 VLC 播放文件的最后 15 秒:

#!/bin/bash
secondsBeforeEnd=15
length=`ffmpeg -i "$1" 2>&1 | grep "Duration" | cut -f4 -d' ' | cut -f1 -d','`
secs=$(date "+%s" --date="$length")
adjSecs=$(echo "$secs - $secondsBeforeEnd" | bc)
adjTime=$(date +%T -d @$adjSecs)
finalSecs=$(date +"%S" -d @$adjSecs)
finalMins=$(date +"%M" -d @$adjSecs)
finalHour=$(date +"%H" -d @$adjSecs)
newStart=$(echo "$finalSecs + $finalMins*60 + $finalHour*3600" | bc)
echo "=============================="
echo "Original Length: $length"
echo "Adjusted Length: $adjTime"
echo "Starting time in seconds: $newStart"
echo "=============================="
vlc --start-time=$newStart "$1" "$2" "$3" "$4"

当然,您可以将其放入for循环中。
简单的 bash 脚本功能就足以做到这一点(您应该明白了)。我还没有找到从 VLC 检索视频文件长度的方法,所以我不得不使用ffmpeg


第二种可能性是直接处理播放列表。您需要一个 XSLT 处理器,例如xsltproc(Linux/Ubuntu) 或 Saxon-HE(Linux/Windows):

例如,假设您有一个名为 的 VLC 播放列表play.xspf
然后您将此 XSLT-1.0 样式表(名为playlist.xslt)应用于播放列表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:l="http://xspf.org/ns/0/">
    <xsl:output method="text" indent="no" />
    <xsl:variable name="beforeEnd" select="15" />

    <xsl:template match="text()" />    

    <xsl:template match="/">
        <xsl:text>#!/bin/bash</xsl:text>
        <xsl:text>&#xd;&#xa;</xsl:text>
        <xsl:apply-templates select="l:playlist/l:trackList/l:track" />
    </xsl:template>

    <xsl:template match="l:track">
        <xsl:variable name="startTime" select="substring-before(l:duration div 1000,'.') - $beforeEnd" />
        <xsl:if test="$startTime > 0">
            <xsl:text>vlc --start-time=</xsl:text>
            <xsl:value-of select="$startTime" />
            <xsl:text> </xsl:text>
            <xsl:value-of select="l:location" />        
            <xsl:text>&#xd;&#xa;</xsl:text>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

你可以这样做

xsltproc playlist.xslt play.xspf

或者

java -jar saxon9he.jar -xsl:playlist.xslt play.xspf

它的输出是一个bash脚本,它将运行播放列表中每个文件的最后 15 秒,如果短于 15 秒则跳过该文件。

如果您使用的是 Windows,只需删除该#!/bin/bash行(并根据需要调整其余部分以满足批处理文件的要求)。

相关内容