AudioFormat 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
类 AudioFormat
用于访问许多音频格式和通道配置常量。
[Android.Runtime.Register("android/media/AudioFormat", DoNotGenerateAcw=true)]
public class AudioFormat : Java.Lang.Object, Android.OS.IParcelable, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("android/media/AudioFormat", DoNotGenerateAcw=true)>]
type AudioFormat = class
inherit Object
interface IParcelable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 继承
- 属性
- 实现
注解
类 AudioFormat
用于访问许多音频格式和通道配置常量。 例如,它们用于 AudioTrack
和 AudioRecord
中,作为构造函数(如 AudioTrack#AudioTrack(int, int, int, int, int, int)
)的各个参数中的有效值,其中第四个参数是常量之 AudioFormat.ENCODING_*
一。 常 AudioFormat
量还用于 MediaFormat
指定媒体中常用的音频相关值,例如 的 MediaFormat#KEY_CHANNEL_MASK
。
类 AudioFormat.Builder
可用于创建格式类的 AudioFormat
实例。 AudioFormat.Builder
有关配置和生成此类实例的机制的文档,请参阅 。 下面我们介绍类允许在每个实例中传达main概念AudioFormat
,它们是:<ol<>li>采样率<li>编码<li>通道 masks</ol>
与 AudioFormat
密切相关的是音频帧的概念,它在整个文档中用于表示音频数据的最小大小完整单位。
<h4 id=“sampleRate”>采样率</h4>
以 Hz 表示,实例中的 AudioFormat
采样率表示正在播放或录制的内容中每秒每个声道的音频样本数。 它不是呈现或生成内容的采样率。 例如,媒体采样率为 8000Hz 的声音可以在采样率为 48000Hz 的设备上播放;采样率转换由平台自动处理,不会以 6x 的速度播放。
从 API android.os.Build.VERSION_CODES#M
开始,和 AudioTrack
支持AudioRecord
高达 192kHz 的采样率,并根据需要执行采样率转换。 为了提高效率并避免有损转换,建议将 和 AudioTrack
的采样率AudioRecord
与终结点设备采样率相匹配,并将采样率限制为不超过 48kHz,除非有需要更高速率的特殊设备功能。
<h4 id=“encoding”>Encoding</h4>
音频编码用于描述音频数据的位表示形式,可以是线性 PCM 或压缩音频,例如 AC3 或 DTS。
对于线性 PCM,音频编码描述样本大小、8 位、16 位或 32 位,以及样本表示形式(整数或浮点数)。 <ul><li>#ENCODING_PCM_8BIT
:音频样本是范围 [0, 255] 中的 8 位无符号整数,偏移量为 128,表示零。 这通常作为 Java 字节存储在字节数组或 ByteBuffer 中。 由于 Java 字节是 <em>signed</em>,因此请注意数学运算和转换,因为最重要的位是反转的。 </li><li>#ENCODING_PCM_16BIT
:音频示例是一个 16 位带符号整数,通常存储为短数组中的 Java short,但当 short 存储在 ByteBuffer 中时,与默认的 Java big endian) 相比,它是本机 endian (。 空头具有 [-32768, 32767] 的完整范围,有时被解释为定点 Q.15 数据。 </li><li>#ENCODING_PCM_FLOAT
:在 API android.os.Build.VERSION_CODES#LOLLIPOP
中引入,此编码指定音频样本为 32 位 IEEE 单精度浮点数。 该示例可以作为 float 数组中的 Java float 操作,但在 ByteBuffer 中,它以本机 endian 字节顺序存储。 音频数据的名义范围为 ENCODING_PCM_FLOAT
[-1.0, 1.0]。 它的实现取决于间隔中是否包含 1.0 的正最大值。 在发送到终结点设备之前,将固定超出标称范围的值。 请注意,NaN 的处理未定义;亚正常值可被视为零;和 infinities 通常与 &ndash 的其他值 AudioTrack
一样被固定;尽量避免无限,因为它们可以轻松生成 NaN。 <若要> 实现比带符号 16 位整数短的音频位深度更高的音频位深度,建议使用 ENCODING_PCM_FLOAT
进行音频捕获、处理和播放。 浮点数由新式 CPU 有效操作,其精度高于 24 位有符号整数,并且具有比 32 位有符号整数更大的动态范围。 AudioRecord
从 API android.os.Build.VERSION_CODES#M
起, AudioTrack
到 API android.os.Build.VERSION_CODES#LOLLIPOP
支持 ENCODING_PCM_FLOAT
。 </li><li>#ENCODING_PCM_24BIT_PACKED
:在 API android.os.Build.VERSION_CODES#S
中引入的此编码指定音频样本是一个扩展精度 24 位带符号整数,存储在 本机 endian 中的 或字节数组中的 ByteBuffer
3 个 Java 字节, (请参阅 java.nio.ByteOrder#nativeOrder()
) 。 每个样本都具有 [-8388608, 8388607] 的完整范围,可以解释为定点 Q.23 数据。 </li><li>#ENCODING_PCM_32BIT
:在 API android.os.Build.VERSION_CODES#S
中引入的此编码指定音频样本是一个扩展精度 32 位带符号整数,存储在 本机 endian 中的 或字节数组中的 ByteBuffer
4 个 Java 字节, (请参阅 java.nio.ByteOrder#nativeOrder()
) 。 每个样本都具有 [-2147483648, 2147483647] 的完整范围,可以解释为定点 Q.31 数据。 </li></ul>
对于压缩音频,编码指定压缩方法,例如 #ENCODING_AC3
和 #ENCODING_DTS
。 压缩的音频数据通常以字节的形式存储在字节数组或 ByteBuffer 中。 当为 AudioTrack
指定压缩音频编码时,它会创建一个直接 (非混合) 跟踪,以便输出到能够解码压缩音频的终结点 (,例如 HDMI) 。 对于 (大多数) 无法解码此类压缩音频的其他终结点,需要先解码数据,通常通过创建 MediaCodec
。 或者,可以使用 MediaPlayer
播放压缩的音频文件或流。
当压缩的音频通过直接 AudioTrack
发送时,它不需要以音频访问单元的确切倍数写入;这与 MediaCodec
输入缓冲区不同。
<h4 id=“channelMask”>Channel mask</h4>
和 中使用AudioTrack
AudioRecord
通道掩码来描述音频帧中的样本及其排列方式。 它们还用于终结点 (例如 USB 音频接口、连接到耳机的 DAC) 指定特定设备的允许配置。 <自>API android.os.Build.VERSION_CODES#M
起,有两种类型的通道掩码:通道位置掩码和通道索引掩码。
<h5 id=“channelPositionMask”>通道位置掩码</h5> 通道位置掩码是原始 Android 通道掩码,自 API android.os.Build.VERSION_CODES#BASE
起使用。 对于输入和输出,它们意味着位置性质 - 用于录制或播放的扬声器或麦克风的位置。 <br>对于通道位置掩码,每个允许的通道位置对应于通道掩码中的一个位。 如果音频帧中存在该声道位置,则设置该位,否则为零。 从 lsb 到 msb) (位的顺序对应于音频帧中该位置样本的顺序。 <br>按通道计数分类的规范通道位置掩码如下所示:<br><表<>tr><td>通道计数</td><td>通道位置掩码</td></tr><td><>1</td td#CHANNEL_OUT_MONO
<><>/td></tr<>td>><2</td><td><#CHANNEL_OUT_STEREO
/td></tr><><td>3</td><td#CHANNEL_OUT_FRONT_CENTER
>#CHANNEL_OUT_STEREO
| </td></tr<>><td 4></td><td>#CHANNEL_OUT_QUAD
</td></tr>><<td>5</td><td#CHANNEL_OUT_QUAD
><#CHANNEL_OUT_FRONT_CENTER
| /td></tr<>td><>6</td><td<>#CHANNEL_OUT_5POINT1
/td></tr>><<td>7</td><td#CHANNEL_OUT_BACK_CENTER
< | >#CHANNEL_OUT_5POINT1
/td></tr><<>td>8</td><td>#CHANNEL_OUT_7POINT1_SURROUND
</td></tr<>/table><br>这些掩码是的 ORed 复合单个通道掩码。 例如#CHANNEL_OUT_STEREO
, 由 和 #CHANNEL_OUT_FRONT_RIGHT
组成#CHANNEL_OUT_FRONT_LEFT
。
下图显示了输出通道的布局,从上方看出,侦听器 (位于中心“lis”位置,面向前中心通道) 。
TFL ----- TFC ----- TFR T is Top
| \ | / |
| FL --- FC --- FR | F is Front
| |\ | /| |
| | BFL-BFC-BFR | | BF is Bottom Front
| | | |
| FWL lis FWR | W is Wide
| | | |
TSL SL TC SR TSR S is Side
| | | |
| BL --- BC -- BR | B is Back
| / \ |
TBL ----- TBC ----- TBR C is Center, L/R is Left/Right
所有“T” (顶部) 声道位于侦听器上方,所有“BF” (底部前) 声道位于侦听器下方,其他所有通道都在侦听器的水平平面中。 结合使用时,LFE1 和 LFE2 位于侦听器下方,单独使用时,LFE 平面未定义。 有关缩写,请参阅通道定义
<h5 id=“channelIndexMask”>通道索引掩码</h5> 通道索引掩码在 API android.os.Build.VERSION_CODES#M
中引入。 它们允许按数字(即第一个通道、第二个通道等)从源或接收器终结点选择特定通道。 这可以避免人为地将位置分配给终结点的通道,或确定 i sup></sup> 位置位在终结点的通道位置掩码中的位置<等问题。 <br>下面是通道索引掩码解决这种混淆问题的示例:处理 4 通道 USB 设备。 使用位置掩码,根据通道计数,这将是一个 #CHANNEL_OUT_QUAD
设备,但实际上只对通道 0 到通道 3 感兴趣。 然后,USB 设备将具有以下单独的位通道掩码:#CHANNEL_OUT_FRONT_LEFT
、 #CHANNEL_OUT_FRONT_RIGHT
#CHANNEL_OUT_BACK_LEFT
和 #CHANNEL_OUT_BACK_RIGHT
。 但是哪个是通道 0,哪个是通道 3? <br>对于通道索引掩码,每个通道编号表示为掩码中的一个位,从 lsb (通道 0) 向上到 msb,从数字上看,此位值为 1 << channelNumber
。 设置位指示音频帧中存在通道,否则将被清除。 位的顺序也对应于该声道号在音频帧中的采样顺序。 <br>对于前面的 4 通道 USB 设备示例,该设备将具有通道索引掩码 0xF
。 假设我们只想选择第一个和第三个通道;这将对应于通道索引掩码 0x5
() 设置的第一位和第三位。 如果 使用此通道索引掩码,则音频帧将包含两个样本,每个帧的第一个 AudioTrack
样本路由到通道 0,以及路由到通道 2 的每个帧的第二个样本。 按通道计数提供的规范通道索引掩码由公式 (1 << channelCount) - 1
提供。
<h5>将用例</h5<>ul<>li>通道位置掩码用于终结点:CHANNEL_OUT_FRONT_LEFT
、CHANNEL_OUT_FRONT_CENTER
等,用于 HDMI 家庭影院目的。 <音频流的 li>通道位置掩码: 创建 AudioTrack
以输出电影内容,其中将写入 5.1 多声道输出。 <终结点的 li>通道索引掩码: 输入和输出不对应于左侧或右侧扬声器或麦克风的 USB 设备。 <音频流的 li>通道索引掩码: 可能 AudioRecord
只希望终结点的第三个和第四个音频通道 (即第二个声道对) ,而不关心它所对应的位置,在这种情况下,通道索引掩码为 0xC
。 多通道 AudioRecord
会话应使用通道索引掩码。 </ul><h4 id=“audioFrame”>Audio Frame</h4>
对于线性 PCM,音频帧由同时捕获的一组样本组成,其计数和声道关联由通道掩码提供,其样本内容由编码指定。 例如,立体声 16 位 PCM 帧由两个 16 位线性 PCM 样本组成,帧大小为 4 个字节。 对于压缩的音频, 音频帧可以交替引用压缩数据字节的访问单位,该访问单元在逻辑上组合在一起用于解码和位流访问 (MediaCodec
例如) ,或单个字节的压缩数据 ((例如 AudioTrack#getBufferSizeInFrames() AudioTrack.getBufferSizeInFrames()
) ),或者根据使用音频帧的上下文对压缩的数据 ((例如AudioTrack#getPlaybackHeadPosition() AudioTrack.getPlaybackHeadPosition()
) )进行解码而生成的线性 PCM 帧。 AudioFormat#getFrameSizeInBytes()
对于 ,压缩的数据格式返回 1 字节的帧大小。
的 android.media.AudioFormat
Java 文档。
此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。
构造函数
AudioFormat() | |
AudioFormat(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
字段
ChannelInvalid |
音频通道掩码无效 |
ChannelOut5point1point2 |
已过时.
5 的输出通道掩码。 |
ChannelOut5point1point4 |
已过时.
5 的输出通道掩码。 |
ChannelOut6point1 |
已过时.
6 的输出通道掩码。 |
ChannelOut7point1 |
此成员已弃用。 |
ChannelOut7point1point2 |
已过时.
7 的输出通道掩码。 |
ChannelOut7point1point4 |
已过时.
7 的输出通道掩码。 |
ChannelOut9point1point4 |
已过时.
9 的输出通道掩码。 |
ChannelOut9point1point6 |
已过时.
9 的输出通道掩码。 |
ChannelOutBottomFrontCenter |
已过时.
底部前端中心输出通道 (请参阅 FC) 下面的通道图中的 BFC |
ChannelOutBottomFrontLeft |
已过时.
左下前部输出通道 (请参阅 FL) 下面的通道图中的 BFL |
ChannelOutBottomFrontRight |
已过时.
右下角输出通道 (请参阅 FR) 下方通道图中的 BFR |
ChannelOutFrontWideLeft |
已过时.
左前宽输出通道 (请参阅通道图) 中的 FWL |
ChannelOutFrontWideRight |
已过时.
前宽右输出通道 (请参阅通道图) 中的 FWR |
ChannelOutLowFrequency2 |
已过时.
第二个 LFE 通道与 |
ChannelOutTopBackCenter |
已过时.
顶部后背输出通道 (请参阅 BC) 上方通道图中的 TBC |
ChannelOutTopBackLeft |
已过时.
左上靠左输出通道 (见 BL) 上方通道图中的 TBL |
ChannelOutTopBackRight |
已过时.
上后右输出通道 (请参阅 BR) 上方通道图中的 TBR |
ChannelOutTopCenter |
已过时.
在通道图) 中查看 TC,) 输出通道 (侦听器上方的顶部中心 ( |
ChannelOutTopFrontCenter |
已过时.
顶部前中心输出通道 (请参阅 FC) 上方的通道图中的 TFC |
ChannelOutTopFrontLeft |
已过时.
左上方输出通道 (请参阅 FL) 上方通道图中的 TFL |
ChannelOutTopFrontRight |
已过时.
右上方输出通道 (请参阅 FR) 上方通道图中的 TFR |
ChannelOutTopSideLeft |
已过时.
顶部左侧输出通道 (请参阅 SL) 上方通道图中的 TSL |
ChannelOutTopSideRight |
已过时.
右侧输出通道 (请参阅 SR) 上方通道图中的 TSR |
EncodingDra |
已过时.
音频数据格式:DRA 压缩 |
EncodingDsd |
已过时.
音频数据格式:直接流数字 |
EncodingDtsHdMa |
已过时.
音频数据格式:DTS HD 主音频压缩的 DTS HD 主音频流是可变比特率,包含无损音频。 |
EncodingDtsUhd |
音频数据格式:DTS UHD Profile-1 压缩 (又名 DTS:X Profile 1) 具有与 ENCODING_DTS_UHD_P1 相同的含义和值。 |
EncodingDtsUhdP1 |
已过时.
音频数据格式:DTS UHD Profile-1 压缩 (又名 DTS:X Profile 1) 具有与已 |
EncodingDtsUhdP2 |
已过时.
音频数据格式:DTS UHD Profile-2 压缩 DTS-UHD Profile-2 支持交付 Channel-Based 音频、Object-Based 音频和高阶 Ambisonic 演示文稿,最多支持第四个顺序。 |
EncodingMpeghBlL3 |
已过时.
音频数据格式:MPEG-H 基线配置文件,级别 3 |
EncodingMpeghBlL4 |
已过时.
音频数据格式:MPEG-H 基线配置文件,级别 4 |
EncodingMpeghLcL3 |
已过时.
音频数据格式:MPEG-H 低复杂性配置文件,级别 3 |
EncodingMpeghLcL4 |
已过时.
音频数据格式:MPEG-H 低复杂性配置文件,级别 4 |
EncodingOpus |
已过时.
音频数据格式:OPUS 压缩。 |
EncodingPcm24bitPacked |
已过时.
音频数据格式:每个样本 PCM 24 位,打包为 3 个字节。 |
EncodingPcm32bit |
已过时.
音频数据格式:每个样本 PCM 32 位。 |
SampleRateUnspecified |
采样率将是与路由相关的值。 |
属性
ChannelCount |
返回通道计数。 |
ChannelIndexMask |
返回通道索引掩码。 |
ChannelMask |
返回通道掩码。 |
Class |
返回此 |
Creator |
类 |
Encoding |
返回编码。 |
FrameSizeInBytes |
返回帧大小(以字节为单位)。 |
Handle |
基础 Android 实例的句柄。 (继承自 Object) |
JniIdentityHashCode |
类 |
JniPeerMembers |
类 |
PeerReference |
类 |
SampleRate |
返回采样率。 |
ThresholdClass |
此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。 |
ThresholdType |
此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。 |
方法
Clone() |
创建并返回此对象的副本。 (继承自 Object) |
DescribeContents() |
类 |
Dispose() |
类 |
Dispose(Boolean) |
类 |
Equals(Object) |
指示某个其他对象是否“等于”此对象。 (继承自 Object) |
GetHashCode() |
返回对象的哈希代码值。 (继承自 Object) |
JavaFinalize() |
当垃圾回收确定不再引用对象时,由垃圾回收器对对象调用。 (继承自 Object) |
Notify() |
唤醒正在等待此对象的监视器的单个线程。 (继承自 Object) |
NotifyAll() |
唤醒正在等待此对象的监视器的所有线程。 (继承自 Object) |
SetHandle(IntPtr, JniHandleOwnership) |
设置 Handle 属性。 (继承自 Object) |
ToArray<T>() |
类 |
ToString() |
返回对象的字符串表示形式。 (继承自 Object) |
UnregisterFromRuntime() |
类 |
Wait() |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>。<> (继承自 Object) |
Wait(Int64) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
Wait(Int64, Int32) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
WriteToParcel(Parcel, ParcelableWriteFlags) |
类 |
显式接口实现
IJavaPeerable.Disposed() |
类 |
IJavaPeerable.DisposeUnlessReferenced() |
类 |
IJavaPeerable.Finalized() |
类 |
IJavaPeerable.JniManagedPeerState |
类 |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
类 |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
类 |
IJavaPeerable.SetPeerReference(JniObjectReference) |
类 |
扩展方法
JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
JavaCast<TResult>(IJavaObject) |
类 |
GetJniTypeName(IJavaPeerable) |
类 |