diff options
-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. +} |