diff options
-rw-r--r-- | Cargo.lock | 1 | ||||
-rw-r--r-- | transcoder/Cargo.toml | 1 | ||||
-rw-r--r-- | transcoder/src/snippet.rs | 51 |
3 files changed, 45 insertions, 8 deletions
@@ -1518,6 +1518,7 @@ dependencies = [ "imgref", "jellybase", "jellycommon", + "jellyremuxer", "log", "rav1e", "ravif", diff --git a/transcoder/Cargo.toml b/transcoder/Cargo.toml index ecb2bc8..16bd9d9 100644 --- a/transcoder/Cargo.toml +++ b/transcoder/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] jellycommon = { path = "../common" } jellybase = { path = "../base" } +jellyremuxer = { path = "../remuxer" } log = { workspace = true } image = { git = "https://github.com/image-rs/image", features = [ "avif-decoder", diff --git a/transcoder/src/snippet.rs b/transcoder/src/snippet.rs index c7033d8..56bd523 100644 --- a/transcoder/src/snippet.rs +++ b/transcoder/src/snippet.rs @@ -6,23 +6,58 @@ use jellybase::{cache::async_cache_file, AssetLocationExt}; use jellycommon::AssetLocation; +use std::process::Stdio; +use tokio::{fs::File, process::Command}; -pub async fn transcode( - asset: AssetLocation, - quality: f32, - speed: u8, - width: usize, -) -> anyhow::Result<AssetLocation> { +#[derive(Debug)] +pub enum Encoding { + Video { + codec: &'static str, + preset: u8, + bitrate: usize, + width: usize, + }, +} + +pub async fn transcode(asset: AssetLocation, enc: Encoding) -> anyhow::Result<AssetLocation> { let original_path = asset.path(); let asset = asset.clone(); Ok(async_cache_file( &[ "snip-tc", original_path.as_os_str().to_str().unwrap(), - &format!("{width} {quality} {speed}"), + &format!("{enc:?}"), ], move |output| async move { - + let args = match enc { + Encoding::Video { + codec, + preset, + bitrate, + width, + } => [ + "-vf".to_string(), + format!("scale={width}:-1"), + "-c:v".to_string(), + codec.to_string(), + "-preset".to_string(), + format!("{preset}"), + "-b:v".to_string(), + format!("{bitrate}"), + ] + .to_vec(), + }; + let mut proc = Command::new("ffmpeg") + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .args(&["-f", "mkv", "-i", "pipe:0"]) + .args(args) + .args(&["-f", "mkv", "pipe:1"]) + .spawn()?; + + let mut stdin = proc.stdin.take().unwrap(); + let mut stdout = proc.stdout.take().unwrap(); + Ok(()) }, ) |