audioDeviceWriter
播放到声卡
描述
的audioDeviceWriter
系统对象™将音频样本写入音频输出设备。音频设备写入器的属性指定驱动程序、设备和设备属性,如采样率、位深和缓冲区大小。
看到音频I/O:缓冲,延迟和吞吐量详细说明了音频写入器的数据流。
将数据传输到音频设备:
创建
audioDeviceWriter
对象并设置其属性。使用参数调用对象,就像调用函数一样。
有关系统对象如何工作的详细信息,请参见什么是系统对象?
创建
语法
描述
返回一个System对象,deviceWriter
= audioDeviceWriterdeviceWriter
它可以实时地将音频样本写入音频输出设备。
设置SampleRate财产deviceWriter
= audioDeviceWriter (sampleRateValue
)sampleRateValue
.
设置每个属性deviceWriter
= audioDeviceWriter (___,名称,值
)的名字
到指定的价值
.未指定的属性有默认值。
例子:deviceWriter = audioDeviceWriter(48000,'BitDepth','8-bit integer')
创建一个System对象,deviceWriter
,它以48 kHz采样率和8位整数位深度工作。
属性
除非另有说明,属性为nontunable,这意味着在调用对象后不能更改它们的值。对象在调用时锁定,而释放
功能解锁它们。
如果属性为可调,您可以随时更改其值。
有关更改属性值的详细信息,请参见使用系统对象的MATLAB系统设计.
司机
- - - - - -用于访问音频设备的驱动程序(仅限Windows)
声音处理软件的
(默认)|“ASIO”
|“WASAPI”
用于访问音频设备的驱动程序,指定为声音处理软件的
,“ASIO”
,或“WASAPI”
.
ASIO™驱动程序没有预先安装在Windows上®机器。使用
“ASIO”
驱动选项,在MATLAB外部安装ASIO驱动程序®.请注意
如果
司机
指定为“ASIO”
,使用asiosettings
将声卡缓冲区大小设置为您的audioDeviceWriter
系统对象。WASAPI驱动程序只支持独占模式。万博1manbetx
ASIO和WASAPI驱动程序不提供采样率转换。ASIO和WASAPI驱动,设置SampleRate
到音频设备支持的采样率。万博1manbetx
此属性仅适用于Windows计算机。Linux®机器总是使用ALSA驱动程序。Mac机器总是使用CoreAudio驱动程序。
要指定非默认值司机
值,您必须有音频工具箱™许可证。如果工具箱未安装,则指定非默认司机
Values返回一个错误。
数据类型:字符
|字符串
设备
- - - - - -用于播放音频样本的设备
默认音频设备(默认)|特征向量|字符串标量
用于播放音频样本的设备,指定为字符向量或字符串标量。使用getAudioDevices
列出所选驱动程序的可用设备。
数据类型:字符
|字符串
SampleRate
- - - - - -发送到音频设备的信号采样率(Hz)
44100
(默认)|正整数
发送到音频设备的信号采样率,单位为Hz,指定为正整数。的范围SampleRate
这取决于你的音频硬件。
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
BitDepth
- - - - - -设备使用的数据类型
的16位整数
(默认)|8位整数的
|24位整数的
|32位浮点数的
设备使用的数据类型,指定为字符向量或字符串标量。在执行数字到模拟转换之前,输入数据将转换为指定的数据类型BitDepth
.
指定一个非默认值BitDepth
,您必须有音频工具箱许可证。如果工具箱未安装,则指定非默认值BitDepth
返回一个错误。
数据类型:字符
|字符串
万博1manbetxSupportVariableSizeInput
- - - - - -万博1manbetx支持可变边框尺寸
假
(默认)|真正的
选项支持可变帧大小,万博1manbetx指定为真正的
或假
.
假
——如果audioDeviceWriter
对象被锁定时,每次调用时输入必须具有相同的帧大小。音频设备的缓冲区大小与输入帧大小相同。真正的
——如果audioDeviceWriter
对象锁定时,输入帧大小可以在每次调用时改变。属性指定音频设备的缓冲区大小BufferSize财产。
数据类型:字符
BufferSize
- - - - - -音频设备的缓冲区大小
4096
(默认)|正整数
音频设备的缓冲区大小,指定为正整数。
请注意
如果司机
指定为“ASIO”
,打开ASIO UI设置声卡缓冲区大小为BufferSize
你的价值audioDeviceWriter
系统对象。
依赖关系
若要启用此属性,请设置万博1manbetxSupportVariableSizeInput来真正的
.
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
ChannelMappingSource
- - - - - -输入矩阵和设备通道之间的映射源
“汽车”
(默认)|“属性”
输入矩阵的列与音频输出设备的通道之间的映射源,指定为“汽车”
或“属性”
.
“汽车”
——默认设置决定输入矩阵列与音频输出设备声道的对应关系。例如,假设您的输入是一个有四列的矩阵,并且您的音频设备有四个可用通道。输入数据的第1列写入设备的通道1,输入数据的第2列写入设备的通道2,依此类推。“属性”
——这是ChannelMapping属性确定输入矩阵的列与音频输出设备的通道之间的映射关系。
数据类型:字符
|字符串
ChannelMapping
- - - - - -输入矩阵和设备通道之间的非默认映射
(1: MaximumOutputChannels)
(默认)|标量|向量
输入矩阵的列与输出设备的通道之间的非默认映射,指定为有效通道索引的标量或向量。看到为audioDeviceWriter指定通道映射示例获取更多信息。
若要有选择地在输入矩阵的列和声卡的输出通道之间进行映射,必须具有Audio Toolbox许可证。如果工具箱未安装,则指定非默认值ChannelMapping
返回一个错误。
请注意
若要确保只在立体声设备的一个通道上输出单声道,请使用默认值ChannelMapping
设置并提供一个立体声信号,其中一个通道是全零。
例子:outputLeftOnly = [x(:,1) 0 (size(x,1),1)];
例子:outputRightOnly = [0 (size(x,1),1) x(:,1)];
依赖关系
若要启用此属性,请设置ChannelMappingSource来“属性”
.
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
使用
描述
写一帧音频样本,numUnderrun
= deviceWriter (audioToDevice
)audioToDevice
,到所选音频设备,并返回自上次调用以来未执行的音频样本数量deviceWriter
.
注意:当你打电话给audioDeviceWriter
对象指定的音频设备设备
财产已被锁定。一个音频设备只能被一个人锁定audioDeviceWriter
一次。要释放音频设备,请呼叫释放
在你的audioDeviceWriter
系统对象。
输入参数
audioToDevice
- - - - - -音频到设备
矩阵
要写入设备的音频信号,指定为矩阵。矩阵的列被视为独立的音频通道。
如果audioToDevice
为数据类型“双”
或“单一”
,音频设备写入器剪辑范围[- 1,1]之外的值。对于其他数据类型,允许输入的范围为指定数据类型的[min, max]。
数据类型:单
|双
|int16
|int32
|uint8
输出参数
numUnderrun
-未完成样品数量
标量
自最后一次调用以来音频设备写入器队列未运行的样本数deviceWriter
.
数据类型:uint32
对象的功能
要使用对象函数,请将System对象指定为第一个输入参数。例如,释放system对象的系统资源obj
,使用这种语法:
发行版(obj)
例子
从文件中读取并写入音频设备
读取MP3音频文件,并通过默认音频输出设备播放它。
创建一个dsp。AudioFileReader
对象使用默认设置。使用audioinfo
函数返回包含音频文件信息的结构。
fileReader = dsp。AudioFileReader (“speech_dft.mp3”);fileInfo = audioinfo(“speech_dft.mp3”)
fileInfo =带字段的结构:文件名:'/mathworks/devel/bat/Bdoc22b/build/matlab/toolbox/dsp/samples/speech_dft.mp3' CompressionMethod: 'MP3' NumChannels: 1 SampleRate: 22050 TotalSamples: 112320 Duration: 5.0939标题:[]评论:[]艺术家:[]BitRate: 64
创建一个audioDeviceWriter
对象并指定采样率。
deviceWriter = audioDeviceWriter(“SampleRate”, fileInfo.SampleRate);
调用设置
减少音频流循环中初始化的计算负荷。
设置(deviceWriter 0 (fileReader。SamplesPerFrame,...fileInfo.NumChannels))
使用信息
函数获取设备写入器的特征信息。
信息(deviceWriter)
ans =带字段的结构:驱动:'ALSA' DeviceName: 'ALSAdefault' MaximumOutputChannels: 32
在音频流循环中,从文件中读取音频信号帧,并将帧写入设备。
而~isDone(fileReader) audioData = fileReader();deviceWriter (audioData);结束
关闭输入文件并释放设备。
发布(fileReader)发布(deviceWriter)
减少由于输出设备缓冲区造成的延迟
延迟由于输出设备缓冲区是写入一帧数据的时间延迟。的默认属性audioDeviceWriter
系统对象™以减少由于设备缓冲区大小造成的延迟。
创建一个dsp。AudioFileReader
对象以读取具有默认设置的音频文件。
fileReader = dsp。AudioFileReader (“speech_dft.mp3”);
创建一个audioDeviceWriter
对象,并指定采样率以匹配音频文件阅读器的采样率。
deviceWriter = audioDeviceWriter(...“SampleRate”, fileReader.SampleRate);
计算由于设备缓冲区造成的延迟(以秒为单位)。
bufferLatency = fileReader.SamplesPerFrame/deviceWriter.SampleRate% #好吧
bufferLatency = 0.0464
设置SamplesPerFrame
您的财产dsp。AudioFileReader
系统对象为256。以秒为单位计算缓冲区延迟。
fileReader。SamplesPerFrame = 256;bufferLatency = fileReader.SamplesPerFrame/deviceWriter.SampleRate
bufferLatency = 0.0116
确定并减少欠压
暗流指输出信号沉默,当音频流循环不与输出设备同步时发生。确定音频流循环的底层,向音频流循环添加人工计算负载,然后修改您的属性audioDeviceWriter
目标减少欠压。你的成绩取决于你的电脑。
创建一个dsp。AudioFileReader
对象,并指定要读取的文件。使用audioinfo
函数返回包含音频文件信息的结构。
fileReader = dsp。AudioFileReader (“speech_dft.mp3”);fileInfo = audioinfo(“speech_dft.mp3”);
创建一个audioDeviceWriter
对象。使用SampleRate
文件读取器的SampleRate
设备写入器的。调用设置
减少音频流循环中初始化的计算负荷。
deviceWriter = audioDeviceWriter(“SampleRate”, fileReader.SampleRate);设置(deviceWriter 0 (fileReader。SamplesPerFrame,...fileInfo.NumChannels))
运行音频流循环,输入从文件和输出到设备。打印总样品下运行和下运行在秒。
totalUnderrun = 0;而~isDone(fileReader) input = fileReader();numUnderrun = deviceWriter(input);totalUnderrun = totalUnderrun + numUnderrun;结束流('总样品不足:%d.\n'totalUnderrun)
总样本不足:0。
流('总不足秒数:%d.\n'双(totalUnderrun) /双(deviceWriter.SampleRate))
总不足秒数:0。
释放你的dsp。AudioFileReader
而且audioDeviceWriter
对象,并将计数器变量设置为零。
release(fileReader) release(deviceWriter) totalUnderrun = 0;
使用暂停
模拟一个需要0.075秒处理的算法。暂停会导致音频流循环的速度比设备慢,从而导致输出音频信号出现静默期。
而~isDone(fileReader) input = fileReader();numUnderrun = deviceWriter(input);totalUnderrun = totalUnderrun + numUnderrun;暂停(0.075)结束流('总样品不足:%d.\n'totalUnderrun)
总样品不足:68608。
流('总不足秒数:%d.\n'双(totalUnderrun) /双(deviceWriter.SampleRate))
总不足秒数:3.111474e+00。
释放你的audioDeviceReader
而且dsp。AudioFileWriter
并将counter变量设置为零。
release(fileReader) release(deviceWriter) totalUnderrun = 0;
将音频流循环的帧大小设置为2048。因为万博1manbetxSupportVariableSizeInput
您的财产audioDeviceWriter
系统对象设置为假
,音频设备的缓冲区大小与输入帧大小相同。增加设备缓冲区大小可以减少欠压。
fileReader = dsp。AudioFileReader (“speech_dft.mp3”);fileReader。SamplesPerFrame = 2048;fileInfo = audioinfo(“speech_dft.mp3”);deviceWriter = audioDeviceWriter(“SampleRate”, fileReader.SampleRate);设置(deviceWriter 0 (fileReader.SamplesPerFrame fileInfo.NumChannels))
计算总欠压。
而~isDone(fileReader) input = fileReader();numUnderrun = deviceWriter(input);totalUnderrun = totalUnderrun + numUnderrun;暂停(0.075)结束流('总样品不足:%d.\n'totalUnderrun)
总样本不足:0。
流('总不足秒数:%d.\n'双(totalUnderrun) /双(deviceWriter.SampleRate))
总不足秒数:0。
增加的帧大小减少了音频流循环的总底面。然而,增加帧大小也会增加延迟。减少经费不足的其他方法包括:
增加与输入帧大小无关的缓冲区大小。要独立于输入帧大小增加缓冲区大小,必须先设置
万博1manbetxSupportVariableSizeInput
来真正的
.这种方法也增加了延迟。降低抽样率。降低采样率以降低信号分辨率为代价降低了延迟和欠压。
为您的系统选择最佳的驱动程序和设备。
指定通道映射audioDeviceWriter
对象的非默认通道映射audioDeviceWriter
对象。这个例子是特定于硬件的。它假设您的计算机有一个默认的音频输出设备,有两个可用的频道。
创建一个audioDeviceWriter
对象使用默认设置。
deviceWriter = audioDeviceWriter;
默认情况下,audioDeviceWriter
对象写入可用通道的最大数量,对应于输入矩阵的列。使用信息
获取设备的最大通道数。
信息(deviceWriter)
ans =带字段的结构:驱动:'DirectSound' DeviceName: 'Primary Sound Driver' MaximumOutputChannels: 2
如果deviceWriter
用一列数据调用时,两个声道被写入音频输出设备。两个通道都对应于一列数据。
使用audioOscillator
对象将音调输出到audioDeviceWriter
对象。你的对象,sineGenerator
,当调用时返回一个向量。
sininegenerator = audioooscillator;
将正弦音写入音频设备。如果您使用耳机,可以同时听到两个频道的声音。
计数= 0;而count < 500 sin = sininegenerator ();deviceWriter (sin);Count = Count + 1;结束
如果你的audioDeviceWriter
对象调用时带有两列数据,两个通道被写入音频输出设备。第一列对应音频输出设备的通道1,第二列对应音频输出设备的通道2。
写一个两列矩阵到你的音频输出设备。第1列对应正弦音,第2列对应静态信号。如果你使用耳机,你可以听到一个扬声器的音调和另一个扬声器的静电声。
计数= 0;而count < 500 sin = sininegenerator ();静态= randn(长度(正弦),1);deviceWriter ((sin,静态));Count = Count + 1;结束
通过在与输入列对应的索引处指示输出通道号,指定设备通道与输出矩阵列之间的可选映射。集ChannelMappingSource
来“属性”
.指示输入数据的第一列写入输出设备的通道2,输入数据的第二列写入输出设备的通道1。若要修改通道映射,必须先解锁audioDeviceReader
对象。
(deviceWriter) deviceWriter发布。ChannelMappingSource =“属性”;deviceWriter。ChannelMapping = [2,1];
使用反向映射播放音频信号。如果你正在使用耳机,请注意音调和静电已经切换扬声器。
计数= 0;而count < 500 sin = sininegenerator ();静态= randn(长度(正弦),1);deviceWriter ((sin,静态));Count = Count + 1;结束
扩展功能
C/ c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
系统对象在MATLAB代码生成(MATLAB编码器)
此System对象生成的可执行文件依赖于预构建的动态库文件(
. dll
文件)包含MATLAB。使用packNGo
函数将此对象生成的代码和所有相关文件打包到压缩的zip文件中。使用这个zip文件,您可以在另一个没有安装MATLAB的开发环境中重新定位、解包和重新构建项目。详情请参见在MATLAB和Simulink之外运行音频I/O特性万博1manbetx.
版本历史
在R2016a中引入
Matlabコマンド
次のmatlabコマンドに対応するリンクがクリックされました。
コマンドをmatlabコマンドウィンドウに入力して実行してください。Webブラウザ,はMATLABコマンドをサポ,トしていません。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。