aboutsummaryrefslogtreecommitdiff
path: root/remuxer/src/muxers/mpeg4.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-09-26 14:35:23 +0200
committermetamuffin <metamuffin@disroot.org>2025-09-26 14:35:23 +0200
commitf7e3841426ed4661ede6ccfff9c306141735d465 (patch)
tree793727cc80386bc1715869a3f54986e42897e656 /remuxer/src/muxers/mpeg4.rs
parent81bb9dee3ed8a029bec831e7c3f204cd0ed41472 (diff)
downloadjellything-f7e3841426ed4661ede6ccfff9c306141735d465.tar
jellything-f7e3841426ed4661ede6ccfff9c306141735d465.tar.bz2
jellything-f7e3841426ed4661ede6ccfff9c306141735d465.tar.zst
refactor remuxer trait; add webm support; add back transcodingHEADmaster
Diffstat (limited to 'remuxer/src/muxers/mpeg4.rs')
-rw-r--r--remuxer/src/muxers/mpeg4.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/remuxer/src/muxers/mpeg4.rs b/remuxer/src/muxers/mpeg4.rs
new file mode 100644
index 0000000..437f117
--- /dev/null
+++ b/remuxer/src/muxers/mpeg4.rs
@@ -0,0 +1,37 @@
+/*
+ This file is part of jellything (https://codeberg.org/metamuffin/jellything)
+ which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
+ Copyright (C) 2025 metamuffin <metamuffin.org>
+*/
+
+use crate::muxers::{FragmentMuxer, matroska::MatroskaFragmentMuxer};
+use anyhow::Result;
+use std::{
+ io::{Cursor, Write, copy},
+ process::{Command, Stdio},
+ thread::spawn,
+};
+use winter_matroska::Segment;
+
+pub struct Mpeg4FragmentMuxer;
+impl FragmentMuxer for Mpeg4FragmentMuxer {
+ fn write_fragment(out: &mut dyn Write, segment: Segment) -> Result<()> {
+ let mut mk_frag = Vec::new();
+ MatroskaFragmentMuxer::write_fragment(&mut mk_frag, segment)?;
+
+ let mut child = Command::new("ffmpeg")
+ .args(
+ "-hide_banner -f matroska -i pipe:0 -c copy -f mp4 -movflags frag_keyframe+empty_moov pipe:1"
+ .split(" "),
+ )
+ .stdin(Stdio::piped())
+ .stdout(Stdio::piped())
+ .spawn()?;
+
+ let mut stdin = child.stdin.take().unwrap();
+ let mut stdout = child.stdout.take().unwrap();
+ spawn(move || copy(&mut Cursor::new(mk_frag), &mut stdin));
+ copy(&mut stdout, out)?;
+ Ok(())
+ }
+}