From 6887dfcf9774cb692a8375e0320ffcf80edb9536 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 2 Oct 2023 12:07:59 +0200 Subject: started transcoding --- transcoder/Cargo.toml | 1 + transcoder/src/snippet.rs | 51 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 8 deletions(-) (limited to 'transcoder') 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 { +#[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 { 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(()) }, ) -- cgit v1.2.3-70-g09d2