本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

录制和播放音频

通过系统音频输入和输出设备录制和播放音频数据,以便在 MATLAB® 中进行处理。

录制音频

从音频输入设备(例如与系统相连的麦克风)录制数据:

  1. 创建 audiorecorder 对象。

  2. 调用 recordrecordblocking 方法,其中:

    • record 将当前的控制权返回给调用函数或命令提示符,甚至在录制进行过程中也是如此。可以指定录制时长(秒)或者使用 stop 方法结束录制。也可以选择调用 pauseresume 方法。录制以异步方式进行。

    • recordblocking 会一直保留控制权,直至录制完成。指定录制时长(秒)。录制以同步方式进行。

  3. 使用 getaudiodata 方法创建一个与信号数据对应的数值数组。

以下示例演示如何使用 recordblockingrecord 方法。

录制麦克风输入

以下示例演示如何录制麦克风输入、播放录音,以及将录制的音频信号存储在数值数组中。您必须首先将麦克风连接到您的系统。

创建一个名为 recObjaudiorecorder 对象,以用于录制音频输入。

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 秒。

disp('Start speaking.')
recordblocking(recObj, 5);
disp('End of Recording.');

播放该录音。

play(recObj);

将数据存储在双精度数组 y 中。

y = getaudiodata(recObj);

绘制音频样本图。

plot(y);

录制来自不同声卡的两个通道

要独立地录制来自两个不同的声卡(并且每个声卡都连接了一个麦克风)的音频:

  1. 调用 audiodevinfo 以列出可用的声卡。例如,以下代码返回一个结构体数组,其中包含系统上的所有输入和输出音频设备:

    info = audiodevinfo;
    通过名称确定您要使用的声卡,并记录其 ID 值。

  2. 创建两个 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);
    

  3. 独立录制每个音频通道。

    record(recorder1);
    record(recorder2); 
    pause(5);
    当对 record 的首个调用不排他时,会同时进行录制。

  4. 停止录制。

    stop(recorder1);
    stop(recorder2); 

指定录制质量

默认情况下,audiorecorder 对象使用 8000 赫兹的采样率、8 位(每个样本 8 位)的深度和单个音频通道。这些设置可最大限度地降低所需的数据存储量。要获取更高质量的录音,可增加采样率或位深度。

例如,典型的光盘使用 44,100 赫兹的采样率和 16 位的深度。创建一个 audiorecorder 对象,以采用这些设置进行立体声(两个通道)录制:

myRecObj = audiorecorder(44100, 16, 2);

有关可用的属性和值的详细信息,请参阅 audiorecorder 参考页。

播放音频

在导入或录制音频后,MATLAB 支持以多种方式收听数据:

  • 对于使用单个函数调用的简单播放,可使用 soundsoundsc。例如,加载一个包含信号和采样率数据的样本 MAT 文件并收听音频:

    load chirp.mat;
    sound(y, Fs);
  • 要在播放过程中获得更大的灵活性,包括暂停、恢复或定义回调的功能,可使用 audioplayer 函数。创建一个 audioplayer 对象,然后调用播放音频的方法。例如,收听 gong 样本文件:

    load gong.mat;
    gong = audioplayer(y, Fs);
    play(gong);

    有关其他示例,请参阅在函数内录制或播放音频

如果未指定采样率,则 sound 将以 8192 赫兹播放。对于任何播放,指定的采样率越小,则播放的速度越慢;采样率越大,则播放的速度越快。

注意

大多数声卡支持约 5,000 至 48,000 赫兹的采样率。指定此范围之外的采样率可能会产生意外结果。

在函数内录制或播放音频

如果在函数内部创建 audioplayeraudiorecorder 对象,则该对象仅在函数的持续时间内存在。例如,创建一个名为 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 个样本),播放文件中的 73113 个样本大约需要 8.9 秒。但是,playFile 函数通常会在播放完成前结束,并清除 audioplayer 对象 obj

要确保完整的播放或录制,可考虑以下选项:

  • 使用 playblockingrecordblocking 而不是 playrecord。排他方法会一直保留控制权,直至播放或录制完成。如果对控制权实施排他,则无法在播放或录制过程发出任何其他命令或方法(例如 pauseresume)。

  • 为在基础工作区中生成对象的函数创建一个输出参数。例如,修改 playFile 函数以包括输出参数:

    function obj = playFile(myfile)

    调用函数:

    h = playFile('handel.mat');

    因为 h 存在于基础工作区中,所以可以从命令提示符暂停播放:

    pause(h)

另请参阅

| | |

相关主题