Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

split-video sometimes cut at wrong frames/length #479

Open
Werve opened this issue Feb 2, 2025 · 1 comment
Open

split-video sometimes cut at wrong frames/length #479

Werve opened this issue Feb 2, 2025 · 1 comment

Comments

@Werve
Copy link

Werve commented Feb 2, 2025

Description:

With one particular video file (which I think I can share privately if needed) I noticed that created cut scene files generated by this command did not have the correct length in frames reported in the SceneTimings.csv file. Yet with recoding, in this case lossless, according to the doc (https://trac.ffmpeg.org/wiki/Seeking) the ffmpeg -ss commands should ensure accuracy.

scenedetect -i “%_InputFile%” -b pyav load-scenes -i SceneTimings.csv -c “Start Frame” split-video -a “-map 0:v -c:v libx264 -preset veryfast -crf 0 ” -f $SCENE_NUMBER.mkv

(With SceneTimings.csv generated by scenedetect -i “%_InputFile%” -b pyav -s stats.csv --min-scene-len 10s detect-adaptive --weights 1 1 1 list-scenes -s -f scenesTimings.csv but it should not affect the behavior)

I also tried split-video with -m flag and manually running the ffmpeg commands with the values reported in the SceneTimings.csv file with different seek methods which I report in the following table where there is the number of frames per scene calculated with the command:

ffprobe -i “%SceneNumber%.mkv” -select_streams v:0 -count_frames -show_entries stream^=nb_read_frames -v quiet -of csv^=“p=0” >> framelist.txt

Scene n. SceneTimings Frames scenedetect -m Diff scenedetect mkv out Diff2 scenedetect mp4 out Diff3 ffmpeg mkv Diff4 vf select Diff5
1 683 684 1 679 -4 679 -4 653 -30 655 -28
2 358 380 22 359 1 359 1 257 -101 257 -101
3 306 304 -2 306 0 306 0 287 -19 289 -17
4 334 309 -25 333 -1 333 -1 316 -18 314 -20
5 286 355 69 289 3 289 3 281 -5 284 -2
6 573 506 -67 572 -1 572 -1 255 -318 254 -319
7 277 330 53 275 -2 275 -2 244 -33 243 -34
8 314 284 -30 316 2 316 2 228 -86 230 -84
9 324 301 -23 324 0 324 0 254 -70 254 -70
10 269 269 0 269 0 269 0 251 -18 251 -18
11 301 342 41 299 -2 299 -2 257 -44 257 -44
12 328 288 -40 331 3 331 3 344 16 346 18
13 305 351 46 302 -3 302 -3 274 -31 274 -31
14 268 219 -49 268 0 268 0 333 65 334 66
15 257 262 5 259 2 259 2 291 34 289 32
16 248 304 56 246 -2 246 -2 264 16 266 18
17 266 205 -61 266 0 266 0 256 -10 257 -9
18 268 307 39 268 0 268 0 270 2 271 3
19 271 304 33 271 0 271 0 284 13 285 14
20 286 214 -72 287 1 287 1 247 -39 247 -39
21 352 352 0 352 0 352 0 247 -105 247 -105
22 305 346 41 307 2 307 2 441 136 440 135
23 274 284 10 272 -2 272 -2 294 20 294 20
24 270 219 -51 269 -1 269 -1 243 -27 245 -25
25 295 313 18 296 1 296 1 398 103 398 103
26 302 284 -18 301 -1 301 -1 360 58 358 56
27 265 324 59 265 0 265 0 354 89 355 90
28 261 228 -33 261 0 261 0 262 1 263 2
29 460 436 -24 461 1 461 1 335 -125 335 -125
30 260 258 -2 258 -2 258 -2 597 337 599 339
31 414 414 0 414 0 414 0 312 -102 311 -103
32 375 377 2 377 2 377 2 370 -5 371 -4
33 379 451 72 378 -1 378 -1 431 52 431 52
34 273 228 -45 272 -1 272 -1 314 41 315 42
35 354 380 26 355 1 355 1 447 93 447 93
36 624 588 -36 622 -2 622 -2 1405 781 1400 776
37 332 380 48 333 1 333 1 266 -66 264 -68
38 387 380 -7 386 -1 386 -1 546 159 547 160
39 450 456 6 450 0 450 0 260 -190 262 -188
40 467 401 -66 467 0 467 0 294 -173 292 -175
41 1486 1486 0 1486 0 1486 0 305 -1181 305 -1181
Sum 15107 15103 -4 15101 -6 15101 -6 14327 -780 14336 -771

I noticed that the split made by scenedetect split-video using ffmpeg does not have the total frames as that of the original video, and neither do the manual ones using ffmpeg (-ss before or after -i, and -vf select="between(n,start_frame_num,end_frame_num) ).
The split that comes closest is with mkvmerge but it does not precisely cut each scene in the chosen timestamps.

Environment:

scenedetect version

[PySceneDetect] PySceneDetect 0.6.5
[PySceneDetect] Loading user config file:
  C:\Users\A\AppData\Local\PySceneDetect\scenedetect.cfg

System Info
------------------------------------------------------------
OS               Windows-10-10.0.19045-SP0
Python           CPython 3.13.0rc1
Architecture     64bit + WindowsPE

Packages
------------------------------------------------------------
av               13.1.0
click            8.1.7
cv2              4.10.0
imageio          2.36.0
imageio_ffmpeg   0.5.1
moviepy          2.1.1
numpy            2.1.3
platformdirs     4.3.6
scenedetect      0.6.5
tqdm             4.67.1

Tools
------------------------------------------------------------
ffmpeg           7.1-full_build-www.gyan.dev
mkvmerge         v88.0 ('All I Know') 64-bit

Media/Files:

The SceneTimings.csv :

scenesTimings.csv

If it is needed, perhaps to replicate or create a test, I can privately send the video file somehow.

EDIT: After looking at the mediainfo of the input file, it reports variable frame rate for the video.
Could it explain the mismatch between the frames written in SceneTiming.csv and the actual frames in the cuts?

@Breakthrough
Copy link
Owner

EDIT: After looking at the mediainfo of the input file, it reports variable frame rate for the video.
Could it explain the mismatch between the frames written in SceneTiming.csv and the actual frames in the cuts?

Yes that would explain it! VFR videos aren't well supported right now, this is being tracked in #168. I hope to eventually overhal the timecode APIs so that VFR works better with PySceneDetect.

For now, the best workaround is, unfortunately, to re-encode the input to be CFR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants