渐进式生成播放:fMP4 前 4 个分片就绪即返回播放列表开始起播,后台边转边补 ENDLIST,消除整集封装等待的黑屏缓冲

This commit is contained in:
yvan
2026-09-18 16:06:31 +08:00
parent 3f8c29b7e2
commit f3546ab2db
7 changed files with 170 additions and 57 deletions
+4 -4
View File
@@ -84,13 +84,13 @@ func (app *UIApp) probePlaybackCodecs(ctx context.Context, media *playbackMediaS
if proxy != nil && proxy.Err() != nil || media.info.Video == "" && err != nil {
return playbackStreamError(ctx, proxy, log, media.media, err, nil)
}
if media.plan.Duration <= 0 && duration > 0 {
if duration > 0 && duration != media.plan.Duration {
media.plan.Duration, media.plan.SeekEnd = duration, duration
}
return nil
}
func (app *UIApp) planMedia(ctx context.Context, media *playbackMediaSession, client playbackClientCapabilities, mode, source, origin, base, query string) error {
func (app *UIApp) planMedia(ctx context.Context, media *playbackMediaSession, client playbackClientCapabilities, mode, source, origin, base, query string, startSeconds float64) error {
app.attachMediaGateway(media, base, query)
app.inspectPlaybackMedia(ctx, media)
if mode == "legacy" {
@@ -124,7 +124,7 @@ func (app *UIApp) planMedia(ctx context.Context, media *playbackMediaSession, cl
media.plan.Player, media.plan.Processing, media.plan.Reason = "legacy", "video", "hls_player_unavailable"
return nil
}
if err := app.generatePlayback(ctx, media, processing, base, query); err != nil {
if err := app.generatePlayback(ctx, media, processing, base, query, startSeconds); err != nil {
return err
}
} else if media.plan.Player == "hls" && !client.NativeHLS && !client.HlsJS || media.plan.Player == "mp4" && !client.MP4 {
@@ -198,7 +198,7 @@ func (app *UIApp) handlePlaybackPlan(writer http.ResponseWriter, request *http.R
media, err = app.resolveMediaSession(run.ctx, ctx, run.task, run.downloadID, input.Quality, run.cache)
if err == nil {
base := "/api/ui/playback/media/" + run.id + "/" + strconv.FormatUint(run.run, 10) + "/"
err = app.planMedia(ctx, media, input.Client, input.Mode, sourceFromDramaID(run.task.DramaID), request.Header.Get("Origin"), base, "")
err = app.planMedia(ctx, media, input.Client, input.Mode, sourceFromDramaID(run.task.DramaID), request.Header.Get("Origin"), base, "", input.Start)
}
if err != nil {
app.finishPlaybackRun(run, err, request.Context().Err() != nil)