C# NAudio 音频库
C# NAudio 音频库
- NAudio安装
- NAudio简述
- 简单示例1
- 录制麦克风
- 录制系统声卡
- WAV格式播放
- MP3格式播放
- AudioFileReader读取播放音频
- MediaFoundationReader 读取播放音频
NAudio安装
项目=>NuGet包管理器 搜索NAudio点击安装,自动安装依赖库。

安装成功后工具箱会新增NAudio.WinForms控件

NAudio简述
NAudio为.NET平台下的开源库,采用ML-PL协议,开源地址:https://github.com/naudio/NAudio支持多种音频操作,可实现多种API播放与录制、多种不同音频格式、音频格式转换(重采样、位深、声道等)、音频编码、多通道播放、音频效果处理等等。
快速入门
深入研究
常用类:
- WaveIn 表示波形输入, 继承了 IWaveIn, 例如麦克风输入, 或者计算机正在播放的音频流。
- WaveOut 表示波形输出, 继承了 IWavePlayer, 用来播放音频, 以 IWaveProvider 作为播放源播放音频, 通过拓展方法也支持以 ISampleProvider 作为播放源播放音频。
- WaveStream 表示波形流, 它继承了 IWaveProvider, 可以用来作为播放源。
- WaveFileReader 继承了 WaveStream, 用来读取波形文件。
- WaveFileWriter 继承了Stream, 用来写入文件, 常用于保存音频录制的数据。
- AudioFileReader 通用的音频文件读取器, 可以读取波形文件, 也可以读取其他类型的音频文件例如 Aiff, MP3
常用接口:
- IWaveProvider 波形提供者, 上面已经提到, 是音频播放的提供者, 通过拓展方法可以转换为 ISampleProvider。
- ISampleProvider 采样提供者, 上面已经提到, 通过拓展方法可以作为 WaveOut 的播放源。
简单示例1
自定义录音机类:Recorder.cs
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace NAudioDemo
{internal class Recorder{public WaveIn mWaveIn;public WaveFileWriter mWaveFileWriter;public int secondsRecorded;/// <summary>/// 开始录音/// </summary>/// <param name="filePath"></param>public void RecorderStart(string filePath){// 创建WaveIn对象mWaveIn = new WaveIn();// 添加DataAvailable事件处理回调mWaveIn.DataAvailable += OnDataAvailable;// 创建WaveFileWriter对象mWaveFileWriter = new WaveFileWriter(filePath, mWaveIn.WaveFormat);// 开始录音mWaveIn.StartRecording();}/// <summary>/// 停止录音/// </summary>public void RecorderStop(){mWaveIn?.StopRecording();mWaveIn?.Dispose();mWaveFileWriter?.Close();mWaveFileWriter = null;}/// <summary>/// 录音数据回调/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void OnDataAvailable(object sender, WaveInEventArgs e){// 写入录音数据mWaveFileWriter.Write(e.Buffer, 0, e.BytesRecorded); // 计算已录制的秒数secondsRecorded = (int)mWaveFileWriter.Length / mWaveFileWriter.WaveFormat.AverageBytesPerSecond;}}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;using System.IO;
using NAudio.Wave;
using System.Drawing.Text;
using System.Media;
using NAudio.Dsp;namespace NAudioDemo
{public partial class Form1 : Form{ // 创建录音机类实例Recorder recorder = new Recorder();public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}private void button1_Click(object sender, EventArgs e){button1.Enabled = false;button2.Enabled = true;recorder.RecorderStart(@"D:\1.wav");}private void button2_Click(object sender, EventArgs e){button1.Enabled = true;button2.Enabled = false;recorder.RecorderStop();}private void button3_Click(object sender, EventArgs e){SoundPlayer player = new SoundPlayer(@"D:\1.wav");player.Play(); }}
}

录制麦克风
-
借助 WaveIn 类, 我们可以轻易的捕获麦克风输入, 在每一次录制到数据时, 将数据写入到文件或其他流, 这就实现了保存录音
-
在保存波形文件时需要借助 WaveFileWriter, 当然, 如果你想保存为其他格式, 也可以使用其它的 Writer, 例如 CurWaveFileWriter 以及AiffFileWriter, 美中不足的是没有直接写入到 MP3 的 FileWriter
-
需要注意的是, 桌面程序可以直接使用 WaveIn, 其回调基于 Windows 消息, 所以无法在控制台应用中使用 WaveIn
-
如果要在控制台应用中实现录音, 只需要使用 WaveInEvent, 它的回调基于事件而不是 Windows 消息, 所以可以通用
-
示例代码:
WaveIn cap = new WaveIn(); // cap, capture
WaveFileWriter writer = new WaveFileWriter();
cap.DataAvailable += (s, args) => writer.Write(args.Buffer, 0, args.BytesRecorded); // 订阅事件
cap.StartRecording(); // 开始录制
cap.StopRecording(); // 停止录制
writer.Close(); // 关闭 FileWriter, 保存数据 -
另外, 除了使用 WaveIn, 你还可以使用 WasapiCapture, 它与 WaveIn 的使用方式是一致的, 可以用来录制麦克风
-
Wasapi 全称 Windows Audio Session Application Programming Interface (Windows音频会话应用编程接口)
-
具体 WaveIn, WaveInEvent, WasapiCapture 的性能, 笔者还没有测试过, 但估计不会有太大差异.
-
提示: WasapiCapture 和 WasapiLoopbackCapture 位于 NAudio.Wave 命名空间下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;using NAudio;
using NAudio.Wave;namespace NAudioDemo2
{public partial class Form2 : Form{private WaveIn waveIn = null;private WaveFileWriter writer = null;public Form2(){InitializeComponent();button2.Enabled = false;button3.Enabled = false;}/// <summary>/// 设置保存文件名称/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){saveFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);saveFileDialog1.Filter = "audio files (*.wav)|*.wav| all files (*.*)|*.*"; // 文件类型过滤saveFileDialog1.DefaultExt = "*.wav"; // 默认文件扩展名//saveFileDialog1.FileName = "1.wav"; // 默认文件名if (saveFileDialog1.ShowDialog() == DialogResult.OK){ string fName = saveFileDialog1.FileName; // 获取文件名textBox1.Text = fName;button2.Enabled = true;}}/// <summary>/// 开始录音/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button2_Click(object sender, EventArgs e){//waveIn = new WaveIn { WaveFormat = new WaveFormat(44100, 1) };waveIn = new WaveIn();waveIn.WaveFormat = new WaveFormat(44100, 1);writer = new WaveFileWriter(textBox1.Text.Trim(), waveIn.WaveFormat);waveIn.DataAvailable += (s, args) => writer.Write(args.Buffer, 0, args.BytesRecorded);waveIn.StartRecording();button2.Enabled = false;button3.Enabled = true;}/// <summary>/// 停止录音/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){waveIn.StopRecording();waveIn.Dispose();waveIn = null;writer.Flush();writer.Close();writer.Dispose();button2.Enabled = true;button3.Enabled = false;}}
}
录制系统声卡
录制声卡输出, 也就是录制计算机正在播放的声音, 借助 WasapiLoopbackCapture 即可简单实现, 使用方式与 WasapiCapture 无异
WasapiLoopbackCapture cap = new WasapiLoopbackCapture();
WaveFileWriter writer = new WaveFileWriter();
cap.DataAvailable += (s, args) => writer.Write(args.Buffer, 0, args.BytesRecorded);
cap.StartRecording();
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace NAudioDemo2
{public partial class Form3 : Form{private WasapiLoopbackCapture loopCap = new WasapiLoopbackCapture();private WaveFileWriter fileWriter;public Form3(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){SaveFileDialog saveFileDialog = new SaveFileDialog();saveFileDialog.Filter = "wave file *.wav|*.wav|all filse *.*|*.*";saveFileDialog.DefaultExt = ".wav";if (saveFileDialog.ShowDialog() == DialogResult.OK){string fName = saveFileDialog.FileName;textBox1.Text = fName; }}/// <summary>/// 录制声卡开始/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button2_Click(object sender, EventArgs e){fileWriter = new WaveFileWriter(textBox1.Text.Trim(), loopCap.WaveFormat) ;loopCap.DataAvailable += (s, args) => fileWriter.Write(args.Buffer, 0, args.BytesRecorded);loopCap.StartRecording();}/// <summary>/// 录制声卡停止/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){loopCap.StopRecording();fileWriter.Flush();fileWriter.Close();fileWriter.Dispose();}}
}
WAV格式播放
NAudio 中, 通过 WaveFileReader 来读取波形数据, 在实例化时, 你可以指定文件名或者是输入流, 这意味着你可以读取内存流中的音频数据.
WaveFileReader reader = new WaveFileReader(filepath);
WaveOut wout = new WaveOut();
wout.Init(reader); // 通过 IWaveProvider 为音频输出初始化
wout.Play(); // 至此, wout 将从指定的 reader 中提供的数据进行播放
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace NAudioDemo2
{public partial class Form4 : Form{private WaveOut wout_wav;WaveFileReader reader;public Form4(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "audio file *.wav|*.wav";ofd.DefaultExt = "*.wav";if (ofd.ShowDialog() == DialogResult.OK){string fName = ofd.FileName;textBox1.Text = fName;}}private void button2_Click(object sender, EventArgs e){reader = new WaveFileReader(textBox1.Text.Trim());wout_wav = new WaveOut();wout_wav.Init(reader);wout_wav.Play();}private void button3_Click(object sender, EventArgs e){wout_wav.Pause();}private void button4_Click(object sender, EventArgs e){wout_wav.Resume();}private void button5_Click(object sender, EventArgs e){wout_wav.Stop();wout_wav.Dispose();reader.Close();}}
}
MP3格式播放
播放 MP3 音乐其实与播放波形音乐没有太大区别, 只不过将 WaveFileReader 换成Mp3FileReader 罢了
Mp3FileReader reader = new Mp3FileReader(filepath);
WaveOut wout = new WaveOut();
wout.Init(reader);
wout.Play();
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace NAudioDemo2
{public partial class Form5 : Form{Mp3FileReader reader;WaveOut wout_mp3;public Form5(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "audio file *.mp3|*.mp3";ofd.DefaultExt = "*.mp3";if (ofd.ShowDialog() == DialogResult.OK){ string fName = ofd.FileName;textBox1.Text = fName;}}private void button2_Click(object sender, EventArgs e){reader = new Mp3FileReader(textBox1.Text);wout_mp3 = new WaveOut();wout_mp3.Init(reader);wout_mp3.Play();}private void button3_Click(object sender, EventArgs e){wout_mp3.Pause();}private void button4_Click(object sender, EventArgs e){wout_mp3.Resume();}private void button5_Click(object sender, EventArgs e){wout_mp3.Stop();wout_mp3.Dispose();reader.Close();reader.Dispose();}}
}
AudioFileReader读取播放音频
通过AudioFileReader读取音频文件可以播放.mp3, .wav, .flac等多种格式
AudioFileReader reader = new AudioFileReader (@“d:\1.mp3”);
WaveOut wout = new WaveOut ();
wout.Init(reader );
wout.Play();
wout.Pause();
wout.Resume();
wout.Stop();
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace NAudioDemo2
{public partial class Form6 : Form{AudioFileReader reader;WaveOut wout;public Form6(){InitializeComponent();}private void Form6_Load(object sender, EventArgs e){}private void button1_Click(object sender, EventArgs e){OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "audio file *.mp3|*.mp3|all files *.*|*.*";if (ofd.ShowDialog() == DialogResult.OK){ string fName = ofd.FileName;textBox1.Text = fName; }}private void button2_Click(object sender, EventArgs e){reader = new AudioFileReader(textBox1.Text.Trim());wout = new WaveOut();wout.Init(reader);wout.Play();}private void button3_Click(object sender, EventArgs e){wout.Pause(); }private void button4_Click(object sender, EventArgs e){wout.Resume();}private void button5_Click(object sender, EventArgs e){wout.Stop();wout.Dispose();reader.Close();reader.Dispose();}}
}
MediaFoundationReader 读取播放音频
通过MediaFoundationReader 读取音频文件可以播放.mp3, .wav, .flac等多种格式
MediaFoundationReader reader = new MediaFoundationReader (@“d:\1.mp3”);
WaveOut wout = new WaveOut ();
wout.Init(reader );
wout.Play();
wout.Pause();
wout.Resume();
wout.Stop();
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace NAudioDemo2
{public partial class Form7 : Form{MediaFoundationReader reader;WaveOut wout;public Form7(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "audio file *.mp3|*.mp3|all files *.*|*.*";ofd.DefaultExt = "*.mp3";if (ofd.ShowDialog() == DialogResult.OK){string fName = ofd.FileName;textBox1.Text = fName;}}private void button2_Click(object sender, EventArgs e){reader = new MediaFoundationReader(textBox1.Text.Trim());wout = new WaveOut();wout.Init(reader);wout.Play();}private void button3_Click(object sender, EventArgs e){wout.Pause();}private void button4_Click(object sender, EventArgs e){wout.Resume();}private void button5_Click(object sender, EventArgs e){wout.Stop();wout.Dispose();reader.Close();reader.Dispose();}}
}相关文章:
C# NAudio 音频库
C# NAudio 音频库 NAudio安装NAudio简述简单示例1录制麦克风录制系统声卡WAV格式播放MP3格式播放AudioFileReader读取播放音频MediaFoundationReader 读取播放音频 NAudio安装 项目>NuGet包管理器 搜索NAudio点击安装,自动安装依赖库。 安装成功后工具箱会新增…...
springcloudalibaba-3
一、Nacos Config入门 1. 搭建nacos环境【使用现有的nacos环境即可】 使用之前的即可 2. 在微服务中引入nacos的依赖 <!-- nacos配置依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-…...
异步复位同步释放与同步复位打拍
参考链接:复位系列之异步复位同步释放与同步复位打拍...
使用Python进行二维图像的三维重建
2D图像的三维重建是从一组2D图像中创建对象或场景的三维模型的过程。这个技术广泛应用于计算机视觉、机器人技术和虚拟现实等领域。 在本文中,我们将解释如何使用Python执行从2D图像到三维重建的过程。我们将使用TempleRing数据集作为示例,逐步演示这个过…...
go-zero微服务的使用
一、入门案例 1、使用goland创建一个工程 2、新建一个user.proto syntax "proto3";package user; // 这个地方表示生成的go的包名叫user option go_package "./user";message UserInfoRequest {int64 userId 1; }message UserInfoResponse {int64 user…...
Java排序算法之基数排序
基数排序(Radix Sort)是一种线性时间复杂度的排序算法,其时间复杂度为O(d(nk)),其中d是数字的位数,k是进制数。基数排序是一种非比较排序算法,它按照数位的大小来进行排序。它可以处理正整数、负整数和小数…...
Ubuntu20.0中安装Gradle
下载Gradle到temp文件夹 wget https://services.gradle.org/distributions/gradle-8.3-bin.zip -P /tmp 然后解压文件到/opt/gradle目录 sudo unzip -d /opt/gradle /tmp/gradle-8.3.zip 配置Gradle环境变量 接下来我们会创建一个gradle.sh文件来保存Gradle的环境变量 sudo…...
【Java并发编程六】多线程越界问题
ArrayList()越界错误 import java.util.ArrayList; public class myTest implements Runnable {static ArrayList<Integer> a new ArrayList<>(10);public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(new myTest());T…...
聊聊httpclient的disableConnectionState
序 本文主要研究一下httpclient的disableConnectionState disableConnectionState org/apache/http/impl/client/HttpClientBuilder.java /*** Disables connection state tracking.*/public final HttpClientBuilder disableConnectionState() {connectionStateDisabled t…...
Tomcat web.xml文件中的mime-mapping
在Tomcat安装目录的conf/web.xml文件中,定义了大量的<mime-mapping>元素,例如: 其中<extension>指定了文件的扩展名,<mime-type>指定了mime类型,放在<mime-mapping>元素中,就是将…...
【Java 进阶篇】JQuery 事件绑定:`on` 与 `off` 的奇妙舞曲
在前端开发的舞台上,用户与页面的互动是一场精彩的表演。而 JQuery,作为 JavaScript 的一种封装库,为这场表演提供了更为便捷和优雅的事件绑定方式。其中,on 和 off 两位主角,正是这场奇妙舞曲中的核心演员。在这篇博客…...
模块化Common JS 和 ES Module
目录 历程 1.几个函数:全局变量的污染,模块间没有联系 2.对象:暴露成员,外部可修改 3.立即执行函数:闭包实现模块私有作用域 common JS module和Module 过程 模块依赖:深度优先遍历、父 -> 子 -…...
基于java web个人财务管理系统
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
soc估计:DESIGN AND DEVELOPMENT OF SoC ESTIMATION MODEL USING MACHINE LEARNING
这是一篇印度那边学生的毕业论文,唯一要记录的是里面提到了一个特征构造的思想,记录如下: 论文思想: 特征选用速度、电流、电压、温度、平均电压、平均电流、平均速度,模型用cnnlstmlrlr 平均特征计算方式:…...
2、LeetCode之两数相加
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。 输入&am…...
redis三种集群方式
redis有三种集群方式:主从复制,哨兵模式和集群。 1.主从复制 主从复制原理: 从服务器连接主服务器,发送SYNC命令; 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所…...
Java --- JVM之垃圾回收相关算法
目录 一、垃圾标记算法 1.1、垃圾标记阶段:对象存活判断 1.2、引用计数算法 1.3、可达性分析算法 1.4、GC Roots 二、对象的finalization机制 2.1、生存还是死亡? 三、查看GC Roots 3.1、使用MAT查看 四、使用JProfiler分析OOM 五、清除阶段算…...
CentOS 7.9 安装 nginx
系统版本 # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)搜索nginx相关的软件包 yum search nginx显示已安装的与 “nginx” 相关的软件包 yum list | grep nginx列出可用的 Nginx 软件包 yum list nginx --showduplicates安装 Nginx yum install -y ng…...
Newman
近期在复习Postman的基础知识,在小破站上跟着百里老师系统复习了一遍,也做了一些笔记,希望可以给大家一点点启发。 一)如何安装Newman 1、下载并安装NodeJs 在官网下载NodeJs: Download | Node.js(官网的…...
Transformer中WordPiece/BPE等不同编码方式详解以及优缺点
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
