- 所有超接口:
-
AutoCloseable
,DataLine
,Line
Clip
接口表示一种特殊类型的数据线,其音频数据可以在播放之前加载,而不是实时流式传输。
由于数据是预加载的并且具有已知长度,您可以设置剪辑以从其音频数据的任何位置开始播放。您还可以创建一个循环,这样当剪辑播放时它将重复循环。循环由起始和结束采样帧以及循环应播放的次数指定。
剪辑可以从支持此类型线路的Mixer
中获取。当打开剪辑时,数据将被加载。
可以使用start
和stop
方法启动和停止音频剪辑的播放。这些方法不会重置媒体位置;start
导致播放从上次停止播放的位置继续。要从剪辑的音频数据开头重新开始播放,只需在调用stop
之后跟随setFramePosition(0)
,这将将媒体倒回到剪辑的开头。
- 自 JDK 版本:
- 1.3
-
Nested Class Summary
Nested classes/interfaces declared in interface javax.sound.sampled.DataLine
DataLine.Info
-
Field Summary
-
Method Summary
Modifier and TypeMethodDescriptionint
获取样本帧中的媒体长度。long
获取以微秒为单位的媒体持续时间。void
loop
(int count) 从当前位置开始循环播放。void
open
(AudioFormat format, byte[] data, int offset, int bufferSize) 打开剪辑,这意味着它应获取任何所需的系统资源并变为可操作。void
open
(AudioInputStream stream) 使用提供的音频输入流中存在的格式和音频数据打开剪辑。void
setFramePosition
(int frames) 设置样本帧中的媒体位置。void
setLoopPoints
(int start, int end) 设置将在循环中播放的第一个和最后一个样本帧。void
setMicrosecondPosition
(long microseconds) 设置以微秒为单位的媒体位置。Methods declared in interface javax.sound.sampled.DataLine
available, drain, flush, getBufferSize, getFormat, getFramePosition, getLevel, getLongFramePosition, getMicrosecondPosition, isActive, isRunning, start, stop
Methods declared in interface javax.sound.sampled.Line
addLineListener, close, getControl, getControls, getLineInfo, isControlSupported, isOpen, open, removeLineListener
-
Field Details
-
LOOP_CONTINUOUSLY
static final int LOOP_CONTINUOUSLY表示循环应无限继续而不是在特定循环次数后完成的值。- 参见:
-
-
Method Details
-
open
void open(AudioFormat format, byte[] data, int offset, int bufferSize) throws LineUnavailableException 打开剪辑,这意味着它应获取任何所需的系统资源并变为可操作。剪辑将使用指定的格式和音频数据打开。如果此操作成功,该线路将标记为打开,并向线路的侦听器分派一个OPEN
事件。在已经打开的线路上调用此方法是非法的,可能会导致
IllegalStateException
。请注意,一些线路一旦关闭,就无法重新打开。尝试重新打开此类线路将始终导致
LineUnavailableException
。- 参数:
-
format
- 提供的音频数据的格式 -
data
- 包含要加载到剪辑中的音频数据的字节数组 -
offset
- 从数组开头以字节为单位表示的开始复制点 -
bufferSize
- 从数组中加载到剪辑中的数据字节数 - 抛出:
-
LineUnavailableException
- 如果由于资源限制而无法打开线路 -
IllegalArgumentException
- 如果缓冲区大小不代表样本帧的整数倍,或者format
未完全指定或无效 -
IllegalStateException
- 如果线路已经打开 -
SecurityException
- 如果由于安全限制而无法打开线路 - 参见:
-
open
使用提供的音频输入流中存在的格式和音频数据打开剪辑。打开剪辑意味着它应获取任何所需的系统资源并变为可操作。如果此操作成功,该线路将标记为打开,并向线路的侦听器分派一个OPEN
事件。在已经打开的线路上调用此方法是非法的,可能会导致
IllegalStateException
。请注意,一些线路一旦关闭,就无法重新打开。尝试重新打开此类线路将始终导致
LineUnavailableException
。- 参数:
-
stream
- 从中读取音频数据以加载到剪辑中的音频输入流 - 抛出:
-
LineUnavailableException
- 如果由于资源限制而无法打开线路 -
IOException
- 如果在读取流的过程中发生 I/O 异常 -
IllegalArgumentException
- 如果流的音频格式未完全指定或无效 -
IllegalStateException
- 如果线路已经打开 -
SecurityException
- 如果由于安全限制而无法打开线路 - 参见:
-
getFrameLength
int getFrameLength()获取样本帧中的媒体长度。- 返回:
-
媒体长度,以样本帧表示,如果线路未打开则为
AudioSystem.NOT_SPECIFIED
- 参见:
-
getMicrosecondLength
long getMicrosecondLength()获取以微秒为单位的媒体持续时间。- 返回:
-
媒体持续时间,以微秒表示,如果线路未打开则为
AudioSystem.NOT_SPECIFIED
- 参见:
-
setFramePosition
void setFramePosition(int frames) 设置样本帧中的媒体位置。位置是从零开始的;第一个帧是帧编号零。下次剪辑开始播放时,它将从此位置开始播放。要获取样本帧中的当前位置,请使用
DataLine
的getFramePosition
方法。- 参数:
-
frames
- 所需的新媒体位置,以样本帧表示
-
setMicrosecondPosition
void setMicrosecondPosition(long microseconds) 设置以微秒为单位的媒体位置。下次剪辑开始播放时,它将从此位置开始。精度不被保证。例如,实现可能会从当前帧位置和音频样本帧速率计算微秒位置。然后,微秒的精度将受限于每个样本帧的微秒数。要获取以微秒为单位的当前位置,请使用
DataLine
的getMicrosecondPosition
方法。- 参数:
-
microseconds
- 所需的新媒体位置,以微秒表示
-
setLoopPoints
void setLoopPoints(int start, int end) 设置将在循环中播放的第一个和最后一个样本帧。结束点必须大于或等于起始点,并且两者都必须落在加载的媒体大小内。起始点为 0 表示加载的媒体的开头。类似地,结束点为 -1 表示媒体的最后一帧。- 参数:
-
start
- 循环的起始位置,以样本帧表示(从零开始) -
end
- 循环的结束位置,以样本帧表示(从零开始),或者 -1 表示最后一帧 - 抛出:
-
IllegalArgumentException
- 如果无法设置请求的循环点,通常是因为一个或两个点超出了媒体的持续时间,或者结束点在起始点之前
-
loop
void loop(int count) 从当前位置开始循环播放。播放将继续到循环的结束点,然后循环返回到循环的起始点count
次,最后继续播放到剪辑的结尾。如果在调用此方法时的当前位置大于循环结束点,则播放将简单地继续到剪辑的结尾而不循环。
count
值为 0 表示任何当前循环都应停止,播放应继续到剪辑的结尾。在循环操作期间使用其他值调用此方法时,行为是未定义的。如果在循环过程中停止播放,则当前循环状态将被清除;后续循环和启动请求的行为不受中断的循环操作的影响。
- 参数:
-
count
- 播放应从循环的结束位置回到循环的起始位置的次数,或者LOOP_CONTINUOUSLY
表示循环应持续直到中断
-