diff options
author | metamuffin <metamuffin@disroot.org> | 2025-04-14 13:52:16 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-04-14 13:52:16 +0200 |
commit | 92b119f95dd1cb24054f2440533208c140b66e46 (patch) | |
tree | eeec02f3b00bbe64baf1cc57bafa2b4bd4c0d0ba | |
parent | a3afc2756a52f7d6fedc928b97c8ff3eb1ade338 (diff) | |
download | jellything-92b119f95dd1cb24054f2440533208c140b66e46.tar jellything-92b119f95dd1cb24054f2440533208c140b66e46.tar.bz2 jellything-92b119f95dd1cb24054f2440533208c140b66e46.tar.zst |
fix duration from mkmeta in fragment
-rw-r--r-- | remuxer/src/fragment.rs | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/remuxer/src/fragment.rs b/remuxer/src/fragment.rs index 73fe046..0da1ed5 100644 --- a/remuxer/src/fragment.rs +++ b/remuxer/src/fragment.rs @@ -5,8 +5,10 @@ */ use crate::{ - ebml_header, ebml_segment_info, ebml_track_entry, metadata::matroska_metadata, - seek_index::get_seek_index, segment_extractor::SegmentExtractIter, + ebml_header, ebml_segment_info, ebml_track_entry, + metadata::{matroska_metadata, MatroskaMetadata}, + seek_index::get_seek_index, + segment_extractor::SegmentExtractIter, }; use anyhow::{anyhow, Context, Result}; use jellymatroska::{read::EbmlReader, write::EbmlWriter, Master, MatroskaTag}; @@ -18,11 +20,11 @@ use std::{ path::Path, }; -const FRAGMENT_LENGTH: f64 = 2.; +const FRAGMENT_LENGTH: f64 = 5.; pub fn fragment_index(path: &Path, track: u64) -> Result<Vec<Range<f64>>> { let meta = matroska_metadata(path)?; - let duration = meta.info.as_ref().unwrap().duration.unwrap(); + let duration = media_duration(&meta); let force_kf = meta .as_ref() .tracks @@ -87,7 +89,7 @@ pub fn write_fragment_into( n: usize, ) -> anyhow::Result<()> { let meta = matroska_metadata(path)?; - let duration = meta.info.as_ref().unwrap().duration.unwrap(); + let duration = media_duration(&meta); let track_meta = meta .as_ref() .tracks @@ -118,6 +120,7 @@ pub fn write_fragment_into( } else { index.keyframes.len() }; + debug!("{duration} {n_kf}"); let average_kf_interval = duration / n_kf as f64; let kf_per_frag = (FRAGMENT_LENGTH / average_kf_interval).ceil() as usize; debug!("average keyframe interval: {average_kf_interval}"); @@ -209,3 +212,8 @@ pub fn write_fragment_into( debug!("wrote {} bytes", output.position()); Ok(()) } + +fn media_duration(m: &MatroskaMetadata) -> f64 { + let info = m.info.as_ref().unwrap(); + (info.duration.unwrap_or_default() * info.timestamp_scale as f64) / 1_000_000_000. +} |