From 92b119f95dd1cb24054f2440533208c140b66e46 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 14 Apr 2025 13:52:16 +0200 Subject: fix duration from mkmeta in fragment --- remuxer/src/fragment.rs | 18 +++++++++++++----- 1 file 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>> { 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. +} -- cgit v1.2.3-70-g09d2