我需要剪切MP4视频。以批处理形式开头和结尾部分

问题描述 投票:5回答:4

我有几个培训视频。所有.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
batch-file video ffmpeg batch-processing
4个回答
7
投票

非常感谢这里的所有人鼓励我继续搜索,我找到了一个完美的解决方案。这里是。恐怕即使在注释中给出的示例也使我难以理解,但我仍将尝试阅读并教育自己如何使用这些命令。再次感谢。替换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"

1
投票

附魔对操作答案的一种迷恋(由于低分,我无法在他的评论下回复):最后一行改为这种方式:

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"

这样,如果您在旧电视上播放视频,它会剪切关键帧以避免音频不同步


0
投票

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:\Users\user\Downloads\ffmpeg-20180102-57d0c24-win64-static\bin\
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"

-2
投票

我解决了。我不介意为您提供帮助,但我不会提供完整的解决方案。但是,我将为您提供最棘手的部分的提示。我将由您自行填写。

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"
© www.soinside.com 2019 - 2024. All rights reserved.