Timing problem when opening a srt file
anne-o-pixel opened this issue · 3 comments
Hello
When opening a srt using a recent aegisub on Linux, the time switch of some ms and so it begins one frame after it should start
Here content example of the srt file:
1
00:00:49,466 --> 00:00:54,429
hello, I'm a line that'll be bad timed
Here the result on older aegisub (good version)
[Script Info]
; Script generated by Aegisub
; http://www.aegisub.org/
Title: Default Aegisub file
ScriptType: v4.00+
WrapStyle: 0
ScaledBorderAndShadow: yes
YCbCr Matrix: None
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:49.46,0:00:54.42,Default,,0,0,0,,hello, I'm a line that'll failed
and here with a recent one:
[Script Info]
; Script generated by Aegisub
; http://www.aegisub.org/
Title: Default Aegisub file
ScriptType: v4.00+
WrapStyle: 0
ScaledBorderAndShadow: yes
YCbCr Matrix: None
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:49.47,0:00:54.43,Default,,0,0,0,,hello, I'm a line that'll failed
With some research, commit a2da161 on master branch is fine
and commit bec44ea on master branch change the time like the example above
Note that there's a merge commit between these two that merges in a bunch of commits from mainline Aegisub since after the meson branch was created. E.g. faad82e seems to do something related to timestamps.
I don't think it's possible to have a one-size-fits-all solution for this case, because ASS simply has less precision than SRT, meaning information will be lost regardless of what is done. Since a pure timestamp-based conversion cannot know whether there is a frame change on either side of the rounding area, it must choose one. The old behavior was apparently to always round down while the new is to round to the closest legal number (or up, though the commit Myaa references doesn't indicate that). Statistically, rounding to the closest will result in fewer frame boundary traversals since the overall time shift is smaller, so I think the current behavior is the proper way.
Now, if the conversion was a bit more sophisticated and could e.g. take timecodes into account, it could easily make a decision for which side to round towards depending on whether it will or will not cross a frame boundary, since it knows where they are. It could for example prompt for a timecodes or video (container) file when importing subtitle formats with higher precision than ASS.
That would still only work for videos up to 100fps, but there's absolutely nothing Aegisub could do about those.
It could for example prompt for a timecodes or video (container) file when importing subtitle formats with higher precision than ASS.
Prompting on load/parse of a SRT file seems like a reasonable way to handle this IMO. If it's unfeasible, another option would be to just use the currently-loaded video when opening a SRT file, and fall back to current behaviour if one doesn't exist.