如何控制record-audio crate录制时长并停止录制保存音频文件?
解决record-audio 0.1.1的录制时长控制与停止保存问题
针对你使用record-audio = "0.1.1"遇到的录制时长控制、主动停止录制并保存的问题,提供两种解决方案:
1. 固定时长录制
record方法的参数支持传入录制的总帧数,通过时长×采样率计算出帧数即可实现固定时长录制。默认采样率通常为44100,示例代码如下:
use record_audio::audio_clip::{AudioClip as ac, AudioClip}; fn main() { record_audio_for_seconds(5); // 录制5秒音频 } fn record_audio_for_seconds(seconds: u64) { let sample_rate = 44100; // 默认采样率 let total_frames = sample_rate * seconds; // 计算总帧数 match ac::record(Some(total_frames)) { Ok(clip) => { println!("录制完成!"); match clip.export("record_fixed.wav") { Ok(_) => println!("音频已保存为record_fixed.wav"), Err(err) => println!("保存失败: {}", err), } } Err(err) => println!("录制失败: {}", err), } }
2. 程序主动控制停止录制
如果需要在自定义条件下停止录制(比如用户输入、逻辑触发),可以使用start_recording方法启动非阻塞录制,再调用stop()主动终止录制流程:
use record_audio::audio_clip::{AudioClip as ac, Recorder}; use std::thread; use std::time::Duration; fn main() { record_and_stop_manually(); } fn record_and_stop_manually() { // 启动非阻塞录制 let mut recorder = match ac::start_recording() { Ok(r) => r, Err(err) => { println!("启动录制失败: {}", err); return; } }; println!("录制中...3秒后自动停止"); // 模拟业务逻辑,这里用睡眠3秒替代 thread::sleep(Duration::from_secs(3)); // 主动停止录制并获取音频数据 let clip = match recorder.stop() { Ok(c) => c, Err(err) => { println!("停止录制失败: {}", err); return; } }; // 保存音频文件 match clip.export("record_manual.wav") { Ok(_) => println!("音频已保存为record_manual.wav"), Err(err) => println!("保存失败: {}", err), } }
注意事项
- 若你的音频设备采样率不是44100,可通过库的API获取设备实际采样率后再计算帧数,保证时长精准。
- 原代码中
ac::record(None)的逻辑是等待用户按下Enter键停止录制,录制完成后自动进入保存流程。
内容的提问来源于stack exchange,提问作者kcbbcn otfemb
相关产品推荐
相关产品推荐

