录制和播放音频
通过系统音频输入和输出设备录制和播放音频数据,以便在 MATLAB® 中进行处理。Google Chrome® 支持在 MATLAB Online™ 和 MATLAB Web App Server™ 中进行音频播放和音频录制。
录制音频
从音频输入设备(例如与系统相连的麦克风)录制数据:
创建
audiorecorder
对象。调用
record
或recordblocking
方法,其中:record
将当前的控制权返回给调用函数或命令提示符,甚至在录制进行过程中也是如此。可以指定录制时长(秒)或者使用stop
方法结束录制。也可以选择调用pause
和resume
方法。录制以异步方式进行。recordblocking
会一直保留控制权,直至录制完成。指定录制时长(秒)。录制以同步方式进行。
使用
getaudiodata
方法创建一个与信号数据对应的数值数组。
以下示例演示如何使用 recordblocking
和 record
方法。
录制麦克风输入
以下示例演示如何录制麦克风输入、播放录音,以及将录制的音频信号存储在数值数组中。您必须首先将麦克风连接到您的系统。
使用名为 recObj
的默认属性创建一个 audiorecorder
对象,用于录制音频输入。
recObj = audiorecorder
recObj = audiorecorder with properties: SampleRate: 8000 BitsPerSample: 8 NumChannels: 1 DeviceID: -1 CurrentSample: 1 TotalSamples: 0 Running: 'off' StartFcn: [] StopFcn: [] TimerFcn: [] TimerPeriod: 0.0500 Tag: '' UserData: [] Type: 'audiorecorder'
audiorecorder
创建 8000 Hz、8 位、1 通道的 audiorecorder
对象。
将您的语音录制 5 秒。
recDuration = 5; disp("Begin speaking.") recordblocking(recObj,recDuration); disp("End of recording.")
播放该录音。
play(recObj);
将数据存储在双精度数组 y
中。
y = getaudiodata(recObj);
绘制音频样本图。
plot(y);
录制来自不同声卡的两个通道
要独立地录制来自两个不同的声卡(并且每个声卡都连接了一个麦克风)的音频:
调用
audiodevinfo
以列出可用的声卡。例如,以下代码返回一个结构体数组,其中包含系统上的所有输入和输出音频设备。通过名称确定您要使用的声卡,并记录其info = audiodevinfo;
ID
值。创建两个
audiorecorder
对象。例如,以下代码创建audiorecorder
对象recorder1
,用于以 44.1 kHz 和每样本 16 位的方式录制设备 3 的单个通道。然后,代码创建audiorecorder
对象recorder2
,用于以 48 kHz 录制设备 4 的单个通道。recorder1 = audiorecorder(44100,16,1,3); recorder2 = audiorecorder(48000,16,1,4);
独立录制每个音频通道。
当对record(recorder1); record(recorder2); pause(5);
record
的首个调用不排他时,会同时进行录制。停止录制。
stop(recorder1); stop(recorder2);
指定录制质量
默认情况下,audiorecorder
对象使用 8000 Hz 的采样率、8 位(每个样本 8 位)的深度和单个音频通道。使用这些设置时,所需的数据存储量很低。要获取更高质量的录音,可增加采样率或位深。
例如,光盘使用 44,100 Hz 的采样率、16 位位深和两个音频通道。创建一个 audiorecorder
对象以使用这些设置进行录制。
myRecObj = audiorecorder(44100,16,2);
有关可用的属性和值的详细信息,请参阅 audiorecorder
参考页。
播放音频
在导入或录制音频后,MATLAB 支持以多种方式收听数据:
对于使用单个函数调用的简单播放,可使用
sound
或soundsc
。例如,加载一个包含信号和采样率数据的样本 MAT 文件并收听音频。load chirp.mat sound(y,Fs)
要在播放过程中获得更大的灵活性,包括暂停、恢复或定义回调的功能,可使用
audioplayer
函数。创建一个audioplayer
对象,然后调用播放音频的方法。例如,收听gong
样本文件。load gong.mat gong = audioplayer(y,Fs); play(gong);
有关其他示例,请参阅在函数内录制或播放音频。
如果未指定采样率,则 sound
将以 8192 Hz 播放。对于任何播放,指定的采样率越小,则播放的速度越慢;采样率越大,则播放的速度越快。
注意
大多数声卡支持大约 5000 到 192,000 Hz 之间的采样率。指定此范围之外的采样率可能会产生意外结果。
在函数内录制或播放音频
如果在函数内部创建 audioplayer
或 audiorecorder
对象,则该对象仅在函数的持续时间内存在。例如,创建一个名为 playFile
的播放器函数和一个简单的回调函数 showSeconds
。
function playFile(myfile) load(myfile) obj = audioplayer(y,Fs); obj.TimerFcn = 'showSeconds'; obj.TimerPeriod = 1; play(obj); end function showSeconds disp("tick") end
从命令提示符调用 playFile
以播放文件 handel.mat
。
playFile("handel.mat")
按照录音采样率(每秒 8192 个样本),播放文件中的 73.113 个样本大约需要 8.9 秒。但是,playFile
函数通常会在播放完成前结束,并清除 audioplayer
对象 obj
。
对于完整的播放或录制,请考虑以下选项:
使用
playblocking
或recordblocking
而不是play
或record
。排他方法会一直保留控制权,直至播放或录制完成。如果对控制权实施排他,则无法在播放或录制过程发出任何其他命令或方法(例如pause
或resume
)。为在基础工作区中生成对象的函数创建一个输出参量。例如,修改
playFile
函数以包括输出参量。function obj = playFile(myfile)
调用函数。
h = playFile("handel.mat");
因为
h
存在于基础工作区中,所以可以从命令提示符暂停播放。pause(h)
另请参阅
audioplayer
| sound
| soundsc
| audiorecorder