support multiple output stream

This commit is contained in:
jb-alvarado 2022-05-30 21:40:32 +02:00
parent 5c3bec328a
commit 9c3fa83bec
2 changed files with 59 additions and 9 deletions

View File

@ -125,7 +125,7 @@ pub fn player(
let mut dec_reader = BufReader::new(dec_proc.stdout.take().unwrap());
let dec_err = BufReader::new(dec_proc.stderr.take().unwrap());
let error_decoder_thread = thread::spawn(move || stderr_reader(dec_err, "Encoder"));
let error_decoder_thread = thread::spawn(move || stderr_reader(dec_err, "Decoder"));
*proc_control.decoder_term.lock().unwrap() = Some(dec_proc);

View File

@ -10,10 +10,15 @@ use crate::vec_strings;
///
/// Prepare the ffmpeg command for streaming output
pub fn output(config: &GlobalConfig, log_format: &str) -> process::Child {
let mut enc_filter: Vec<String> = vec![];
let mut preview: Vec<String> = vec_strings![];
let mut enc_filter = vec![];
let mut preview = vec![];
let mut preview_cmd = config.out.preview_cmd.as_ref().unwrap().clone();
let mut output_cmd = config.out.output_cmd.as_ref().unwrap().clone();
let output_cmd = config.out.output_cmd.as_ref().unwrap().clone();
let params_len = output_cmd.len();
let mut output_count = 1;
let mut output_v_map = "[v_out1]".to_string();
let mut output_params = output_cmd.clone();
let mut filter = String::new();
let mut enc_cmd = vec_strings![
"-hide_banner",
@ -31,27 +36,72 @@ pub fn output(config: &GlobalConfig, log_format: &str) -> process::Child {
config.text.bind_address
);
let mut filter = "[0:v]null,".to_string();
filter.push_str("[0:v]null,");
filter.push_str(
v_drawtext::filter_node(config, &mut Media::new(0, String::new(), false)).as_str(),
);
if config.out.preview {
filter.push_str(",split=2[v_out1][v_out2]");
output_count += 1;
output_v_map.push_str(format!("[v_out{output_count}]").as_str());
preview = vec_strings!["-map", "[v_out1]", "-map", "0:a"];
preview.append(&mut preview_cmd);
preview.append(&mut vec_strings!["-map", "[v_out2]", "-map", "0:a"]);
}
enc_filter = vec!["-filter_complex".to_string(), filter];
output_params.clear();
// check for multiple outputs and add mapping to it
for (i, param) in output_cmd.iter().enumerate() {
output_params.push(param.clone());
if i > 0
&& !param.starts_with('-')
&& !output_cmd[i - 1].starts_with('-')
&& i < params_len - 1
{
output_count += 1;
let v_map = format!("[v_out{output_count}]");
output_v_map.push_str(v_map.as_str());
let mut map = vec![
"-map".to_string(),
v_map,
"-map".to_string(),
"0:a".to_string(),
];
output_params.append(&mut map);
}
}
if output_count > 1 {
if !filter.is_empty() {
filter.push(',');
}
filter.push_str(format!("split={output_count}{output_v_map}").as_str());
println!("{}", output_params[0]);
if preview.is_empty() {
output_params.insert(0, "-map".to_string());
output_params.insert(1, "[v_out1]".to_string());
output_params.insert(2, "-map".to_string());
output_params.insert(3, "0:a".to_string());
}
}
if !filter.is_empty() {
enc_filter = vec!["-filter_complex".to_string(), filter];
}
} else if config.out.preview {
preview = preview_cmd
preview = preview_cmd;
}
enc_cmd.append(&mut enc_filter);
enc_cmd.append(&mut preview);
enc_cmd.append(&mut output_cmd);
enc_cmd.append(&mut output_params);
debug!(
"Encoder CMD: <bright-blue>\"ffmpeg {}\"</>",