当前位置: 首页 > news >正文

【Rust GUI开发入门】编写一个本地音乐播放器(2. Rodio播放库的使用)

本系列教程对应的代码已开源在 Github zeedle

添加依赖

在Cargo.toml添加:

[dependencies]
rodio = "0.21.1"

添加/播放/暂停音频

use std::{thread, time::Duration};use rodio::Decoder;
fn main() {// create an output streamlet stream_handle = rodio::OutputStreamBuilder::from_default_device().expect("no output device available").open_stream().expect("failed to open output stream");// create a sink to play audiolet sink = rodio::Sink::connect_new(&stream_handle.mixer());// open an audio filelet file = std::fs::File::open("audios/爱情转移.flac").expect("failed to open audio file");// decode the audio filelet source = Decoder::try_from(file).expect("failed to decode audio file");// append the audio source to the sink & auto playsink.append(source);// sleep for a while to let the audio playthread::sleep(Duration::from_secs(20));// pause the audio playback explicitlysink.pause();// sleep for a whilethread::sleep(Duration::from_secs(20));// resume the audio playback explicitlysink.play();// keep the main thread alive while the audio is playingthread::sleep(Duration::from_secs(20));
}

代码及主要API解读

  • stream_handle 是音频流句柄,直接跟硬件相关
  • rodio::Sink::connect_new 连接到音频流,返回一个Sink对象,是输出到stream_handle对应device的“音频管理器”
  • Decoder::try_from(file) 尝试解码音频文件
  • sink.append 向音频管理器中添加source并立刻自动启动播放
  • sink.pause 显式停止音频播放
  • sink.play 显式恢复音频播放
  • sink.clear 清除sink中存储的所有source,释放资源(这里并未用到)

注意

执行上述代码,会:

  1. 播放20秒音频
  2. 停止20秒
  3. 再播放20秒音频
  4. 程序退出

如果sink.append之后没有thread::sleep,程序会立刻结束,任何声音都不会被播放,这是因为,根据Rust变量的生命周期,stream_handle变量会在main函数右括号}处立刻释放,由于stream_handle管理了计算机音频输出设备硬件资源,当它超出生命周期被释放时,与之关联的任何音频播放(也就是sink中存在的所有source)都会被强制停止,这是Rodio库为了保护硬件资源做出的一个设计,大大减小了硬件不可控事件的出现。

还有一些额外的事情需要注意:

  • stream_handle直接持有了硬件资源,因此它不是线程安全的,无法在线程之间安全传递
  • sink借助stream_handle操控音频播放,因此stream_handle的生命周期一定长于sink
  • sink是线程安全的,可以在线程之间安全传递,后面制作音乐播放器时会大量用到这个特性,它能同时存在于UI线程与后台线程中,只要确保stream_handle的生命周期长于sink
http://www.dtcms.com/a/414363.html

相关文章:

  • 企业网站建设的方法有哪些wordpress 工具安装教程
  • LabVIEW 模拟单摆运动(DAE 法)
  • 【计算机基础】网络系列(一)HTTP
  • Linux与STM32实时性与系统资源解析
  • 深圳网站建设icxun邯郸二手房出售信息
  • 展示内容框
  • 衡石HQL深度解析:如何用类SQL语法实现跨源数据的高效联邦查询?
  • 明明是新电脑,却越用越卡?如何优化?
  • StringBuffer和StringBuilder
  • 华为本地pbr及mqc及traffic-filter使用案例
  • Spring 依赖注入
  • 南宁做网站优化的公司类似58同城分类信息网站开发
  • ArkTS基础语法
  • ROS-Jazzy_rclpy
  • Socket 编程 TCP(准备阶段)
  • 【Ultralytics】评估报错:解决 KeyError: ‘info‘ 错误
  • 哪些是实名制网站母了猜猜看游戏做网站
  • 【Linux】TCP原理
  • 论文阅读:arxiv 2024 Fast Adversarial Attacks on Language Models In One GPU Minute
  • OpenJDK 17 方法链接与同步方法入口点生成机制深度解析
  • qt-C++笔记之自定义绘制:QWidget中的paintEvent 与 QGraphicsItem中的paint
  • 项目:智能排队控制系统
  • LeetCode:71.字符串解码
  • LeetCode:66.搜索旋转排序数组
  • 阿帕奇网站搭建六安做网站的
  • wordpress去除评论表单电子商务seo优化
  • deepseek kotlin flow快生产者和慢消费者解决策略
  • 20.NFS iSCSI服务器
  • uniapp 搭建vue项目,快速搭建项目
  • 自动网页浏览助手:基于 Selenium + GLM-4V 的百度自动搜索与内容提取系统