mirror of
https://github.com/valmojr/armatak.git
synced 2026-06-13 15:43:29 +00:00
Added video feed support for Linux clients
This commit is contained in:
@@ -26,11 +26,77 @@ pub fn start_stream(
|
||||
) -> &'static str {
|
||||
#[cfg(target_os = "linux")]
|
||||
{
|
||||
_ = ctx.callback_null(
|
||||
"VIDEO ERROR",
|
||||
"Screen capture is only supported on Windows",
|
||||
);
|
||||
return "screen capture unsupported";
|
||||
let (stop_tx, stop_rx): (Sender<()>, Receiver<()>) = mpsc::channel();
|
||||
let (status_tx, status_rx): (Sender<Result<(), String>>, Receiver<Result<(), String>>) = mpsc::channel();
|
||||
|
||||
let rtsp_url = if username.is_empty() || password.is_empty() {
|
||||
format!("rtsp://{}:{}/{}", address, port, stream_path)
|
||||
} else {
|
||||
format!(
|
||||
"rtsp://{}:{}@{}:{}/{}",
|
||||
username, password, address, port, stream_path
|
||||
)
|
||||
};
|
||||
|
||||
let rtsp_url_clone = rtsp_url.clone();
|
||||
|
||||
thread::spawn(move || {
|
||||
let mut cmd = Command::new("ffmpeg");
|
||||
cmd.args(&[
|
||||
"-f",
|
||||
"gdigrab",
|
||||
"-i",
|
||||
"desktop",
|
||||
"-f",
|
||||
"rtsp",
|
||||
"-rtsp_transport",
|
||||
"tcp",
|
||||
&rtsp_url_clone,
|
||||
]);
|
||||
|
||||
// Try to spawn ffmpeg process
|
||||
let child_result = cmd.spawn();
|
||||
|
||||
match child_result {
|
||||
Ok(mut child) => {
|
||||
let _ = status_tx.send(Ok(()));
|
||||
if stop_rx.recv().is_err() {}
|
||||
let _ = child.kill();
|
||||
}
|
||||
Err(e) => {
|
||||
let _ = status_tx.send(Err(format!("Failed to start FFmpeg: {}", e)));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Save the stop channel
|
||||
match STREAM_CTRL.lock() {
|
||||
Ok(mut lock) => *lock = Some(stop_tx),
|
||||
Err(e) => {
|
||||
let _ = ctx.callback_data(
|
||||
"VIDEO ERROR",
|
||||
"Failed to acquire lock for stream control",
|
||||
e.to_string(),
|
||||
);
|
||||
return "stream control lock error";
|
||||
}
|
||||
}
|
||||
|
||||
// Wait up to 2 seconds to see if ffmpeg started correctly
|
||||
match status_rx.recv_timeout(Duration::from_secs(2)) {
|
||||
Ok(Ok(())) => {
|
||||
let _ = ctx.callback_null("VIDEO", "FFmpeg started successfully");
|
||||
"starting video stream"
|
||||
}
|
||||
Ok(Err(e)) => {
|
||||
let _ = ctx.callback_data("VIDEO ERROR", "FFmpeg failed to start", e);
|
||||
"ffmpeg failed to start"
|
||||
}
|
||||
Err(_) => {
|
||||
let _ = ctx.callback_null("VIDEO ERROR", "FFmpeg did not respond in time");
|
||||
"ffmpeg did not respond"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
|
||||
Reference in New Issue
Block a user