I'm very noob, sorry. I searched a lot and didn't find any solution. Is it possible to automatically cut a 1 hour video into 1 minute? But not have 60 1minute videos, I wish the software to automatically identify the video size and cut several 2 or 3 second scenes to form a 1 minute summary of the video 1 hour video. It is possible? Can some software do this?
+ Reply to Thread
Results 1 to 7 of 7
If you want to cut every so many seconds and you want a total number of scenes (say 15}in your clip:
1. Find total number of second (example 1200)
2. Divide Total seconds by 15 (number of requested scenes)=80 (1200/15)
3. Decide how many seconds you wish in each new scene (example 2)
3. Use the following script and adjust 80,2 according to your choices"
ffmpeg -i yosemite.mp4 -vf select='lt(mod(t,80,2)',setpts=N/FRAME_RATE/TB -af aselect='lt(mod(t,120),2)',asetpts=N/SR/TB out17.mp4
If you wish to cut on scene changes it is trickier but adapting one of my bat files, copy the code into a file called 'somethning.bat'
Drag and drop a video on the bat file and it will create text files with scene change amounts and cut points. I have adjusted the vframes to 50 (25FPSx2 seconds)
Adjust according to your wishes.
Also adjust the scene,.x to higher for less detecting and lower for more detection. .4 will give most scene changes but I raised to .6 for less output segments
setlocal enabledelayedexpansion @echo off set /a count=0 ::for %%a in (*.mp4,*.mpg,*.flv) Do ( for %%a in ("%~nx1") Do ( cd %%~dpa echo. > "%%~na_SceneInfo.txt" echo Scene NO. PTS TIME FRAME TYPE > "%%~dpna_SceneList.txt" ffprobe -v quiet -show_frames -of compact=p=0 -f lavfi "movie='%%a',select=gt(scene\,.6)" >> "%%~na_SceneInfo.txt" for /F "tokens=5,14,15,18,19 delims=|" %%b in ('findstr /I "type=" "%%~na_SceneInfo.txt"') do ( set "x=%%b" set "y=%%c" set "z=%%d" set "w=%%e" set "v=%%f" set "u=%%g" set sort=!x:~13,-7! echo !sort! if !sort! GEQ 0 if !sort! LEQ 14000 ( @echo !count! !x:~13! !w! >> "%%~dpna_SceneList.txt" ffmpeg -ss !x:~13! -i "%%a" -vframes 50 "%%~dpna_Thumb_!count!.mp4" ) set /a count+=1" set /a ekko=count%%10" if !ekko!==0 echo Frame !count! processed ) ) ::pause
[Attachment 60320 - Click to enlarge]
[Attachment 60321 - Click to enlarge]
You will have 15 videos:
[Attachment 60322 - Click to enlarge]
Uou will need to join them for a composite video with whatever you choose to use. There is probably a way to do the scene detect and join all at once but I use a GUI that runs 2 scripts consecutively.
Last edited by Budman1; 16th Aug 2021 at 02:49. Reason: scene change amout expanation
Try taking the double colons out of the bat file at the end where it says pause. That keep the cmd window open and show any errors.
Send any error msg you get. Ill double check the script to make sure i didnt make any errors when i copied it.
AviSynth's SelectRangeEvery() filter can be used for this:
a = LWLibavAudioSource("filename.mp4") v = LWLibavVideoSource("filename.mp4", cache=false, prefer_hw=2) AudioDub(v,a) desired_clip_length = 60.0 # total time of desired preview clip, in seconds desired_segment_length = 2.0 # time of each segment, in seconds length = int(desired_segment_length * framerate) interval = int(framecount / (desired_clip_length / desired_segment_length)) SelectRangeEvery(interval, length)
Of course, it's not content aware, it just cuts at the calculated intervals. It's not great as a preview. I don't thing an automated method that cuts only shot changes is much better. What you really want is a real human analyzing the content and selecting the shots.
A sample you'll recognize:
Last edited by jagabo; 16th Aug 2021 at 22:32.
Jagabo just beat me with a very good way to produce your results, as he always does.
I just remembered that sometimes on some systems you have to escape special characters like commas. So anyone that reads this thread and wishes to try it can try both ways
I tried my script both ways and it work both ways BUT... depending on your level of FFMpeg, Operating system and Dos level, You may have to escape the commas like:
ffmpeg -i yosemite.mp4 -vf select='lt(mod(t\,4)\,2)',setpts=N/FRAME_RATE/TB -af aselect='lt(mod(t\,120)\,2)',asetpts=N/SR/TB out18.mp4
Thank you guys, you help a lot, thank you deeply. Budman1 this code "ffmpeg -i yosemite.mp4 -vf select='lt(mod(t\,4)\,2)',setpts=N/FRAME_RATE/TB -af aselect='lt(mod(t\,120)\,2)',asetpts=N/SR/TB out18.mp4" is exactly what I wanted, as I said above I don't understand much and this code saved me, it will save me a lot of work.
jagabo, thanks too, but I didn't try your code, it's too advanced for me, sorry