渐进式生成播放:fMP4 前 4 个分片就绪即返回播放列表开始起播,后台边转边补 ENDLIST,消除整集封装等待的黑屏缓冲
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user