nwb-video-widgets
Interactive Jupyter widgets for NWB video and pose estimation visualization. Built with anywidget for compatibility across JupyterLab, Jupyter Notebook, VS Code, and Google Colab.
Table of Contents
Installation
For local only NWB file usage:
pip install nwb-video-widgets
For DANDI integration and streaming support:
pip install nwb-video-widgets[dandi]
Testing
To test the widgets with DANDI streaming, run the example notebook in an environment where nwb-video-widgets[dandi] is installed:
notebooks/example_notebook.ipynb
Video Codec Requirements
These widgets render video directly in the browser using the HTML5 <video> element, which only supports browser-native codecs. Videos encoded with other codecs will raise a ValueError when the widget is created.
Supported codecs:
| Codec | Common container |
|---|---|
| H.264 (AVC) | .mp4, .mov |
| VP8 | .webm |
| VP9 | .webm |
| AV1 | .mp4, .webm |
Common unsupported codecs found in NWB datasets include MJPEG (.avi), MPEG-4 Part 2 (mp4v), and FFV1. If you encounter a ValueError, re-encode to H.264 with ffmpeg:
ffmpeg -i input.avi -c:v libx264 -crf 18 -pix_fmt yuv420p output_h264.mp4
Video Player Widgets
Multi-camera synchronized video player with configurable layout (Row, Column, or Grid).
Features:
- Interactive settings panel for video selection
- Multiple layout modes (Row, Column, Grid)
- Synchronized playback across all videos
- Session time display with NWB timestamps
DANDI Streaming
Use NWBDANDIVideoPlayer for videos hosted on DANDI:
from dandi.dandiapi import DandiAPIClient
from nwb_video_widgets import NWBDANDIVideoPlayer
client = DandiAPIClient()
dandiset = client.get_dandiset("000409", "draft")
asset = dandiset.get_asset_by_path("sub-NYU-39/sub-NYU-39_ses-..._behavior.nwb")
widget = NWBDANDIVideoPlayer(asset=asset)
widget
Local Files
Use NWBLocalVideoPlayer for local NWB files:
from pynwb import read_nwb
from nwb_video_widgets import NWBLocalVideoPlayer
nwbfile = read_nwb("experiment.nwb")
widget = NWBLocalVideoPlayer(nwbfile)
widget
Fixed Grid Layout
When you know exactly which videos you want to display and how to arrange them, use the video_grid parameter to bypass the interactive settings panel. This is useful for:
- Reproducible notebooks where you want consistent output
- Presentations or demos with predetermined layouts
- Embedding widgets in dashboards or reports
The video_grid parameter accepts a 2D list where each inner list represents a row of videos:
# Single row of three cameras
widget = NWBLocalVideoPlayer(
nwbfile,
video_grid=[["VideoLeftCamera", "VideoBodyCamera", "VideoRightCamera"]]
)
# 2x2 grid layout
widget = NWBLocalVideoPlayer(
nwbfile,
video_grid=[
["VideoLeftCamera", "VideoRightCamera"],
["VideoBodyCamera", "VideoTopCamera"],
]
)
# Asymmetric grid (2 videos on top, 1 on bottom)
widget = NWBLocalVideoPlayer(
nwbfile,
video_grid=[
["VideoLeftCamera", "VideoRightCamera"],
["VideoBodyCamera"],
]
)
The same parameter works with NWBDANDIVideoPlayer:
widget = NWBDANDIVideoPlayer(
asset=asset,
video_grid=[["VideoLeftCamera", "VideoRightCamera"]]
)
Video names that don't exist in the NWB file are silently skipped.
Custom Video Labels
By default, the video name from the NWB file is displayed under each video. Use the video_labels parameter to provide custom display names:
widget = NWBLocalVideoPlayer(
nwbfile,
video_grid=[["VideoLeftCamera", "VideoRightCamera"]],
video_labels={
"VideoLeftCamera": "Left",
"VideoRightCamera": "Right",
}
)
Videos not in the dictionary will display their original name.
Pose Estimation Widgets
Overlays DeepLabCut keypoints on streaming video with support for camera selection.
Features:
- Camera selection via settings panel
- Keypoint visibility toggles (All/None/individual)
- Label display toggle
- Session time display (NWB timestamps)
- Custom keypoint colors via colormap or explicit hex values
- Supports split files (videos in raw file, pose in processed file)
DANDI Streaming
Use NWBDANDIPoseEstimationWidget for DANDI-hosted files:
from dandi.dandiapi import DandiAPIClient
from nwb_video_widgets import NWBDANDIPoseEstimationWidget
client = DandiAPIClient()
dandiset = client.get_dandiset("000409", "draft")
# Single file (videos + pose in same file)
asset = dandiset.get_asset_by_path("sub-.../sub-..._combined.nwb")
widget = NWBDANDIPoseEstimationWidget(asset=asset)
# Or split files (videos in raw, pose in processed)
raw_asset = dandiset.get_asset_by_path("sub-.../sub-..._desc-raw.nwb")
processed_asset = dandiset.get_asset_by_path("sub-.../sub-..._desc-processed.nwb")
widget = NWBDANDIPoseEstimationWidget(
asset=processed_asset,
video_asset=raw_asset,
)
widget
Local Files
Use NWBLocalPoseEstimationWidget for local NWB files:
from pynwb import read_nwb
from nwb_video_widgets import NWBLocalPoseEstimationWidget
# Single file
nwbfile = read_nwb("experiment.nwb")
widget = NWBLocalPoseEstimationWidget(nwbfile)
widget
# Or split files
nwbfile_raw = read_nwb("raw.nwb")
nwbfile_processed = read_nwb("processed.nwb")
widget = NWBLocalPoseEstimationWidget(
nwbfile=nwbfile_processed,
video_nwbfile=nwbfile_raw,
)
widget
Parameters:
| Parameter | Type | Description |
|---|---|---|
keypoint_colors |
str or dict |
Matplotlib colormap name (e.g., 'tab10') or dict mapping keypoint names to hex colors |
default_camera |
str |
Camera to display initially |
Metadata
Release files for nwb-video-widgets 0.1.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| nwb_video_widgets-0.1.7.tar.gz | 3.3 MB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nwb_video_widgets-0.1.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 3.4 MB
Release files / nwb_video_widgets-0.1.7.tar.gz
| Download URL | nwb_video_widgets-0.1.7.tar.gz |
|---|---|
| Size | 3.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0ee5ca447309abd5948f6353bb9d619e0096745850bd5fb00ae0cdbe6eb75852
|
|
BLAKE2b-256 checksum How to use checksums |
5de9cf38ef69b5c8b3d979b03afdf3bc8c5b77122e614880e23d8016e91dc0aa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 14, 2026.
Transparency logRelease files / nwb_video_widgets-0.1.7-py3-none-any.whl
| Download URL | nwb_video_widgets-0.1.7-py3-none-any.whl |
|---|---|
| Size | 59.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3de395bed5b0842a4893d6c4fcdc32fa136ee33f22c008689c6c6aebf641994c
|
|
BLAKE2b-256 checksum How to use checksums |
8174ec635858c48711b2f5480e9b383063d84117ab0a006b647439dc874ae9bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 14, 2026.
Transparency logSecurity for nwb-video-widgets 0.1.7
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for nwb_video_widgets-0.1.7.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 14, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.