AudioFormat 类

定义

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
属性
实现

注解

AudioFormat 用于访问许多音频格式和通道配置常量。 例如,它们用于 AudioTrackAudioRecord中,作为构造函数(如 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>

和 中使用AudioTrackAudioRecord通道掩码来描述音频帧中的样本及其排列方式。 它们还用于终结点 (例如 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_LEFTCHANNEL_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.AudioFormatJava 文档。

此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。

构造函数

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 通道与 #CHANNEL_OUT_LOW_FREQUENCY结合使用时,旨在包含正确的低频效果信号,在ITU-R BS中也称为“LFE2”。

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) 具有与已 #ENCODING_DTS_UHD弃用 的 相同的含义和值。

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

返回此 Object的运行时类。

(继承自 Object)
Creator

AudioFormat 用于访问许多音频格式和通道配置常量。

Encoding

返回编码。

FrameSizeInBytes

返回帧大小(以字节为单位)。

Handle

基础 Android 实例的句柄。

(继承自 Object)
JniIdentityHashCode

AudioFormat 用于访问许多音频格式和通道配置常量。

(继承自 Object)
JniPeerMembers

AudioFormat 用于访问许多音频格式和通道配置常量。

PeerReference

AudioFormat 用于访问许多音频格式和通道配置常量。

(继承自 Object)
SampleRate

返回采样率。

ThresholdClass

此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。

ThresholdType

此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。

方法

Clone()

创建并返回此对象的副本。

(继承自 Object)
DescribeContents()

AudioFormat 用于访问许多音频格式和通道配置常量。

Dispose()

AudioFormat 用于访问许多音频格式和通道配置常量。

(继承自 Object)
Dispose(Boolean)

AudioFormat 用于访问许多音频格式和通道配置常量。

(继承自 Object)
Equals(Object)

指示某个其他对象是否“等于”此对象。

(继承自 Object)
GetHashCode()

返回对象的哈希代码值。

(继承自 Object)
JavaFinalize()

当垃圾回收确定不再引用对象时,由垃圾回收器对对象调用。

(继承自 Object)
Notify()

唤醒正在等待此对象的监视器的单个线程。

(继承自 Object)
NotifyAll()

唤醒正在等待此对象的监视器的所有线程。

(继承自 Object)
SetHandle(IntPtr, JniHandleOwnership)

设置 Handle 属性。

(继承自 Object)
ToArray<T>()

AudioFormat 用于访问许多音频格式和通道配置常量。

(继承自 Object)
ToString()

返回对象的字符串表示形式。

(继承自 Object)
UnregisterFromRuntime()

AudioFormat 用于访问许多音频格式和通道配置常量。

(继承自 Object)
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)

AudioFormat 用于访问许多音频格式和通道配置常量。

显式接口实现

IJavaPeerable.Disposed()

AudioFormat 用于访问许多音频格式和通道配置常量。

(继承自 Object)
IJavaPeerable.DisposeUnlessReferenced()

AudioFormat 用于访问许多音频格式和通道配置常量。

(继承自 Object)
IJavaPeerable.Finalized()

AudioFormat 用于访问许多音频格式和通道配置常量。

(继承自 Object)
IJavaPeerable.JniManagedPeerState

AudioFormat 用于访问许多音频格式和通道配置常量。

(继承自 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

AudioFormat 用于访问许多音频格式和通道配置常量。

(继承自 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

AudioFormat 用于访问许多音频格式和通道配置常量。

(继承自 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

AudioFormat 用于访问许多音频格式和通道配置常量。

(继承自 Object)

扩展方法

JavaCast<TResult>(IJavaObject)

执行 Android 运行时检查的类型转换。

JavaCast<TResult>(IJavaObject)

AudioFormat 用于访问许多音频格式和通道配置常量。

GetJniTypeName(IJavaPeerable)

AudioFormat 用于访问许多音频格式和通道配置常量。

适用于