This commit is contained in:
2026-07-31 20:20:48 +01:00
parent d4b77bd717
commit c1435a70fb
12 changed files with 1009 additions and 168 deletions
+32 -15
View File
@@ -34,12 +34,11 @@ pub struct Rtmp {
async fn write_outbound(socket: &mut TcpStream, results: Vec<ServerSessionResult>) {
for r in results {
if let ServerSessionResult::OutboundResponse(p) = r {
if let Err(e) = socket.write_all(&p.bytes).await {
if let ServerSessionResult::OutboundResponse(p) = r
&& let Err(e) = socket.write_all(&p.bytes).await {
warn!("RTMP write error: {e}");
return;
}
}
}
}
@@ -96,8 +95,8 @@ impl Rtmp {
x => return Err(format!("unexpected handshake state: {:?}", x).into()),
}
let (rtmp_session, init_bytes) =
ServerSession::new(ServerSessionConfig::new()).map_err(|e| format!("ServerSession::new failed: {e}"))?;
let (rtmp_session, init_bytes) = ServerSession::new(ServerSessionConfig::new())
.map_err(|e| format!("ServerSession::new failed: {e}"))?;
write_outbound(&mut socket, init_bytes).await;
Ok((rtmp_session, socket))
@@ -127,8 +126,8 @@ impl Rtmp {
}
};
info!(%peer_addr, "RTMP handshake complete");
let (mut video_tx, mut video_rx) = broadcast::<Arc<VideoFrame>>(32);
let (mut audio_tx, mut audio_rx) = broadcast::<Arc<OpusAudioFrame>>(32);
let (mut video_tx, video_rx) = broadcast::<Arc<VideoFrame>>(32);
let (mut audio_tx, audio_rx) = broadcast::<Arc<OpusAudioFrame>>(32);
// video_rx.cycle
video_tx.set_overflow(true);
@@ -215,7 +214,9 @@ impl Rtmp {
let reply = match session.accept_request(request_id) {
Ok(r) => r,
Err(e) => {
warn!("Failed to accept connection request {request_id}: {e}");
warn!(
"Failed to accept connection request {request_id}: {e}"
);
return;
}
};
@@ -235,7 +236,11 @@ impl Rtmp {
key
} else {
warn!(stream_key = %stream_key, "stream key not found, rejecting");
let reply = match session.reject_request(request_id, "", "Stream key invalid") {
let reply = match session.reject_request(
request_id,
"",
"Stream key invalid",
) {
Ok(r) => r,
Err(e) => {
warn!("Failed to reject stream key request: {e}");
@@ -255,10 +260,16 @@ impl Rtmp {
Ok(s) => s,
Err(e) => {
warn!("DB error checking active stream: {e}");
let reply = match session.reject_request(request_id, "", "Internal error") {
let reply = match session.reject_request(
request_id,
"",
"Internal error",
) {
Ok(r) => r,
Err(e2) => {
warn!("Failed to reject request on DB error: {e2}");
warn!(
"Failed to reject request on DB error: {e2}"
);
return;
}
};
@@ -294,6 +305,9 @@ impl Rtmp {
audio_channel: audio_tx.clone(),
codec: None,
started_at: Utc::now(),
active_clients: 0.into(),
video_pt: None,
video_profile_level_id: None,
},
);
@@ -312,7 +326,11 @@ impl Rtmp {
.await
{
warn!("Failed to create stream session record: {e}");
let _ = session.reject_request(request_id, "", "Internal error");
let _ = session.reject_request(
request_id,
"",
"Internal error",
);
return;
}
stream_id = Some(key.id);
@@ -343,13 +361,12 @@ impl Rtmp {
} => match Self::parse_video_codec(&data) {
Ok(codec) => {
if !codec_stamped {
if let Some(id) = current_stream_key_id {
if let Some(mut session) =
if let Some(id) = current_stream_key_id
&& let Some(mut session) =
stream_sessions.get_mut(&id)
{
session.codec = Some(codec.clone());
}
}
codec_stamped = true;
}
match codec {