Skip to content

Commit 8456b9f

Browse files
committed
[*] refactor: video editor
1 parent a641947 commit 8456b9f

File tree

11 files changed

+198
-152
lines changed

11 files changed

+198
-152
lines changed

.github/workflows/linux-portal.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
- run: echo "The ${{ github.workspace }} is now ready to test your code on the runner."
1818
- run: ls ${{ github.workspace }}
1919
- run: sudo apt update
20-
- run: sudo apt install libxcb-composite0-dev upx imagemagick libasound2-dev libpipewire-0.3-dev libx264-dev libx11-dev libxi-dev libxtst-dev libevdev-dev libfontconfig-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev
20+
- run: sudo apt install libxcb-composite0-dev upx imagemagick libasound2-dev libpipewire-0.3-dev libx264-dev libx11-dev libxi-dev libxtst-dev libevdev-dev libfontconfig-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libavfilter-dev
2121
- run: sudo apt install qt6-base-dev qt6-tools-dev qt6-tools-dev-tools
2222

2323
- run: echo "start install Rust..."

.github/workflows/linux-wlr.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
- run: echo "The ${{ github.workspace }} is now ready to test your code on the runner."
1818
- run: ls ${{ github.workspace }}
1919
- run: sudo apt update
20-
- run: sudo apt install libxcb-composite0-dev upx imagemagick libasound2-dev libpipewire-0.3-dev libx264-dev libfontconfig-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev
20+
- run: sudo apt install libxcb-composite0-dev upx imagemagick libasound2-dev libpipewire-0.3-dev libx264-dev libfontconfig-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libavfilter-dev
2121
- run: sudo apt install qt6-base-dev qt6-tools-dev qt6-tools-dev-tools
2222

2323
- run: echo "start install Rust..."

