encoder
This commit is contained in:
parent
8345565f9f
commit
87fd8c63eb
1 changed files with 33 additions and 11 deletions
|
@ -1,19 +1,17 @@
|
||||||
use std::{sync::Arc, thread::{self, sleep}, time::Duration};
|
use std::{net::SocketAddr, result, sync::Arc, thread::{self, sleep}, time::Duration};
|
||||||
|
|
||||||
use image::{ImageBuffer, Rgb};
|
use image::{ImageBuffer, Rgb};
|
||||||
use nokhwa::{pixel_format::RgbFormat, utils::{ApiBackend, RequestedFormat, RequestedFormatType, Resolution}, Camera};
|
use nokhwa::{pixel_format::RgbFormat, utils::{ApiBackend, RequestedFormat, RequestedFormatType, Resolution}, Camera};
|
||||||
use anyhow::{Context, Ok, Result};
|
use anyhow::{Context, Ok, Result};
|
||||||
use openh264::{encoder::Encoder, formats::{RgbSliceU8, YUVBuffer}, nal_units};
|
use openh264::{encoder::Encoder, formats::{RgbSliceU8, YUVBuffer}, nal_units};
|
||||||
use tokio::{runtime::Runtime, sync::{Notify, RwLock}, task::LocalSet};
|
use tokio::{io::AsyncWriteExt, net::{TcpListener, TcpStream}, runtime::Runtime, sync::{Notify, RwLock}, task::LocalSet};
|
||||||
|
|
||||||
fn main() -> Result<()>{
|
fn main() -> Result<()>{
|
||||||
let await_frame = Arc::new(Notify::new());
|
let await_frame = Arc::new(Notify::new());
|
||||||
let latest_frame = Arc::new(RwLock::new(YUVBuffer::new(0, 0)));
|
let latest_frame = Arc::new(RwLock::new(YUVBuffer::new(0, 0)));
|
||||||
println!("Hello, world!");
|
|
||||||
|
|
||||||
let runtime = Runtime::new()?;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
let runtime = Runtime::new()?;
|
||||||
let await_frame = await_frame.clone();
|
let await_frame = await_frame.clone();
|
||||||
let latest_frame = latest_frame.clone();
|
let latest_frame = latest_frame.clone();
|
||||||
thread::spawn(move || {
|
thread::spawn(move || {
|
||||||
|
@ -22,11 +20,18 @@ fn main() -> Result<()>{
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Runtime::new()?.block_on(async move {
|
{
|
||||||
stream_video(await_frame.clone(), latest_frame.clone()).await.unwrap();
|
let runtime = Runtime::new()?;
|
||||||
});
|
let await_frame = await_frame.clone();
|
||||||
|
let latest_frame = latest_frame.clone();
|
||||||
|
thread::spawn(move || {
|
||||||
|
let local = LocalSet::new();
|
||||||
|
local.block_on(&runtime, server(await_frame, latest_frame)).unwrap();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
|
||||||
|
loop {}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn camera_manager(await_frame: Arc<Notify>, latest_frame: Arc<RwLock<YUVBuffer>>) -> Result<()>{
|
async fn camera_manager(await_frame: Arc<Notify>, latest_frame: Arc<RwLock<YUVBuffer>>) -> Result<()>{
|
||||||
|
@ -52,7 +57,7 @@ async fn camera_manager(await_frame: Arc<Notify>, latest_frame: Arc<RwLock<YUVBu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn stream_video(await_frame: Arc<Notify>, latest_frame: Arc<RwLock<YUVBuffer>>) -> Result<()>{
|
async fn stream_video(await_frame: Arc<Notify>, latest_frame: Arc<RwLock<YUVBuffer>>, mut client: TcpStream) -> Result<()>{
|
||||||
let mut encoder = Encoder::new()?;
|
let mut encoder = Encoder::new()?;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
@ -61,8 +66,25 @@ async fn stream_video(await_frame: Arc<Notify>, latest_frame: Arc<RwLock<YUVBuff
|
||||||
let data = data.to_vec();
|
let data = data.to_vec();
|
||||||
println!("len: {}", data.len());
|
println!("len: {}", data.len());
|
||||||
|
|
||||||
}
|
let len = data.len();
|
||||||
|
|
||||||
|
let data2 = data.clone();
|
||||||
|
drop(data);
|
||||||
|
client.write(&data2).await?;
|
||||||
|
client.write_u32(len as u32).await?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn server(await_frame: Arc<Notify>, latest_frame: Arc<RwLock<YUVBuffer>>) -> Result<()> {
|
||||||
|
let port = 2993;
|
||||||
|
let listener = TcpListener::bind(format!("0.0.0.0:{port}")).await?;
|
||||||
|
println!("listening on {port}");
|
||||||
|
|
||||||
|
while let result::Result::Ok((client, addr)) = listener.accept().await {
|
||||||
|
println!("connected to {:?}", addr);
|
||||||
|
|
||||||
|
tokio::task::spawn_local(stream_video(await_frame.clone(), latest_frame.clone(), client));
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue