在散景应用程序的 <video> 标签中引用本地文件

reference local file in a <video> tag in a bokeh app

下面是在 bokeh 应用中播放本地文件中的视频的最小示例 (non-working)。该应用程序使用 Div object 和 html <video> 标签。预期的行为是立即在应用程序中播放视频。 non-working部分是对本地视频文件的引用。

from bokeh.models import Div
from bokeh.io import curdoc


div = Div(text="""
    <video width="300px" height="150px" controls autoplay>
    <source src="movie.mp4" type="video/mp4"></video>
    """)

curdoc().add_root(div)

应用程序 so.py 和视频 movie.mp4,都在同一目录中。

运行 命令行中的应用在查找 movie.mp4

时指示 404 错误

浏览器中的应用程序屏幕截图表明视频播放器已加载但找不到视频。

还尝试了 <source src="file:///C:/so/movie.mp4" type="video/mp4"> 引用视频文件的完整路径,也 non-working。

我认为 Bokeh 不支持在打开页面时从本地目录自动加载视频文件。您需要将视频放在 Web 服务器上并使用 HTTP 协议加载它。正如@Doug Sillars 在他的 post 中指出的那样,您应该将 src="movie.mp4" 替换为 src="http://localhost:5006/so/sample.mp4" 并消除对 运行 外部 Mongoose Web 服务器的需求。所以你的代码会变得像下面的代码一样(它已经过测试并且可以正常工作!)运行 它与 bokeh serve --show so

main.py

from bokeh.models import Div
from bokeh.io import curdoc


div = Div(text="""
    <video width="300px" height="150px" controls autoplay>
    <source src="http://localhost:5006/so/static/movie.mp4" type="video/mp4"></video>
    """)

curdoc().add_root(div)

index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    {{ bokeh_css }}
    {{ bokeh_js }}
  </head>
  <body>
    {{ plot_div|indent(8) }}
    {{ plot_script|indent(8) }}
  </body>
</html>

directory structure:

so
   |
   +---main.py
   +---static
      +---movie.mp4
   +---templates
        +---index.html

另一种选择是使用 FileInput 小部件并让用户可以 select 来自本地文件系统的文件,如下例所示(在 Bokeh v2.2.1 上测试):

from bokeh.plotting import show
from bokeh.models import Div, Column, FileInput, CustomJS

code = '''  const file = document.getElementsByTagName('input')[0].files[0]
            var URL = window.URL || window.webkitURL 
            var fileURL = URL.createObjectURL(file)
            var videoNode = document.querySelector('video')
            videoNode.src = fileURL '''

div = Div(text="""<video width="500px" height="250px" controls><source src="" type="video/mp4"></video>""")
fileinput = FileInput(accept=".mp4,.mpg,.mov", visible = True, width = 250, name = 'fileinput')  
fileinput.js_on_change('value', CustomJS(args={'fileinput': fileinput}, code = code))

show(Column(div, fileinput))

似乎无法将视频作为本地文件播放,因为 security issues. Creating a very quick webserver using mongoose.ws 有效。上面的代码就变成了

from bokeh.models import Div
from bokeh.io import curdoc


div = Div(text="""
    <video width="300px" height="150px" controls autoplay>
    <source src="http://192.168.1.197:8000/movie.mp4" type="video/mp4"></video>
    """)

curdoc().add_root(div)

其中 URL 由 mongoose 应用程序创建。

您的页面位于 localhost:5006/so,但您请求的视频位于 localhost:5006/movie.mp4。我想你想要 localhost:5006/so/movie.mp4.