mirror of
https://github.com/FliegendeWurst/ripgrep-all.git
synced 2024-11-24 12:24:56 +00:00
ffmpeg: process all subtitle streams
This commit is contained in:
parent
58345767dc
commit
be4b4fb8fe
@ -54,7 +54,7 @@ struct FFprobeOutput {
|
|||||||
}
|
}
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
struct FFprobeStream {
|
struct FFprobeStream {
|
||||||
codec_type: String, // video,audio,subtitle
|
index: i32, // stream index
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
@ -80,17 +80,13 @@ impl WritingFileAdapter for FFmpegAdapter {
|
|||||||
}
|
}
|
||||||
let inp_fname = filepath_hint;
|
let inp_fname = filepath_hint;
|
||||||
let spawn_fail = |e| map_exe_error(e, "ffprobe", "Make sure you have ffmpeg installed.");
|
let spawn_fail = |e| map_exe_error(e, "ffprobe", "Make sure you have ffmpeg installed.");
|
||||||
let has_subtitles = {
|
let subtitle_streams = {
|
||||||
let probe = Command::new("ffprobe")
|
let probe = Command::new("ffprobe")
|
||||||
.args(vec![
|
.args(vec![
|
||||||
"-v",
|
"-v", "error", // show all errors
|
||||||
"error",
|
"-select_streams", "s", // show only subtitle streams
|
||||||
"-select_streams",
|
"-of", "json", // use json as output format
|
||||||
"s",
|
"-show_entries", "stream=index", // show index of subtitle streams
|
||||||
"-of",
|
|
||||||
"json",
|
|
||||||
"-show_entries",
|
|
||||||
"stream=codec_type",
|
|
||||||
])
|
])
|
||||||
.arg("-i")
|
.arg("-i")
|
||||||
.arg(&inp_fname)
|
.arg(&inp_fname)
|
||||||
@ -105,7 +101,7 @@ impl WritingFileAdapter for FFmpegAdapter {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
let p: FFprobeOutput = serde_json::from_slice(&probe.stdout)?;
|
let p: FFprobeOutput = serde_json::from_slice(&probe.stdout)?;
|
||||||
!p.streams.is_empty()
|
p.streams
|
||||||
};
|
};
|
||||||
{
|
{
|
||||||
// extract file metadata (especially chapter names in a greppable format)
|
// extract file metadata (especially chapter names in a greppable format)
|
||||||
@ -138,14 +134,16 @@ impl WritingFileAdapter for FFmpegAdapter {
|
|||||||
return Err(format_err!("ffprobe failed: {:?}", exit));
|
return Err(format_err!("ffprobe failed: {:?}", exit));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if has_subtitles {
|
if subtitle_streams.len() > 0 {
|
||||||
|
for probe_stream in subtitle_streams.iter() {
|
||||||
// extract subtitles
|
// extract subtitles
|
||||||
let mut cmd = Command::new("ffmpeg");
|
let mut cmd = Command::new("ffmpeg");
|
||||||
cmd.arg("-hide_banner")
|
cmd.arg("-hide_banner")
|
||||||
.arg("-loglevel")
|
.arg("-loglevel").arg("panic")
|
||||||
.arg("panic")
|
|
||||||
.arg("-i")
|
.arg("-i")
|
||||||
.arg(&inp_fname)
|
.arg(&inp_fname)
|
||||||
|
.arg("-map")
|
||||||
|
.arg(format!("0:{}", probe_stream.index.to_string())) // 0 for first input
|
||||||
.arg("-f")
|
.arg("-f")
|
||||||
.arg("webvtt")
|
.arg("webvtt")
|
||||||
.arg("-");
|
.arg("-");
|
||||||
@ -166,6 +164,7 @@ impl WritingFileAdapter for FFmpegAdapter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user