作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题于 2020 年 12 月 6 日更新,以扩大范围,同时不放弃适用于先前案例和更大案例的先前答案。
我无法为不是表达式的过滤器选项提供六十进制时间 (HH:MM:SS.mm
)。例如 trim
筛选。
碰巧有一个转义规则,当我第一次询问时,我还不知道,并且在@Gyan 的第一条评论中得到了解决。
这个问题是普遍的,但如果我们走脚本路线,解决方案可能取决于外壳......我目前卡在 Windows 的 CMD.exe .
例如,以下内容会尽可能准确地在所有流中跳过一分零四秒,然后调用修剪过滤器以将片段保持在剩余持续时间的一到两分钟之间,并使用两种不同的语法来执行此操作。此示例恰好与 CMD 和 BASH shell 兼容,因此无法逃脱 hell 。
ffmpeg -ss "1:00.4" -i INPUT -vf "trim=start='1\:00':end='120'" OUTPUT
那么我们如何在
中实现相同的效果?表达式 在过滤器内?
select
中的一个表达式筛选。
ffmpeg -ss "1:00.4" -i INPUT -vf "select='between(t,1\:00',120)'" OUTPUT
ffmpeg 过滤器表达式似乎不支持六十进制表示法,因为我在文档和 SO/web.xml 中都没有找到它的引用。
2*60+2
表示
2:02
.
HH:MM:SS.mm
的组件首先将它们放入那些变量中。你知道,使用 bash
$var
或 cmd
%var%
/
%~1
样式。否则,我们可能会完全在 shell 中计算多项式而不是表达式,但这样做很麻烦,收效甚微。
最佳答案
这是我编写的批处理脚本(用于 CMD.exe),用于将字符串输入时间从六十进制转换为十进制,尽管外壳非常有限且过时。我认为它可能对像我一样没有使用其他 shell 的技能或权限的 Windows 用户有用。
REM May be inserted in another script to call :second or called as a file batch such as "hms-to-second.cmd".
:second
REM Convert sexagesimal time plus decimal period into decimal signed number as a string with possible period by parsing that string.
REM param 1 is name of result destination
REM param 2 is name of source env-var
REM param 3 is prefix character of source
setlocal enableDelayedExpansion
set "inp=!%~2!"
set "t=0"
set "neg="
if "!inp:~0,0!"=="-" (
set "inp=!inp:~1!"
set "neg=-"
)
for /f "tokens=1-3 delims=:" %%G in ( "!inp!" ) do (
call :stepparse t "%%G"
call :stepparse t "%%H"
call :stepparse t "%%I"
)
(
endlocal
set "%~1=%neg%%t%"
)
exit/b
:stepparse
REM Call this repetitively from high weight to low weight, assuming the higher weight never are empty. Assume there is at most one dot for a decimal part which is appended (with the dot) because CMD SET/A cannot compute decimals.
REM param 1 is name of accumulator
REM param 2 is input
setlocal enableDelayedExpansion
set "x=!%~1!"
for /f "tokens=1-2 delims=." %%E in ( "%~2" ) do (
if not [%%E]==[] set /a "x=x*60+%%E"
if not [%%F]==[] set "x=!x!.%%F"
)
(
endlocal
set "%~1=%x%"
)
exit/b
像这样使用它。
set "begin=1:2"
set "end=2:3"
call hms-to-second.cmd begin %begin%
call hms-to-second.cmd end %end%
ffmpeg -i sample-counter.mp4 -vf "trim=start='%begin%':end='%end%'" sample-counter-trimmed.mp4
关于batch-file - 如何在 FFmpeg 的参数中使用六十进制语法,或者如果不可能,如何在 Windows CMD shell 中转换它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65034106/
我是一名优秀的程序员,十分优秀!