aboutsummaryrefslogtreecommitdiff
path: root/remuxer/src/muxers/mpeg4.rs
diff options
context:
space:
mode:
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(())
+ }
+}