微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将滑块与 Video Dash Plotly 的 CurrentTime 同步 实施说明

如何解决将滑块与 Video Dash Plotly 的 CurrentTime 同步 实施说明

我正在构建一个 Dash 应用程序,它将播放视频并由播放/暂停按钮控制。在视频上方,我有一个滑块,允许用户跳到视频中的任何部分(10 秒长)。我希望能够在视频播放时让滑块移动。

这是我迄今为止尝试过的:

import os
import dash
import dash_html_components as html
import dash_core_components as dcc
import dash_player as player
from flask import Flask,Response
from dash.dependencies import Input,Output,State

server = Flask(__name__)
app = dash.Dash(__name__,server=server)


app.layout = html.Div(
    children=[
        html.Div(
            children=[
                html.Div([
                    html.Button('Play/Pause',id='play-button',n_clicks=0),],style={
                    'width':'10%','display':'inline-block'
                }),html.Div([
                    dcc.Slider(id='slider',min=0,max=10,step=1,value=0,marks={0: {'label': '0s','style': {'color': 'black'}},2: {'label': '2s',4: {'label': '4s',6: {'label': '6s',8: {'label': '8s',10: {'label': '10s','style': {'color': 'black'}}
                                }
                    ),style={
                    'width':'90%','display':'inline-block'
                })
               
             ]
        ),html.Div(
            children=[
                player.DashPlayer(
                    id='video-player',url='https://www.w3schools.com/html/mov_bbb.mp4',controls=False,width='100%'
                )
            ]
        )    
    ]
)

#Use slider to skip to or "seekTo" different spots in video
@app.callback(Output('video-player','seekTo'),Input('slider','value'))
def set_seekTo(value):
    return value

#Press button to play/pause video 1
@app.callback(
    Output("video-player","playing"),Output("slider","value"),Input("play-button","n_clicks"),State("video-player",State('slider','value'),"currentTime")
)
def play_video(n_clicks,playing,value,currentTime):
    value = currentTime
    if n_clicks:
        return not playing,value
    return playing,value




if __name__ == "__main__":
    app.run_server(debug=True,port=8050)

播放/暂停按钮工作正常,但忽略了将滑块与视频的当前时间同步的功能。没有错误信息。我在这里缺少什么?任何帮助将不胜感激!

解决方法

注意:我最初想将此作为评论,因为我无法让 fbprophet 功能与同步时间和滑块一起工作,但是对我的实现的解释太长而无法发表评论。下面列出了一种可以根据 dash player 组件的 seekTo 更新滑块值的方法,但不实现 currentTime


实施

seekTo

说明

上述实现的想法是创建一个回调以在每次 import os import dash import dash_html_components as html import dash_core_components as dcc import dash_player as player from flask import Flask,Response from dash.dependencies import Input,Output,State app = dash.Dash(__name__) app.layout = html.Div( children=[ html.Div( children=[ html.Div( [ html.Button("Play/Pause",id="play-button",n_clicks=0),],style={"width": "10%","display": "inline-block"},),html.Div( [ dcc.Slider( id="slider",min=0,max=10,step=1,value=0,marks={ 0: {"label": "0s","style": {"color": "black"}},2: {"label": "2s",4: {"label": "4s",6: {"label": "6s",8: {"label": "8s",10: {"label": "10s",},style={"width": "90%",] ),html.Div( children=[ player.DashPlayer( id="video-player",url="https://www.w3schools.com/html/mov_bbb.mp4",controls=False,width="100%",) ] ),] ) @app.callback(Output("slider","value"),Input("video-player","currentTime")) def update_slider(current_time): return current_time @app.callback( Output("video-player","playing"),Input("play-button","n_clicks"),State("video-player",) def play_video(n_clicks,playing): if n_clicks: return not playing return playing if __name__ == "__main__": app.run_server(debug=True,port=8050) 间隔更改时更新滑块值,并创建一个回调以在按下 currentTime 时处理播放和暂停视频。

请记住,我使用 play-button 作为输入,因此每次此值更改时都会调用回调。 It seems to change every 40 ms by default。您可以通过在 currentTime 上设置 intervalCurrentTime 道具来更改此间隔。

还请记住,此处的滑块值只会每秒更改一次,因为 DashPlayer 设置为 step。因此,如果您想要不同的行为,请将 1 值与 step 结合使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。