我需要剪辑MP4视频.一部分在开始,一部分在结束,以批处理的方式



我有几个培训视频。所有的mp4。

我想从开始删除3.5秒,从整个文件夹的结束删除4.5秒…

我知道ffmpeg和ffprobe,但我对它们的知识和掌握都是有限的。

谁能提供一个脚本,或者,至少一个程序,将使这对我来说很容易?我一直在搜索,每次我都到达死胡同或脚本不工作。

我也愿意使用Linux/Windows,但不是mac。

编辑:第一部分完成将继续学习这个命令,以便批量学习;下面是简单的部分,如何批量修剪整个mp4文件夹:

for %%a in ("*.mp4") do ffmpeg -i "%%a" -ss 00:00:03.5 -vcodec copy -acodec copy "newfiles%%~na.mp4"
pause

我衷心感谢这里的每个人鼓励我继续寻找,我找到了一个完美的解决方案。在这里。我恐怕在评论中给出的例子让我无法理解,但我仍然会努力阅读并自学这些命令是如何工作的。再次感谢。替换8.25(结束修剪)和4.25(开始修剪)并更改值,直到您对输出满意为止。

@Echo Off
SetLocal
Set "ext=mp4"
Set "opts=-v quiet"
Set "opts=%opts% -print_format "compact=print_section=0:nokey=1:escape=csv""
Set "opts=%opts% -show_entries "format=duration""
If Exist *.%ext% (If Not Exist "Trimmed" MD Trimmed)
For %%a In (*.%ext%) Do Call :Sub "%%~a"
Exit/B
:Sub
For /f "Tokens=1* Delims=." %%a In (
    'FFProbe %opts% %1') Do (Set/A "ws=%%a-8.25" & Set "ps=%%b")
rem If %ws% Lss 20 GoTo :EOF
Set/A hh=ws/(60*60), lo=ws%%(60*60), mm=lo/60, ss=lo%%60
If %hh% Lss 10 Set hh=0%hh%
If %mm% Lss 10 Set mm=0%mm%
If %ss% Lss 10 Set ss=0%ss%
FFMpeg -i %1 -ss 00:00:04.2500 -to %hh%:%mm%:%ss%.%ps:~,3% -c:v copy -c:a copy "Trimmed%~1"

Eric Lalonde的剧本已经足够好了,谢谢!

对于那些不能或不喜欢安装ffmpeg,我添加了ffmpeg路径变量。在我的场景中,我要从开头剪掉14秒,在结尾剪掉9秒。

@Echo Off
SetLocal
Set "ext=mp4"
Set "opts=-v quiet"
Set "opts=%opts% -print_format "compact=print_section=0:nokey=1:escape=csv""
Set "opts=%opts% -show_entries "format=duration""
Set ffmpeg=C:UsersuserDownloadsffmpeg-20180102-57d0c24-win64-staticbin
If Exist *.%ext% (If Not Exist "Trimmed" MD Trimmed)
For %%a In (*.%ext%) Do Call :Sub "%%~a"
Exit/B
:Sub
For /f "Tokens=1* Delims=." %%a In (
    '%ffmpeg%ffprobe %opts% %1') Do (Set/A "ws=%%a-9.00" & Set "ps=%%b")
Set/A hh=ws/(60*60), lo=ws%%(60*60), mm=lo/60, ss=lo%%60
If %hh% Lss 10 Set hh=0%hh%
If %mm% Lss 10 Set mm=0%mm%
If %ss% Lss 10 Set ss=0%ss%
%ffmpeg%ffmpeg -i %1 -ss 00:00:14.000 -to %hh%:%mm%:%ss%.%ps,~3% -c:v copy -c:a copy "Trimmed%~1"

对op的回答有一个小小的吸引力(我不能在他的评论下回复,因为分数太低):最后一行改成这样:

FFMpeg -ss 00:00:04.2500 -to %hh%:%mm%:%ss%.%ps:~,3% -i %1 -c:v copy -c:a copy -avoid_negative_ts make_zero "Trimmed%~1"

这种方式可以切割关键帧,以避免在旧电视上播放视频时音频不同步

回应Erkko的回答

Set ffmpeg=C:UsersuserDownloadsffmpeg-20180102-57d0c24-win64-staticbin

我使用,

Set ffmpeg="C:Program Files (x86)K-Lite Codec PackTools"

,由于某些原因它不能工作。

我想从开头剪10秒,从结尾剪30秒。

'%ffmpeg%ffprobe %opts% %1') Do (Set/A "ws=%%a-30.00" & Set "ps=%%b")
%ffmpeg%ffmpeg -i %1 -ss 00:00:10.000 -to %hh%:%mm%:%ss%.%ps:~,3% -c:v copy -c:a copy "Trimmed2%~1"

导致开始时间10秒,结束时间20秒。我必须把30改成40

'%ffmpeg%ffprobe %opts% %1') Do (Set/A "ws=%%a-40.00" & Set "ps=%%b")

在结束时启用30秒切割。这是批打算工作的方式还是有错误?

我解决了。我不介意帮助你,但我不打算提供完整的解决方案。不过,我会在最棘手的部分给你一些提示。我让你来填空。

ffmpeg会让你做你想做的。-ss开关指定起始位置。-t为持续时间。不幸的是,没有开关或程序替代变量可以在内部对视频长度执行所需的数学运算。你必须通过脚本来计算。

首先你需要的是未修改视频的总长度:

for /f "tokens=2" %%x in (
    '2^>^&1 ffmpeg -i "%%~fI" ^| find /i "duration"'
) do set "length=%%x"

要计算-t开关的值,可以调用PowerShell来确定newLength = totalLength - (leftTrim + rightTrim)。这就是秘诀:

powershell "'{0}' -f ([timespan]'%length:,=%').add([timespan]::fromseconds(-(%trim-left% + %trim-right%)))"

计算出目标长度后,将其插入ffmpeg,如下所示:

ffmpeg -i "%%~fI" -ss %trim-left% -t %target_length% -c:v copy -c:a copy "%destination-dir%%%~nxI"

相关内容

最新更新