Skip to content

Commit cc3bae5

Browse files
committed
⚡️ 字幕タイミング同期をより正確に
1 parent a4fe91b commit cc3bae5

File tree

3 files changed

+18
-7
lines changed

3 files changed

+18
-7
lines changed

src/components/contentPlayer/SubtitleRenderer.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ import { SUBTITLE_DEFAULT_FONT } from "../../constants/font"
1717
import { tryBase64ToUint8Array } from "../../utils/string"
1818
import { getAribb24Configuration } from "../../utils/subtitle"
1919

20-
export const CoiledSubtitleRenderer: React.VFC<{}> = memo(() => {
20+
export const CoiledSubtitleRenderer: React.VFC<{
21+
internalPlayingTimeRef: React.MutableRefObject<number>
22+
}> = memo(({ internalPlayingTimeRef }) => {
2123
const canvasRef = useRef<HTMLCanvasElement>(null)
2224

2325
const speed = useRecoilValue(contentPlayerSpeedAtom)
@@ -58,7 +60,8 @@ export const CoiledSubtitleRenderer: React.VFC<{}> = memo(() => {
5860
const decoded = tryBase64ToUint8Array(aribSubtitleData.data)
5961
if (!decoded) return
6062
const fromZero = ((aribSubtitleData.pts * 9) / 100 - firstPcr) / 90_000
61-
const pts = fromZero - playingTime / 1000
63+
const pts =
64+
fromZero - (internalPlayingTimeRef.current || playingTime) / 1000
6265
const provider = new CanvasProvider(decoded, pts)
6366
const estimate = provider.render()
6467
if (!estimate) return

src/components/contentPlayer/VideoPlayer.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ import { getAribb24Configuration } from "../../utils/subtitle"
3939
import { VideoRenderer } from "../../utils/videoRenderer"
4040
import { VLCLogFilter } from "../../utils/vlc"
4141

42-
export const CoiledVideoPlayer: React.VFC<{}> = memo(() => {
42+
export const CoiledVideoPlayer: React.VFC<{
43+
internalPlayingTimeRef: React.MutableRefObject<number>
44+
}> = memo(({ internalPlayingTimeRef }) => {
4345
const canvasRef = useRef<HTMLCanvasElement>(null)
4446

4547
const [aspect, setAspect] = useState(16 / 9)
@@ -306,10 +308,11 @@ export const CoiledVideoPlayer: React.VFC<{}> = memo(() => {
306308
let pcr_i_first = 0
307309
let last = 0
308310
window.Preload.webchimera.onTimeChanged((time) => {
309-
if (300 < Math.abs(time - last)) {
311+
if (100 < Math.abs(time - last)) {
310312
setPlayingTime(time)
311313
last = time
312314
}
315+
internalPlayingTimeRef.current = time
313316
})
314317
window.Preload.webchimera.onLogMessage((_level, message) => {
315318
const parsed = VLCLogFilter(message)

src/windows/ContentPlayer.tsx

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useEffect } from "react"
1+
import React, { useEffect, useRef } from "react"
22
import { useRecoilValue, useSetRecoilState } from "recoil"
33
import pkg from "../../package.json"
44
import {
@@ -22,6 +22,7 @@ export const CoiledContentPlayer: React.VFC<{}> = () => {
2222
globalActiveContentPlayerIdAtom
2323
)
2424
const setIsPlaying = useSetRecoilState(contentPlayerIsPlayingAtom)
25+
const internalPlayingTimeRef = useRef(-1)
2526

2627
useEffect(() => {
2728
// 16:9以下の比率になったら戻し、ウィンドウサイズを保存する
@@ -92,7 +93,9 @@ export const CoiledContentPlayer: React.VFC<{}> = () => {
9293
id="VideoPlayer"
9394
className="absolute top-0 left-0 w-full h-full flex items-center justify-center"
9495
>
95-
<CoiledVideoPlayer />
96+
<CoiledVideoPlayer
97+
internalPlayingTimeRef={internalPlayingTimeRef}
98+
/>
9699
</div>
97100
<div
98101
id="OnPlayerComponents"
@@ -104,7 +107,9 @@ export const CoiledContentPlayer: React.VFC<{}> = () => {
104107
id="SubtitleRenderer"
105108
className="absolute top-0 left-0 w-full h-full flex items-center justify-center"
106109
>
107-
<CoiledSubtitleRenderer />
110+
<CoiledSubtitleRenderer
111+
internalPlayingTimeRef={internalPlayingTimeRef}
112+
/>
108113
</div>
109114
<div
110115
id="OnSubtitleComponents"

0 commit comments

Comments
 (0)