get mapping by index
This commit is contained in:
parent
e72967a21c
commit
72a1cb9e5a
@ -91,7 +91,7 @@ pub fn ingest_server(
|
||||
|
||||
if let Some(mut filter) = dummy_media.filter {
|
||||
server_cmd.append(&mut filter.cmd());
|
||||
server_cmd.append(&mut filter.map());
|
||||
server_cmd.append(&mut filter.map(None));
|
||||
}
|
||||
|
||||
server_cmd.append(&mut config.processing.settings.unwrap());
|
||||
|
@ -104,7 +104,7 @@ pub fn player(
|
||||
|
||||
if let Some(mut filter) = node.filter {
|
||||
dec_cmd.append(&mut filter.cmd());
|
||||
dec_cmd.append(&mut filter.map());
|
||||
dec_cmd.append(&mut filter.map(None));
|
||||
}
|
||||
|
||||
dec_cmd.append(&mut config.processing.clone().settings.unwrap());
|
||||
|
@ -97,7 +97,7 @@ pub fn prepare_output_cmd(
|
||||
) -> Vec<String> {
|
||||
let mut output_params = config.out.clone().output_cmd.unwrap();
|
||||
let mut new_params = vec![];
|
||||
let mut count = 0;
|
||||
let mut count = 1;
|
||||
let re_map = Regex::new(r"(\[?[0-9]:[av](:[0-9]+)?\]?|-map$|\[[a-z_0-9]+\])").unwrap(); // match a/v filter links and mapping
|
||||
|
||||
if let Some(mut filter) = filters.clone() {
|
||||
@ -119,23 +119,7 @@ pub fn prepare_output_cmd(
|
||||
&& i < output_params.len() - 1
|
||||
{
|
||||
// add mapping to following outputs
|
||||
if filter.video_out_link.len() > count {
|
||||
new_params.append(&mut vec![
|
||||
"-map".to_string(),
|
||||
filter.video_out_link[count].clone(),
|
||||
]);
|
||||
} else {
|
||||
new_params.append(&mut vec!["-map".to_string(), "0:v".to_string()]);
|
||||
}
|
||||
|
||||
if filter.audio_out_link.len() > count {
|
||||
new_params.append(&mut vec![
|
||||
"-map".to_string(),
|
||||
filter.audio_out_link[count].clone(),
|
||||
]);
|
||||
} else if filter.audio_out_link.is_empty() {
|
||||
new_params.append(&mut vec!["-map".to_string(), "0:a:0".to_string()]);
|
||||
}
|
||||
new_params.append(&mut filter.map(Some(count)));
|
||||
|
||||
count += 1
|
||||
}
|
||||
@ -144,7 +128,12 @@ pub fn prepare_output_cmd(
|
||||
output_params = new_params;
|
||||
|
||||
cmd.append(&mut filter.cmd());
|
||||
cmd.append(&mut filter.map());
|
||||
|
||||
if config.out.output_count > 1 {
|
||||
cmd.append(&mut filter.map(Some(0)));
|
||||
} else {
|
||||
cmd.append(&mut filter.map(None));
|
||||
}
|
||||
}
|
||||
|
||||
cmd.append(&mut output_params);
|
||||
|
@ -17,6 +17,8 @@ use crate::utils::{
|
||||
PlayoutConfig,
|
||||
};
|
||||
|
||||
use super::vec_strings;
|
||||
|
||||
#[derive(Clone, Debug, Copy, Eq, PartialEq)]
|
||||
pub enum FilterType {
|
||||
Audio,
|
||||
@ -106,7 +108,7 @@ impl Filters {
|
||||
|
||||
let m = format!("[{}out{track_nr}]", filter_type);
|
||||
map.push(m.clone());
|
||||
self.output_map.append(&mut vec!["-map".to_string(), m]);
|
||||
self.output_map.append(&mut vec_strings!["-map", m]);
|
||||
*last = track_nr;
|
||||
} else if filter.starts_with(';') || filter.starts_with('[') {
|
||||
chain.push_str(filter);
|
||||
@ -143,14 +145,38 @@ impl Filters {
|
||||
cmd
|
||||
}
|
||||
|
||||
pub fn map(&mut self) -> Vec<String> {
|
||||
pub fn map(&mut self, output_number: Option<usize>) -> Vec<String> {
|
||||
let mut o_map = self.output_map.clone();
|
||||
|
||||
if let Some(n) = output_number {
|
||||
o_map.clear();
|
||||
|
||||
if self.video_out_link.len() > n {
|
||||
o_map.append(&mut vec_strings!["-map", self.video_out_link[n]])
|
||||
} else {
|
||||
o_map.append(&mut vec_strings!["-map", "0:v"])
|
||||
}
|
||||
|
||||
if self.audio_out_link.len() > n {
|
||||
o_map.append(&mut vec_strings!["-map", self.audio_out_link[n]])
|
||||
} else {
|
||||
for i in 0..self.audio_track_count {
|
||||
let a_map = format!("{}:a:{i}", self.audio_position);
|
||||
|
||||
if !o_map.contains(&a_map) {
|
||||
o_map.append(&mut vec_strings!["-map", a_map]);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return o_map;
|
||||
}
|
||||
|
||||
if self.video_last == -1 {
|
||||
let v_map = "0:v".to_string();
|
||||
|
||||
if !o_map.contains(&v_map) {
|
||||
o_map.append(&mut vec!["-map".to_string(), v_map]);
|
||||
o_map.append(&mut vec_strings!["-map", v_map]);
|
||||
};
|
||||
}
|
||||
|
||||
@ -159,7 +185,7 @@ impl Filters {
|
||||
let a_map = format!("{}:a:{i}", self.audio_position);
|
||||
|
||||
if !o_map.contains(&a_map) {
|
||||
o_map.append(&mut vec!["-map".to_string(), a_map]);
|
||||
o_map.append(&mut vec_strings!["-map", a_map]);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ fn check_media(
|
||||
|
||||
enc_cmd.append(&mut node.cmd.unwrap_or_default());
|
||||
enc_cmd.append(&mut filter.cmd());
|
||||
enc_cmd.append(&mut filter.map());
|
||||
enc_cmd.append(&mut filter.map(None));
|
||||
enc_cmd.append(&mut vec_strings!["-t", "0.1", "-f", "null", "-"]);
|
||||
|
||||
let mut enc_proc = match Command::new("ffmpeg")
|
||||
|
@ -30,7 +30,7 @@ fn video_audio_input() {
|
||||
Some(vec_strings!["-i", "./assets/with_audio.mp4"])
|
||||
);
|
||||
assert_eq!(media.filter.clone().unwrap().cmd(), test_filter_cmd);
|
||||
assert_eq!(media.filter.unwrap().map(), test_filter_map);
|
||||
assert_eq!(media.filter.unwrap().map(None), test_filter_map);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -55,7 +55,7 @@ fn video_audio_custom_filter1_input() {
|
||||
Some(vec_strings!["-i", "./assets/with_audio.mp4"])
|
||||
);
|
||||
assert_eq!(media.filter.clone().unwrap().cmd(), test_filter_cmd);
|
||||
assert_eq!(media.filter.unwrap().map(), test_filter_map);
|
||||
assert_eq!(media.filter.unwrap().map(None), test_filter_map);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -81,7 +81,7 @@ fn video_audio_custom_filter2_input() {
|
||||
Some(vec_strings!["-i", "./assets/with_audio.mp4"])
|
||||
);
|
||||
assert_eq!(media.filter.clone().unwrap().cmd(), test_filter_cmd);
|
||||
assert_eq!(media.filter.unwrap().map(), test_filter_map);
|
||||
assert_eq!(media.filter.unwrap().map(None), test_filter_map);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -107,7 +107,7 @@ fn dual_audio_aevalsrc_input() {
|
||||
Some(vec_strings!["-i", "./assets/with_audio.mp4"])
|
||||
);
|
||||
assert_eq!(media.filter.clone().unwrap().cmd(), test_filter_cmd);
|
||||
assert_eq!(media.filter.unwrap().map(), test_filter_map);
|
||||
assert_eq!(media.filter.unwrap().map(None), test_filter_map);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -132,7 +132,7 @@ fn dual_audio_input() {
|
||||
Some(vec_strings!["-i", "./assets/dual_audio.mp4"])
|
||||
);
|
||||
assert_eq!(media.filter.clone().unwrap().cmd(), test_filter_cmd);
|
||||
assert_eq!(media.filter.unwrap().map(), test_filter_map);
|
||||
assert_eq!(media.filter.unwrap().map(None), test_filter_map);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -165,7 +165,7 @@ fn video_separate_audio_input() {
|
||||
])
|
||||
);
|
||||
assert_eq!(media.filter.clone().unwrap().cmd(), test_filter_cmd);
|
||||
assert_eq!(media.filter.unwrap().map(), test_filter_map);
|
||||
assert_eq!(media.filter.unwrap().map(None), test_filter_map);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -392,9 +392,11 @@ fn video_audio_filter3_stream() {
|
||||
config.processing.add_logo = false;
|
||||
config.text.add_text = true;
|
||||
config.text.fontfile = String::new();
|
||||
config.out.output_filter = Some(
|
||||
"[0:v]null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[vout0]"
|
||||
.to_string(),
|
||||
);
|
||||
config.out.output_cmd = Some(vec_strings![
|
||||
"-filter_complex",
|
||||
"[0:v]null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[v_out0]",
|
||||
"-map",
|
||||
"[v_out0]",
|
||||
"-c:v",
|
||||
@ -444,9 +446,11 @@ fn video_audio_filter3_stream() {
|
||||
"-i",
|
||||
"pipe:0",
|
||||
"-filter_complex",
|
||||
format!("[0:v:0]zmq=b=tcp\\\\://'{socket}',drawtext@dyntext=text=''[vout0];[vout0]null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[v_out0]"),
|
||||
format!("[0:v:0]zmq=b=tcp\\\\://'{socket}',drawtext@dyntext=text='',null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[vout0]"),
|
||||
"-map",
|
||||
"[v_out0]",
|
||||
"[vout0]",
|
||||
"-map",
|
||||
"0:a:0",
|
||||
"-c:v",
|
||||
"libx264",
|
||||
"-c:a",
|
||||
@ -472,13 +476,15 @@ fn video_audio_filter4_stream() {
|
||||
config.processing.add_logo = false;
|
||||
config.text.add_text = true;
|
||||
config.text.fontfile = String::new();
|
||||
config.out.output_filter = Some(
|
||||
"[0:v]null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[vout0];[0:a:0]volume=0.2[aout0]"
|
||||
.to_string(),
|
||||
);
|
||||
config.out.output_cmd = Some(vec_strings![
|
||||
"-filter_complex",
|
||||
"[0:v]null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[v_out0];[0:a:0]volume=0.2[a_out0]",
|
||||
"-map",
|
||||
"[v_out0]",
|
||||
"[vout0]",
|
||||
"-map",
|
||||
"[a_out0]",
|
||||
"[aout0]",
|
||||
"-c:v",
|
||||
"libx264",
|
||||
"-c:a",
|
||||
@ -526,11 +532,11 @@ fn video_audio_filter4_stream() {
|
||||
"-i",
|
||||
"pipe:0",
|
||||
"-filter_complex",
|
||||
format!("[0:v:0]zmq=b=tcp\\\\://'{socket}',drawtext@dyntext=text=''[vout0];[vout0]null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[v_out0];[0:a:0]volume=0.2[a_out0]"),
|
||||
format!("[0:v:0]zmq=b=tcp\\\\://'{socket}',drawtext@dyntext=text='',null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[vout0];[0:a:0]volume=0.2[aout0]"),
|
||||
"-map",
|
||||
"[v_out0]",
|
||||
"[vout0]",
|
||||
"-map",
|
||||
"[a_out0]",
|
||||
"[aout0]",
|
||||
"-c:v",
|
||||
"libx264",
|
||||
"-c:a",
|
||||
@ -909,6 +915,7 @@ fn video_dual_audio_multi_filter_stream() {
|
||||
config.out.mode = Stream;
|
||||
config.processing.add_logo = false;
|
||||
config.processing.audio_tracks = 2;
|
||||
config.out.output_count = 2;
|
||||
config.text.fontfile = String::new();
|
||||
config.out.output_cmd = Some(vec_strings![
|
||||
"-map",
|
||||
@ -985,9 +992,9 @@ fn video_dual_audio_multi_filter_stream() {
|
||||
"-i",
|
||||
"pipe:0",
|
||||
"-filter_complex",
|
||||
format!("[0:v:0]zmq=b=tcp\\\\://'{socket}',drawtext@dyntext=text=''[vout0]"),
|
||||
format!("[0:v:0]zmq=b=tcp\\\\://'{socket}',drawtext@dyntext=text='',split=2[vout_0_0][vout_0_1]"),
|
||||
"-map",
|
||||
"[vout0]",
|
||||
"[vout_0_0]",
|
||||
"-map",
|
||||
"0:a:0",
|
||||
"-map",
|
||||
@ -1006,7 +1013,7 @@ fn video_dual_audio_multi_filter_stream() {
|
||||
"mpegts",
|
||||
"srt://127.0.0.1:40051",
|
||||
"-map",
|
||||
"[vout0]",
|
||||
"[vout_0_1]",
|
||||
"-map",
|
||||
"0:a:0",
|
||||
"-map",
|
||||
@ -1424,9 +1431,11 @@ fn multi_video_audio_hls() {
|
||||
config.out.mode = HLS;
|
||||
config.processing.add_logo = false;
|
||||
config.text.add_text = false;
|
||||
config.out.output_count = 2;
|
||||
config.out.output_filter = Some(
|
||||
"[0:v]split=2[v1_out][v2];[v2]scale=w=512:h=288[v2_out];[0:a]asplit=2[a1][a2]".to_string(),
|
||||
);
|
||||
config.out.output_cmd = Some(vec_strings![
|
||||
"-filter_complex",
|
||||
"[0:v]split=2[v1_out][v2];[v2]scale=w=512:h=288[v2_out];[0:a]asplit=2[a1][a2]",
|
||||
"-map",
|
||||
"[v1_out]",
|
||||
"-map",
|
||||
@ -1536,9 +1545,9 @@ fn multi_video_multi_audio_hls() {
|
||||
config.processing.add_logo = false;
|
||||
config.processing.audio_tracks = 2;
|
||||
config.text.add_text = false;
|
||||
config.out.output_count = 2;
|
||||
config.out.output_filter = Some("[0:v]split=2[v1_out][v2];[v2]scale=w=512:h=288[v2_out];[0:a:0]asplit=2[a_0_1][a_0_2];[0:a:1]asplit=2[a_1_1][a_1_2]".to_string());
|
||||
config.out.output_cmd = Some(vec_strings![
|
||||
"-filter_complex",
|
||||
"[0:v]split=2[v1_out][v2];[v2]scale=w=512:h=288[v2_out];[0:a:0]asplit=2[a_0_1][a_0_2];[0:a:1]asplit=2[a_1_1][a_1_2]",
|
||||
"-map",
|
||||
"[v1_out]",
|
||||
"-map",
|
||||
|
Loading…
x
Reference in New Issue
Block a user