Compare commits

..

1 Commits

Author SHA1 Message Date
张宏杰 6f1f82a0d2 fix: demuxSegment添加5秒超时保护+防重复resolve,确保Promise必定resolve
- 添加 resolved 标志位,防止多次 resolve
- 5秒超时保护:onSamples 未触发时 resolve(null)
- 所有 resolve 路径前加 clearTimeout + resolved = true
- onSamples 开头检查 resolved,防止重复处理
2026-08-19 19:19:30 +08:00
@@ -292,17 +292,6 @@ export function useCanvasPlayer(
mp4File.onReady = (info: Movie) => {
const videoTrack = info?.videoTracks?.[0]
console.log("[useCanvasPlayer] demuxSegment:", {
segIndex,
startTime: segment.startTime,
endTime: segment.endTime,
nbSamples: videoTrack?.nb_samples,
codec: videoTrack?.codec,
videoWidth: videoTrack?.track_width,
videoHeight: videoTrack?.track_height,
})
if (!videoTrack) {
console.warn("[useCanvasPlayer] No video track found for segment", segIndex)
clearTimeout(timeout)
@@ -322,19 +311,10 @@ export function useCanvasPlayer(
}
}
// ✅ 如果 description 缺失,无法解码 HEVC
if (!description) {
console.error(
`[useCanvasPlayer] No description found for segment ${segIndex}, cannot decode HEVC`,
)
clearTimeout(timeout)
resolved = true
resolve(null)
return
}
// 缓存 description 供后续分片使用
descriptionCache.current.set(segment.assetId, description)
if (description) {
descriptionCache.current.set(segment.assetId, description)
}
meta = {
assetId: segment.assetId,
@@ -352,7 +332,7 @@ export function useCanvasPlayer(
// 提取所有 samples
mp4File.setExtractionOptions(videoTrack.id ?? 1, null, {
nbSamples: Infinity, // 提取所有 sample
nbSamples: videoTrack.nb_samples ?? 0,
})
mp4File.start()
}