lib/audio-utils/src/audio.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ pub fn resample_audio_with_channel(
222222
let mut processed = audio_data.to_vec();
223223

224224
if current_channels != target_channels {
225-
log::info!(
225+
log::debug!(
226226
"Converting audio from {current_channels} channels to {target_channels} channels",
227227
);
228228

@@ -238,7 +238,7 @@ pub fn resample_audio_with_channel(
238238
}
239239

240240
if current_sample_rate != target_sample_rate {
241-
log::info!("Resampling audio from {current_sample_rate} Hz to {target_sample_rate} Hz");
241+
log::debug!("Resampling audio from {current_sample_rate} Hz to {target_sample_rate} Hz");
242242
processed = resample_audio(
243243
&processed,
244244
current_sample_rate,

lib/recorder/src/speaker_recorder/speaker_recorder_windows.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
use crate::{
2-
audio_level::{apply_gain, calc_rms_level},
3-
speaker_recorder::{SpeakerRecorder, SpeakerRecorderConfig, SpeakerRecorderError},
4-
};
1+
use crate::speaker_recorder::{SpeakerRecorder, SpeakerRecorderConfig, SpeakerRecorderError};
2+
use audio_utils::audio_level::{apply_gain, calc_rms_level};
53
use crossbeam::channel::Sender;
64
use hound::WavSpec;
75
use spin_sleep::SpinSleeper;

lib/video-editor/src/tracks/audio_track.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ impl UnifiedAudioTracksMixerIterator {
249249
let is_loading = self.is_loading.clone();
250250
let sender = self.sender.clone();
251251

252-
log::info!(
252+
log::debug!(
253253
"audio background loading: {:?} -> {:?}",
254254
next_cache_timeline_offset,
255255
next_cache_timeline_offset + cache_duration
@@ -424,7 +424,7 @@ fn load_and_handle_samples(
424424
(mixed.len() as f64) / (output_sample_rate * output_channels as u32) as f64,
425425
);
426426

427-
log::info!(
427+
log::debug!(
428428
"Audio background loader completed: {} samples in {}ms",
429429
mixed.len(),
430430
request_start_time.elapsed().as_millis()

todo.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
## 问题
2-
3. 移动和resize会造成抖动
32

43
## 待验证
4+
3. 粘贴segment时,如果分割需要分割segment。分割的segment没有更新UI的audio sample和thumbnail
55

66

77
## 待实现功能

wayshot/src/logic/video_editor/command.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use super::project::{PROJECT_STATE, ProjectState};
1+
use super::{
2+
project::{PROJECT_STATE, ProjectState},
3+
segment::async_reload_segment_preview,
4+
};
25
use crate::{
36
global_store, logic_cb,
47
slint_generatedAppWindow::{
@@ -197,8 +200,10 @@ fn video_editor_paste(ui: &AppWindow) {
197200
}
198201
}
199202

200-
let pasted_count = segments_to_paste.len();
203+
let mut need_split = false;
204+
let mut split_segment_index = 0;
201205
let mut batch_command = BatchCommand::new("Paste segments".to_string());
206+
let pasted_count = segments_to_paste.len();
202207

203208
let result = with_history_manager(|state| {
204209
// 检查当前编辑的轨道类型是否与 segments 类型一致
@@ -232,10 +237,7 @@ fn video_editor_paste(ui: &AppWindow) {
232237
));
233238
}
234239

235-
// 找到 timeline_offset 所在的 segment 位置
236240
let mut insert_index = track.segments_count();
237-
let mut need_split = false;
238-
let mut split_segment_index = 0;
239241
let mut split_time = Duration::ZERO;
240242

241243
for (i, segment) in track.segments().iter().enumerate() {
@@ -288,6 +290,16 @@ fn video_editor_paste(ui: &AppWindow) {
288290
match result {
289291
Ok(()) => {
290292
sync_manager_to_ui(ui);
293+
294+
if need_split {
295+
async_reload_segment_preview(ui.as_weak(), track_idx, split_segment_index, false);
296+
async_reload_segment_preview(
297+
ui.as_weak(),
298+
track_idx,
299+
split_segment_index + 2,
300+
true,
301+
);
302+
}
291303
crate::toast_success!(
292304
ui,
293305
format!(

wayshot/src/logic/video_editor/preview.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,10 +204,21 @@ fn stop_playback() {
204204
}
205205

206206
fn seek_to_position(ui: &AppWindow, position: Duration) {
207+
let was_previewing = global_store!(ui).get_video_editor_is_previewing();
208+
if was_previewing {
209+
global_store!(ui).set_video_editor_is_previewing(false);
210+
}
211+
212+
stop_playback();
213+
207214
let ui_state = global_store!(ui).get_video_editor_ui_state();
208215
let volume = ui_state.preview_volumn.clamp(0.0, 100.0) / 100.0;
209216

210-
if let Some(renderer) = create_renderer(ui, position, volume) {
217+
if let Some(mut renderer) = create_renderer(ui, position, volume) {
218+
if was_previewing && let Err(e) = renderer.play() {
219+
log::error!("Failed to resume playback: {:?}", e);
220+
}
221+
211222
if let Some(frame) = renderer.current_frame() {
212223
let img = rgba_image_to_slint(frame);
213224
global_store!(ui).set_video_editor_preview_image(img);
@@ -218,6 +229,12 @@ fn seek_to_position(ui: &AppWindow, position: Duration) {
218229
}
219230

220231
global_store!(ui).set_video_editor_timeline_offset(position.as_millis() as i32);
232+
233+
// 如果之前正在预览,恢复预览状态并启动播放线程
234+
if was_previewing {
235+
global_store!(ui).set_video_editor_is_previewing(true);
236+
start_playback_update_thread(ui.as_weak());
237+
}
221238
}
222239

223240
pub fn rgba_image_to_slint(frame: &image::RgbaImage) -> slint::Image {
@@ -296,4 +313,3 @@ fn start_playback_update_thread(ui_weak: Weak<AppWindow>) {
296313
}
297314
});
298315
}
299-

0 commit comments

Comments
 (0)