realtime_stream/
realtime_stream.rs1use 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 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 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}