Rust library and terminal UI for Brain Products BrainVision Recorder RDA EEG streams over TCP/IP.
- Pure-Rust BrainVision RDA protocol parser (Start / Data16 / Data32 / Stop)
- High-level
BrainVisionDeviceAPI overTcpStream - Reconnect with exponential backoff
- Stream abstractions:
next_block(),next_scan(),capture() - Marker parsing and export helpers (
CSV, BrainVision-like triplet) - CLI and ratatui TUI binaries
- Optional feature flags:
dsp,verify,sandbox,tui
cargo add brainvisionuse brainvision::prelude::*;
let mut dev = BrainVisionDevice::connect_default("127.0.0.1")?;
let header = dev.wait_for_start()?;
println!("{} channels @ {:.2} Hz", header.channel_count, header.sampling_rate_hz());
let scans = dev.capture(1000)?;
println!("Captured {} scans", scans.len());In BrainVision Recorder:
- Enable Remote Data Access (RDA)
- Select port:
51244(int16 stream)51234(float32 stream)
- Start acquisition in Recorder before running client
Environment variables:
BRAINVISION_HOST(default127.0.0.1)BRAINVISION_PORT(default51244)
[GUID:16] [SIZE:4 little-endian] [PAYLOAD: SIZE-20 bytes]
Message GUIDs:
- Start/header
- Data16 (int16 samples)
- Data32 (float32 samples)
- Stop
Data blocks include:
- block number
- number of points
- marker count
- interleaved channel samples
- marker records (
size, position, points, channel, type, description)
write_scans_csv(path, scans)write_markers_csv(path, markers)write_brainvision_triplet(prefix, header, scans, markers)writes:<prefix>.vhdr<prefix>.eeg.csv<prefix>.vmrk.csv
- Connected but no Start message
- Ensure Recorder RDA is enabled and acquisition actually started.
- Connection refused
- Check host/port and local firewall.
- Frequent reconnects
- Increase Recorder stability / network quality.
- Use
next_block_resilient()backoff.
- Flat lines or wrong amplitudes
- Verify channel resolutions from Start header.
brainvision-rs/
├── src/
│ ├── lib.rs
│ ├── main.rs
│ ├── bin/tui.rs
│ ├── types.rs
│ ├── protocol.rs
│ ├── device.rs
│ ├── export.rs
│ ├── dsp.rs
│ ├── verify.rs
│ ├── sandbox.rs
│ └── error.rs
├── examples/
│ ├── scan.rs
│ ├── stream.rs
│ └── read_eeg.rs
└── tests/
└── types_tests.rs