aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--remuxer/src/fragment.rs18
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.
+}