mirror of
https://github.com/v0l/zap-stream-core.git
synced 2025-06-17 20:08:50 +00:00
fix: hls output fix
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -563,7 +563,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ffmpeg-rs-raw"
|
name = "ffmpeg-rs-raw"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://git.v0l.io/Kieran/ffmpeg-rs-raw.git?rev=6d443a24bcbe53c0a02a9dce3e41d22815229585#6d443a24bcbe53c0a02a9dce3e41d22815229585"
|
source = "git+https://git.v0l.io/Kieran/ffmpeg-rs-raw.git?rev=dc778d12a994f47236cb168b6145a2a563dba1ab#dc778d12a994f47236cb168b6145a2a563dba1ab"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"ffmpeg-sys-the-third",
|
"ffmpeg-sys-the-third",
|
||||||
|
@ -9,7 +9,7 @@ srt = ["dep:srt-tokio"]
|
|||||||
test-source = ["dep:resvg", "dep:usvg", "dep:tiny-skia", "dep:fontdue", "dep:ringbuf"]
|
test-source = ["dep:resvg", "dep:usvg", "dep:tiny-skia", "dep:fontdue", "dep:ringbuf"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ffmpeg-rs-raw = { git = "https://git.v0l.io/Kieran/ffmpeg-rs-raw.git", rev = "6d443a24bcbe53c0a02a9dce3e41d22815229585" }
|
ffmpeg-rs-raw = { git = "https://git.v0l.io/Kieran/ffmpeg-rs-raw.git", rev = "dc778d12a994f47236cb168b6145a2a563dba1ab" }
|
||||||
|
|
||||||
tokio = { version = "1.36.0", features = ["rt", "rt-multi-thread", "macros"] }
|
tokio = { version = "1.36.0", features = ["rt", "rt-multi-thread", "macros"] }
|
||||||
anyhow = { version = "^1.0.91", features = ["backtrace"] }
|
anyhow = { version = "^1.0.91", features = ["backtrace"] }
|
||||||
|
@ -56,7 +56,7 @@ impl HlsEgress {
|
|||||||
let mut opts = HashMap::new();
|
let mut opts = HashMap::new();
|
||||||
opts.insert(
|
opts.insert(
|
||||||
"hls_segment_filename".to_string(),
|
"hls_segment_filename".to_string(),
|
||||||
base.join("%v/live.m3u8").to_string_lossy().to_string(),
|
format!("{}/%v/%05d.ts", base.display()),
|
||||||
);
|
);
|
||||||
opts.insert("master_pl_name".to_string(), "live.m3u8".to_string());
|
opts.insert("master_pl_name".to_string(), "live.m3u8".to_string());
|
||||||
opts.insert("master_pl_publish_rate".to_string(), "10".to_string());
|
opts.insert("master_pl_publish_rate".to_string(), "10".to_string());
|
||||||
@ -65,7 +65,11 @@ impl HlsEgress {
|
|||||||
|
|
||||||
let muxer = unsafe {
|
let muxer = unsafe {
|
||||||
let mut m = Muxer::builder()
|
let mut m = Muxer::builder()
|
||||||
.with_output_path(base.to_str().unwrap(), Some("hls"), Some(opts))?
|
.with_output_path(
|
||||||
|
base.join("%v/live.m3u8").to_str().unwrap(),
|
||||||
|
Some("hls"),
|
||||||
|
Some(opts),
|
||||||
|
)?
|
||||||
.build()?;
|
.build()?;
|
||||||
for e in encoded {
|
for e in encoded {
|
||||||
m.add_stream_encoder(e)?;
|
m.add_stream_encoder(e)?;
|
||||||
|
@ -109,6 +109,13 @@ impl PipelineRunner {
|
|||||||
.iter()
|
.iter()
|
||||||
.filter(|v| v.src_index() == src_index as usize);
|
.filter(|v| v.src_index() == src_index as usize);
|
||||||
for var in pkt_vars {
|
for var in pkt_vars {
|
||||||
|
let enc = if let Some(enc) = self.encoders.get_mut(&var.id()) {
|
||||||
|
enc
|
||||||
|
} else {
|
||||||
|
//warn!("Frame had nowhere to go in {} :/", var.id());
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
|
||||||
let frame = match var {
|
let frame = match var {
|
||||||
VariantStream::Video(v) => {
|
VariantStream::Video(v) => {
|
||||||
if let Some(s) = self.scalers.get_mut(&v.id()) {
|
if let Some(s) = self.scalers.get_mut(&v.id()) {
|
||||||
@ -119,7 +126,9 @@ impl PipelineRunner {
|
|||||||
}
|
}
|
||||||
VariantStream::Audio(a) => {
|
VariantStream::Audio(a) => {
|
||||||
if let Some(r) = self.resampler.get_mut(&a.id()) {
|
if let Some(r) = self.resampler.get_mut(&a.id()) {
|
||||||
r.process_frame(frame)?
|
let frame_size = (*enc.codec_context()).frame_size;
|
||||||
|
// TODO: resample audio fifo
|
||||||
|
r.process_frame(frame, frame_size)?
|
||||||
} else {
|
} else {
|
||||||
frame
|
frame
|
||||||
}
|
}
|
||||||
@ -127,18 +136,13 @@ impl PipelineRunner {
|
|||||||
_ => frame,
|
_ => frame,
|
||||||
};
|
};
|
||||||
|
|
||||||
let packets = if let Some(enc) = self.encoders.get_mut(&var.id()) {
|
let packets = enc.encode_frame(frame)?;
|
||||||
enc.encode_frame(frame)?
|
|
||||||
} else {
|
|
||||||
//warn!("Frame had nowhere to go in {} :/", var.id());
|
|
||||||
continue;
|
|
||||||
};
|
|
||||||
|
|
||||||
// pass new packets to egress
|
// pass new packets to egress
|
||||||
for eg in self.egress.iter_mut() {
|
for mut pkt in packets {
|
||||||
for pkt in packets.iter() {
|
for eg in self.egress.iter_mut() {
|
||||||
eg.process_pkt(*pkt, &var.id())?;
|
eg.process_pkt(pkt, &var.id())?;
|
||||||
}
|
}
|
||||||
|
av_packet_free(&mut pkt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ impl Webhook {
|
|||||||
codec: 86018,
|
codec: 86018,
|
||||||
channels: 2,
|
channels: 2,
|
||||||
sample_rate: 48_000,
|
sample_rate: 48_000,
|
||||||
sample_fmt: "flt".to_owned(),
|
sample_fmt: "fltp".to_owned(),
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,16 +83,16 @@ impl Webhook {
|
|||||||
id: Uuid::new_v4(),
|
id: Uuid::new_v4(),
|
||||||
variants: vars,
|
variants: vars,
|
||||||
egress: vec![
|
egress: vec![
|
||||||
EgressType::Recorder(EgressConfig {
|
/*EgressType::Recorder(EgressConfig {
|
||||||
name: "REC".to_owned(),
|
name: "REC".to_owned(),
|
||||||
out_dir: self.config.output_dir.clone(),
|
out_dir: self.config.output_dir.clone(),
|
||||||
variants: var_ids,
|
variants: var_ids,
|
||||||
}),
|
}),*/
|
||||||
/*EgressType::HLS(EgressConfig {
|
EgressType::HLS(EgressConfig {
|
||||||
name: "HLS".to_owned(),
|
name: "HLS".to_owned(),
|
||||||
out_dir: self.config.output_dir.clone(),
|
out_dir: self.config.output_dir.clone(),
|
||||||
variants: var_ids,
|
variants: var_ids,
|
||||||
}),*/
|
}),
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user