rustmotion 0.8.0

A CLI tool that renders motion design videos from JSON scenarios. No browser, no Node.js — just a single Rust binary.
Documentation
use minimp4::Mp4Muxer;
use std::fs::File;
use std::io::BufWriter;

use crate::error::Result;
use crate::schema::ResolvedScenario as Scenario;

#[allow(clippy::too_many_arguments)]
pub(super) fn mux_h264_to_mp4(
    h264_data: &[u8],
    output_path: &str,
    width: u32,
    height: u32,
    fps: u32,
    scenario: &Scenario,
    segment_duration: f64,
    scenario_total_duration: f64,
    segment_start: f64,
) -> Result<()> {
    let video_tracks = super::super::video_audio::collect_video_audio_tracks(scenario);
    let merged_audio: Vec<crate::schema::AudioTrack> = {
        let mut all = scenario.audio.clone();
        all.extend(video_tracks);
        all
    };

    let pcm_data = if !merged_audio.is_empty() {
        super::super::audio::mix_audio_tracks_segment(
            &merged_audio,
            scenario_total_duration,
            segment_start,
            segment_duration,
        )?
    } else {
        None
    };

    let file = File::create(output_path)?;
    let writer = BufWriter::new(file);
    let mut muxer = Mp4Muxer::new(writer);
    muxer.init_video(width as i32, height as i32, false, "rustmotion");
    if let Some(ref pcm) = pcm_data {
        muxer.init_audio(128000, crate::encode::audio::OUTPUT_SAMPLE_RATE, 2);
        muxer.write_video_with_audio(h264_data, fps, pcm);
    } else {
        muxer.write_video_with_fps(h264_data, fps);
    }
    muxer.close();

    Ok(())
}