最可靠方式是用IPython.display.Video插入视频:本地用filename="demo.mp4"、网络用url参数,必须加embed=True和html_attributes={'controls':'controls'};Markdown语法不支持视频,手动写HTML或转码MP4可提升兼容性。

直接用 IPython.display.Video 插入本地或 URL 视频
这是最可靠、兼容性最好的方式,支持 MP4、WebM、OGG 等主流格式,且能控制播放行为。关键点是:必须传入字节流(embed=True)或明确指定 html_attributes 才能在所有内核中正常播放。
- 本地视频需用
filename参数,路径为相对于 notebook 当前工作目录的相对路径(不是绝对路径),例如:Video(filename="demo.mp4", embed=True) - 网络视频用
url参数,但注意部分浏览器会因 CORS 拒绝加载;建议优先用本地文件或托管在同源服务上 - 务必加
embed=True,否则可能只显示下载链接而非内嵌播放器;不加该参数时,Video默认返回一个可点击的链接 - 可添加控制条:
html_attributes={'controls': 'controls'};自动播放需额外加autoplay和loop,但现代浏览器普遍屏蔽无交互触发的自动播放
Markdown 单元格里用  无效
Markdown 语法只支持图片(img 标签),不解析视频。写成  不会报错,但渲染结果是损坏的图片占位符或空白——因为浏览器无法把视频当作图片加载。
- 别被“图片语法看起来像通用媒体插入”误导,它底层就是
<img src="...">,而<video>是完全不同的 HTML 元素 - 如果误用了 Markdown 语法,单元格输出区域通常显示 “broken image” 图标或一段原始文本,不会有任何错误提示
- 想用纯标记语言,唯一可行的是手动写 HTML:
<video controls><source src="demo.mp4" type="video/mp4"></video>,但需确保 notebook 启用了 HTML 渲染(默认开启)
用 matplotlib 或 cv2 显示视频帧 ≠ 嵌入可播放视频
这类方法本质是逐帧读取并用 plt.imshow() 显示静态图像,或者用 OpenCV 的 cv2.imshow() 弹出独立窗口——它们都不属于 notebook 内嵌视频,也不支持时间轴、暂停、音量等交互功能。
-
cv2.imshow()在 notebook 中几乎必然失败(报错cv2.error: OpenCV(4.x): The function is not implemented.),因为 notebook 内核没有 GUI 上下文 -
matplotlib.animation.FuncAnimation可以生成动图(GIF/MP4),但输出的是单帧合成的动画文件,不是原生视频流;且导出过程慢、体积大、不支持音频 - 真正需要“演示模型效果”的场景(比如展示跟踪框随帧变化),应优先走
IPython.display.Video+ 预处理为 MP4(用imageio或opencv-python合成),而不是实时渲染
常见错误:视频路径正确但不显示
问题往往不在代码本身,而在 notebook 工作目录、文件编码或 MIME 类型识别上。
- 运行
!pwd和!ls -l demo.mp4确认当前路径和文件存在;Jupyter 启动时的目录才是基准,不是 notebook 文件所在目录 - Windows 用户注意路径分隔符:用
filename="data\demo.mp4"或filename=r"datademo.mp4",斜杠反斜杠混用会导致FileNotFoundError - 某些 MP4 文件封装格式不被浏览器支持(如 HEVC 编码),用
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4转码后再试 - 如果视频有音频但静音播放,检查是否被浏览器策略禁用;可尝试加
html_attributes={'muted': 'muted', 'autoplay': 'autoplay'}强制静音启动
实际嵌入视频最稳的写法就一行:Video(filename="clip.mp4", embed=True, html_attributes={'controls': 'controls'})。其他方式要么功能残缺,要么依赖环境、容易失效。真正的难点从来不在“怎么写”,而在“怎么让视频文件刚好放在对的位置、用对的编码、被浏览器认出来”。


















