Skip to main content

realtime_stream/
realtime_stream.rs

1use dvrip_rs::{Authentication, Connection, DVRIPCam, Monitoring};
2use std::time::Duration;
3
4#[tokio::main]
5async fn main() -> Result<(), Box<dyn std::error::Error>> {
6    let args: Vec<String> = std::env::args().collect();
7    if args.len() < 4 {
8        println!("Usage: {} <IP> <Username> <Password>", args[0]);
9        return Ok(());
10    }
11
12    let ip = &args[1];
13    let user = &args[2];
14    let pass = &args[3];
15
16    let mut cam = DVRIPCam::new(ip);
17
18    println!("Connecting and logging in...");
19    cam.connect(Duration::from_secs(5)).await?;
20
21    if !cam.login(user, pass).await? {
22        println!("Login failed");
23        return Ok(());
24    }
25
26    println!("Starting real-time stream...");
27
28    // Define the frame callback
29    let callback = Box::new(|frame: Vec<u8>, metadata: dvrip_rs::FrameMetadata| {
30        println!(
31            "Received frame: {} bytes, Type: {:?}, MIME: {:?}, Size: {:?}x{:?}, Device Time: {:?}",
32            frame.len(),
33            metadata.frame_type.unwrap_or_else(|| "Unknown".to_string()),
34            metadata.media_type.unwrap_or_else(|| "Unknown".to_string()),
35            metadata.width.unwrap_or(0),
36            metadata.height.unwrap_or(0),
37            metadata.datetime
38        );
39    });
40
41    // Start monitoring on channel 0, main stream ("Main")
42    cam.start_monitor(callback, "Main", 0).await?;
43
44    println!("Receiving frames for 15 seconds. Press Ctrl+C to stop early.");
45    tokio::time::sleep(Duration::from_secs(15)).await;
46
47    println!("Stopping stream...");
48    cam.stop_monitor().await?;
49    cam.close().await?;
50
51    Ok(())
52}