diff options
Diffstat (limited to 'transcoder/src')
-rw-r--r-- | transcoder/src/snippet.rs | 51 |
1 files changed, 43 insertions, 8 deletions
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(()) }, ) |