Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I need to cut MP4 videos. A part at the beginning and a part at the end in a batch fashion

I have several training videos. All .MP4s.

I want to remove 3.5 seconds from the beginning and 4.5 seconds from the end of the entire folder of them...

I know of ffmpeg and ffprobe - but my knowledge and mastery of them both is limited.

Can someone provide a script for this, or, at least a program that will make this easy for me? I keep searching and I reach dead-ends everytime or scripts that do not work.

I am also open to using Linux/Windows but not mac.

edit: First part completed. Will keep on studying this command further in order to learn batch; Here's the easy part, how to batch trim an entire folder of MP4s:

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

pause
like image 527
Eric Lalonde Avatar asked Aug 06 '15 17:08

Eric Lalonde


3 Answers

I kindly thank everyone here for encouraging me to keep searching, I found a solution that is perfect. Here it is. I am afraid the examples given even in the comments elude me but I will still try to read up and educate myself on how those commands work. Thanks again. Replace 8.25 (end trim) and 4.25 (beginning trim) and change the values until you are satisfied with the outputs.

@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"
like image 142
Eric Lalonde Avatar answered Oct 03 '22 16:10

Eric Lalonde


Eric Lalonde script was good enough, thank you!

For those who can't or don't like installing ffmpeg, I added ffmpeg path variable. In my scenario I am cutting the 14 seconds from the beginning and 9 seconds at the end.

@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"
like image 38
Erkko Avatar answered Oct 03 '22 16:10

Erkko


a small enchantment for op answer (i cant reply under his comment because of low points): last line make it this way instead:

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"

this way it cut on key frame to avoid out of sync audio if you are playing the video on old tv

like image 21
Hani Yassine Avatar answered Oct 03 '22 15:10

Hani Yassine