![播放 VLC 播放列表中每个视频的最后 x 秒](https://linux22.com/image/1596593/%E6%92%AD%E6%94%BE%20VLC%20%E6%92%AD%E6%94%BE%E5%88%97%E8%A1%A8%E4%B8%AD%E6%AF%8F%E4%B8%AA%E8%A7%86%E9%A2%91%E7%9A%84%E6%9C%80%E5%90%8E%20x%20%E7%A7%92.png)
使用 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>
</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>
</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
行(并根据需要调整其余部分以满足批处理文件的要求)。