Skip to content

Commit 4e822ff

Browse files
committed
[*] add video editor ui
1 parent 37c5727 commit 4e822ff

26 files changed

+1538
-96
lines changed
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
use std::{path::PathBuf, sync::Arc, time::Duration};
2+
use video_editor::{
3+
export::{audio_exporter::{AudioExporter, AudioExportConfig, AudioExportFormat}, ExportPhase},
4+
metadata::get_metadata,
5+
tracks::{
6+
manager::Manager,
7+
segment::Segment,
8+
track::{InnerTrack, Track},
9+
video_track::VideoTrack,
10+
},
11+
};
12+
13+
fn main() -> Result<(), Box<dyn std::error::Error>> {
14+
env_logger::init();
15+
16+
// Create manager and add video track
17+
let mut manager = Manager::new();
18+
19+
// Load video file
20+
let video_path = PathBuf::from("data/test.mp4");
21+
log::info!("Loading video from: {}", video_path.display());
22+
23+
let metadata = Arc::new(get_metadata(&video_path)?);
24+
25+
if metadata.videos.is_empty() && metadata.audios.is_empty() {
26+
panic!("No video or audio tracks found in video file");
27+
}
28+
29+
log::info!("Media info:");
30+
log::info!(" Duration: {:.2}s", metadata.duration.as_secs_f64());
31+
log::info!(" Video tracks: {}", metadata.videos.len());
32+
log::info!(" Audio tracks: {}", metadata.audios.len());
33+
34+
if !metadata.videos.is_empty() {
35+
let video_meta = &metadata.videos[0];
36+
log::info!(" Resolution: {}x{}", video_meta.width, video_meta.height);
37+
log::info!(" FPS: {}", video_meta.fps);
38+
}
39+
40+
if !metadata.audios.is_empty() {
41+
let audio_meta = &metadata.audios[0];
42+
log::info!(" Audio: {} ch, {} Hz", audio_meta.channels, audio_meta.sample_rate);
43+
}
44+
45+
// Create segment
46+
let segment = Segment::new(Duration::ZERO, metadata.duration, metadata.clone());
47+
48+
// Create video track (which includes audio)
49+
let inner_track = InnerTrack {
50+
metadata: metadata.clone(),
51+
segments: vec![Arc::new(segment)],
52+
duration: metadata.duration,
53+
};
54+
55+
let video_track = VideoTrack {
56+
hiding: false,
57+
muted: false,
58+
track: inner_track,
59+
};
60+
61+
manager.add_track(Track::Video(Arc::new(video_track)));
62+
63+
// Export audio in different formats
64+
let formats = vec![
65+
(AudioExportFormat::Aac, "tmp/output_audio.aac"),
66+
(AudioExportFormat::Mp3, "tmp/output_audio.mp3"),
67+
(AudioExportFormat::Wav, "tmp/output_audio.wav"),
68+
];
69+
70+
for (format, output_file) in formats {
71+
log::info!("=== Exporting audio as {:?} ===", format);
72+
73+
let config = AudioExportConfig::default()
74+
.with_output_path(PathBuf::from(output_file))
75+
.with_format(format)
76+
.with_bitrate(192_000);
77+
78+
// Export with progress callback
79+
log::info!("Starting export to: {}", output_file);
80+
let exporter = AudioExporter::new(Arc::new(manager.clone()), config);
81+
82+
match exporter.export_with_progress(|progress| {
83+
let percent = if progress.total_duration.as_secs_f64() > 0.0 {
84+
(progress.current_position.as_secs_f64()
85+
/ progress.total_duration.as_secs_f64())
86+
* 100.0
87+
} else {
88+
0.0
89+
};
90+
let phase_str = match progress.phase {
91+
ExportPhase::Initializing => "Initializing",
92+
ExportPhase::EncodingVideo => "Encoding",
93+
ExportPhase::ProcessingAudio => "Processing Audio",
94+
ExportPhase::Finalizing => "Finalizing",
95+
ExportPhase::Complete => "Complete",
96+
};
97+
log::info!(
98+
"[{:?}] Progress: {:.1}%",
99+
phase_str,
100+
percent
101+
);
102+
}) {
103+
Ok(result) => {
104+
log::info!("Export complete!");
105+
log::info!(" Output: {:?}", result.output_path);
106+
log::info!(" Duration: {:.2}s", result.duration.as_secs_f64());
107+
log::info!(" Channels: {}", result.channels);
108+
log::info!(" Sample rate: {} Hz", result.sample_rate);
109+
log::info!(" Total samples: {}", result.total_samples);
110+
}
111+
Err(e) => {
112+
log::error!("Failed to export audio as {:?}: {}", format, e);
113+
}
114+
}
115+
}
116+
117+
// Export with custom audio parameters
118+
log::info!("=== Exporting audio with custom parameters ===");
119+
120+
let config = AudioExportConfig::default()
121+
.with_output_path(PathBuf::from("tmp/output_audio_custom.aac"))
122+
.with_format(AudioExportFormat::Aac)
123+
.with_bitrate(256_000) // Higher bitrate
124+
.with_channels(Some(2)) // Stereo
125+
.with_sample_rate(Some(48000)); // 48 kHz
126+
127+
let exporter = AudioExporter::new(Arc::new(manager.clone()), config);
128+
129+
match exporter.export() {
130+
Ok(result) => {
131+
log::info!("Custom export complete!");
132+
log::info!(" Output: {:?}", result.output_path);
133+
log::info!(" Duration: {:.2}s", result.duration.as_secs_f64());
134+
}
135+
Err(e) => {
136+
log::error!("Failed to export audio with custom parameters: {}", e);
137+
}
138+
}
139+
140+
Ok(())
141+
}

0 commit comments

Comments
 (0)