Most visited

Recently visited

Added in API level 21

CameraCaptureSession

public abstract class CameraCaptureSession
extends Object implements AutoCloseable

java.lang.Object
   ↳ android.hardware.camera2.CameraCaptureSession
Known Direct Subclasses


CameraDevice配置的捕获会话,用于捕获摄像头中的图像或重新处理之前在同一会话中从摄像头捕获的图像。

createCaptureSession通过向InputConfiguration提供一组目标输出表面,或者通过为InputConfiguration提供InputConfiguration和一组目标输出表面以createReprocessableCaptureSession可重新处理的捕获会话来创建。 创建完成后,会话将一直处于活动状态,直到相机设备创建新会话或相机设备关闭。

所有捕捉会话都可用于捕捉来自相机的图像,但只有可重新处理的捕捉会话才能重新处理之前在同一会话中从相机捕捉的图像。

创建会话是一项昂贵的操作,可能需要几百毫秒,因为它需要配置摄像机设备的内部管道并分配内存缓冲区以将图像发送到所需的目标。 因此,设置是异步完成的, createCaptureSessioncreateReprocessableCaptureSession会将即时可用的createReprocessableCaptureSession发送到所提供的监听器的回调onConfigured 如果配置无法完成,则调用onConfigureFailed ,并且会话不会变为活动状态。

如果相机设备创建了新的会话,则关闭前一个会话,并调用其关联的onClosedonClosed 如果会话关闭,所有的会话方法都会抛出IllegalStateException异常。

关闭的会话会清除所有重复请求(就好像 stopRepeating()stopRepeating()一样),但会在新创建的会话接管并重新配置摄像机设备之前照常完成所有正在进行的捕获请求。

Summary

Nested classes

class CameraCaptureSession.CaptureCallback

用于跟踪提交给相机设备的CaptureRequest的进度的回调对象。

class CameraCaptureSession.StateCallback

用于接收有关摄像头捕获会话状态更新的回调对象。

Public constructors

CameraCaptureSession()

Public methods

abstract void abortCaptures()

尽可能快地放弃当前待处理和正在进行的所有捕获。

abstract int capture(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler)

提交要由相机设备拍摄的图像的请求。

abstract int captureBurst(List<CaptureRequest> requests, CameraCaptureSession.CaptureCallback listener, Handler handler)

提交一个请求列表,按顺序将其作为一个突发。

abstract void close()

异步关闭此捕获会话。

abstract CameraDevice getDevice()

获取为此会话创建的相机设备。

abstract Surface getInputSurface()

获取与可重新处理捕获会话相关联的输入Surface。

abstract boolean isReprocessable()

如果应用程序可以使用此相机捕获会话提交重新处理捕获请求,则返回。

abstract void prepare(Surface surface)

预先分配输出Surface的所有缓冲区。

abstract int setRepeatingBurst(List<CaptureRequest> requests, CameraCaptureSession.CaptureCallback listener, Handler handler)

通过此捕获会话请求无休止地重复捕获一系列图像。

abstract int setRepeatingRequest(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler)

通过此捕获会话请求无休止地重复捕获图像。

abstract void stopRepeating()

取消由 setRepeatingRequestsetRepeatingBurst(List , CameraCaptureSession.CaptureCallback, Handler) 设置的任何正在进行的重复捕捉。

Inherited methods

From class java.lang.Object
From interface java.lang.AutoCloseable

Public constructors

CameraCaptureSession

Added in API level 21
CameraCaptureSession ()

Public methods

abortCaptures

Added in API level 21
void abortCaptures ()

尽可能快地放弃当前待处理和正在进行的所有捕获。

相机设备将尽可能快地放弃其当前的所有工作。 某些在飞行中的捕捉可能会成功完成并调用onCaptureCompleted(CameraCaptureSession, CaptureRequest, TotalCaptureResult) ,而其他飞行捕捉可能会触发它们的onCaptureFailed(CameraCaptureSession, CaptureRequest, CaptureFailure)回调。 如果设置了重复请求或重复突发,它将被清除。

此方法是将摄像机设备切换到createCaptureSession(List , CameraCaptureSession.StateCallback, Handler) createReprocessableCaptureSession(InputConfiguration, List , CameraCaptureSession.StateCallback, Handler) 的最新方法的最快方式,但会以丢弃正在进行的工作为代价。 必须在创建新会话之前调用它。 一旦所有待处理的请求完成或被抛弃,如果会话尚未关闭,则将调用onReady(CameraCaptureSession)回调。 否则, onClosed(CameraCaptureSession)回调将在相机设备创建新会话时触发。

取消将至少在相机设备的数据流中引入暂停,因为一旦相机设备被清空,第一个新的请求必须在产生新的输出缓冲区之前通过整个相机管线。

这意味着不建议使用abortCaptures()简单地删除挂起的请求; 它最适用于快速切换输出配置,或用于取消长时间的正在进行的请求(例如多秒捕获)。

Throws
CameraAccessException if the camera device is no longer connected or has encountered a fatal error
IllegalStateException if this session is no longer active, either because the session was explicitly closed, a new session has been created or the camera device has been closed.

也可以看看:

capture

Added in API level 21
int capture (CaptureRequest request, 
                CameraCaptureSession.CaptureCallback listener, 
                Handler handler)

提交要由相机设备拍摄的图像的请求。

该请求定义了捕获单个图像的所有参数,包括传感器,镜头,闪光灯和后期处理设置。

每个请求将生成一个CaptureResult并为一个或多个目标曲面生成新帧,使用CaptureRequest构建器的addTarget(Surface)方法进行设置。 目标曲面(使用addTarget(Surface)设置)必须是创建此捕捉会话时提供的曲面的子集。

多次定期和重新处理请求可以一次进行。 如果只有正在进行的请求或重新处理请求,则会按先进先出的顺序进行处理。 如果正在进行正常请求和重新处理请求,则按先进先出顺序处理常规请求,并按先进先出顺序分别处理重新处理请求。 但是,未指定正在进行的正常请求和重新处理请求的处理顺序。 换句话说,在稍后提交的常规请求之前,将始终处理常规请求。 重新处理请求将始终在稍后提交的重新处理请求之前处理。 但是,在稍后提交的重新处理请求之前,可能不会处理常规请求。

通过此方法提交的请求比通过 setRepeatingRequest(CaptureRequest, CameraCaptureSession.CaptureCallback, Handler)setRepeatingBurst(List , CameraCaptureSession.CaptureCallback, Handler) 提交的请求具有更高的优先级,并且将在当前重复/重复爆发处理完成后立即处理。

所有捕捉会话都可以用于捕捉来自相机的图像,但只捕捉由createReprocessableCaptureSession创建的createReprocessableCaptureSession可以提交重新处理捕捉请求。 向定期捕获会话提交重新处理请求将导致IllegalArgumentException

Parameters
request CaptureRequest: the settings for this capture
listener CameraCaptureSession.CaptureCallback: The callback object to notify once this request has been processed. If null, no metadata will be produced for this capture, although image data will still be produced.
handler Handler: the handler on which the listener should be invoked, or null to use the current thread's looper.
Returns
int int A unique capture sequence ID used by onCaptureSequenceCompleted(CameraCaptureSession, int, long).
Throws
CameraAccessException if the camera device is no longer connected or has encountered a fatal error
IllegalStateException if this session is no longer active, either because the session was explicitly closed, a new session has been created or the camera device has been closed.
IllegalArgumentException if the request targets no Surfaces or Surfaces that are not configured as outputs for this session; or the request targets a set of Surfaces that cannot be submitted simultaneously in a reprocessable capture session; or a reprocess capture request is submitted in a non-reprocessable capture session; or the reprocess capture request was created with a TotalCaptureResult from a different session; or the capture targets a Surface in the middle of being prepared; or the handler is null, the listener is not null, and the calling thread has no looper.

也可以看看:

captureBurst

Added in API level 21
int captureBurst (List<CaptureRequest> requests, 
                CameraCaptureSession.CaptureCallback listener, 
                Handler handler)

提交一个请求列表,按顺序将其作为一个突发。 突发将在尽可能短的时间内捕获,并且不会与其他捕获或重复呼叫提交的请求交织在一起。

定期和重新处理请求可以在一次突发中混合在一起。 定期的请求将被按顺序捕获,并且再处理请求将分别按顺序处理。 但是,没有指定正常请求和重新处理请求之间的处理顺序。 每个捕获产生一个CaptureResult和一个或多个目标surfaces图像缓冲区。 目标曲面(使用addTarget(Surface)设置)必须是创建此捕捉会话时提供的曲面的子集。

这种方法与简单地重复调用 capture(CaptureRequest, CameraCaptureSession.CaptureCallback, Handler)的主要区别在于,该方法保证不会有其他请求与该突发散布。

All capture sessions can be used for capturing images from the camera but only capture sessions created by createReprocessableCaptureSession can submit reprocess capture requests. Submitting a reprocess request to a regular capture session will result in an IllegalArgumentException.

Parameters
requests List: the list of settings for this burst capture
listener CameraCaptureSession.CaptureCallback: The callback object to notify each time one of the requests in the burst has been processed. If null, no metadata will be produced for any requests in this burst, although image data will still be produced.
handler Handler: the handler on which the listener should be invoked, or null to use the current thread's looper.
Returns
int int A unique capture sequence ID used by onCaptureSequenceCompleted(CameraCaptureSession, int, long).
Throws
CameraAccessException if the camera device is no longer connected or has encountered a fatal error
IllegalStateException if this session is no longer active, either because the session was explicitly closed, a new session has been created or the camera device has been closed.
IllegalArgumentException If the requests target no Surfaces, or the requests target Surfaces not currently configured as outputs; or one of the requests targets a set of Surfaces that cannot be submitted simultaneously in a reprocessable capture session; or a reprocess capture request is submitted in a non-reprocessable capture session; or one of the reprocess capture requests was created with a TotalCaptureResult from a different session; or one of the captures targets a Surface in the middle of being prepared; or if the handler is null, the listener is not null, and the calling thread has no looper.

也可以看看:

close

Added in API level 21
void close ()

异步关闭此捕获会话。

关闭会话可释放目标输出会话的表面,以便与新会话或可以绘制到曲面的其他API一起使用。

请注意,使用createCaptureSession(List , CameraCaptureSession.StateCallback, Handler) 创建新捕获会话将自动关闭任何现有捕获会话,并调用旧会话侦听器的onClosed(CameraCaptureSession)onClosed(CameraCaptureSession) 直接使用createCaptureSession(List , CameraCaptureSession.StateCallback, Handler) 而不关闭是快速切换到新会话的推荐方法,因为不变的目标输出可以更有效地重新使用。

一旦会话关闭,其上的所有方法都将抛出IllegalStateException,并且停止任何重复请求或突发(就像调用了stopRepeating() )。 但是,提交给会议的任何正在进行的捕获请求将如常完成; 一旦所有捕获完成并且会话被拆除, onClosed(CameraCaptureSession)将被调用。

闭幕会议是幂等的; 关闭不止一次没有效果。

getDevice

Added in API level 21
CameraDevice getDevice ()

获取为此会话创建的相机设备。

Returns
CameraDevice

getInputSurface

Added in API level 23
Surface getInputSurface ()

获取与可重新处理捕获会话相关联的输入Surface。

每个可重新处理捕获会话都有一个输入Surface ,其中重新处理捕获请求从中获取输入图像,而不是相机设备。 应用程序可以使用此输入Surface创建ImageWriter ,并使用它为重新处理捕获请求提供输入图像。 当可重新处理捕获会话关闭时,输入Surface被放弃并变为无效。

Returns
Surface The Surface where reprocessing capture requests get the input images from. If this is not a reprocess capture session, null will be returned.

也可以看看:

isReprocessable

Added in API level 23
boolean isReprocessable ()

如果应用程序可以使用此相机捕获会话提交重新处理捕获请求,则返回。

Returns
boolean true if the application can submit reprocess capture requests with this camera capture session. false otherwise.

See also:

prepare

Added in API level 23
void prepare (Surface surface)

预先分配输出Surface的所有缓冲区。

通常情况下,给定输出表面的图像缓冲区按需分配,以最小化启动延迟和内存开销。

但是,在某些情况下,可能需要在针对Surface的任何请求实际提交给设备之前分配缓冲区。 大型缓冲区可能需要一些时间进行分配,这可能导致延迟提交请求,直到分配足够的缓冲区以达到稳态行为。 这种延迟可能会导致突发时间超过预期时间,或导致预览输出中出现跳跃或断链。

prepare()方法可用于执行此预分配。 它只能在Surface被用作请求的目标之前调用给定的输出Surface。 分配的缓冲区数量是消费者提供输出Surface所需的计数和摄像设备填充其管线所需的最大数量的总和。 由于这可能比稳态操作实际需要的数量更大,因此使用prepare可能会导致比正常的按需行为更大的内存消耗。Prepare()也会延迟首次输出给定的时间表面,一旦分配完成,换取平滑的帧速率。

例如,创建一个ImageReader的应用程序,该参数的maxImages参数为10,但一次只能同时使用3个图像,通常只会导致分配3个图像(以及摄像机设备需要的平滑操作)。 但是在ImageReader Surface上使用prepare()会导致所有10个图像被分配。 因此使用这种方法的应用程序应该小心只请求其应用程序实际所需的缓冲区数量。

如果在连续会话中使用相同的输出表面(不显式关闭第一个会话),则其已分配的缓冲区将被转移,并且如果它在第一个会话中用作捕获请求的目标,则不能调用prepare在第二届会议上。

一旦分配完成, onSurfacePrepared(CameraCaptureSession, Surface)将被提供给此方法的Surface调用。 在准备调用和onSurfacePrepared调用之间,提供准备的Surface不能用作提交给此会话的CaptureRequest的目标。

LEGACY设备不能预先分配输出缓冲区; 对于这些设备,将立即调用onSurfacePrepared(CameraCaptureSession, Surface) ,并且不进行预分配。

Parameters
surface Surface: the output Surface for which buffers should be pre-allocated. Must be one of the output Surfaces used to create this session.
Throws
CameraAccessException if the camera device is no longer connected or has encountered a fatal error
IllegalStateException if this session is no longer active, either because the session was explicitly closed, a new session has been created or the camera device has been closed.
IllegalArgumentException if the Surface is invalid, not part of this Session, or has already been used as a target of a CaptureRequest in this session or immediately prior sessions.

也可以看看:

setRepeatingBurst

Added in API level 21
int setRepeatingBurst (List<CaptureRequest> requests, 
                CameraCaptureSession.CaptureCallback listener, 
                Handler handler)

通过此捕获会话请求无休止地重复捕获一系列图像。

通过这种方法,相机设备将不断捕捉图像,并以最大可能的速率循环所提供的 CaptureRequests列表中的设置。

如果通过capture(CaptureRequest, CameraCaptureSession.CaptureCallback, Handler)captureBurst(List , CameraCaptureSession.CaptureCallback, Handler) 提交请求,则请求列表的当前重复将在处理较高优先级请求之前完成。 这可以确保应用程序始终能够在最短的时间内收到一个完整的重复突发数据,而不是以更高优先级捕获交错的突发或不完整的捕获。

重复突发请求是应用程序维护预览或其他连续帧流的简单方法,其中每个请求以可预测的方式不同,而不必通过 captureBurst(List , CameraCaptureSession.CaptureCallback, Handler) 持续提交请求。

要停止重复捕捉,请致电stopRepeating() 但是,任何持续爆发仍将完成。 拨打abortCaptures()也会清除请求。

调用此方法将取代之前设置的重复请求或由此方法设置的突发或 setRepeatingRequest(CaptureRequest, CameraCaptureSession.CaptureCallback, Handler) ,但在使用新的重复突发之前将完成任何正在进行的突发。

此方法不支持重新处理捕获请求,因为必须从匹配要重新处理的输入图像的TotalCaptureResult创建每个重新处理CaptureRequest 这是捕获的TotalCaptureResult被发送用于重新处理,或者是来自整个集合的数据被应用程序合并成单个重新处理输入图像时的一组捕获中的一个TotalCaptureResults 该请求必须从相机捕捉图像。 如果提交重新处理捕获请求,则此方法将抛出IllegalArgumentException。

Parameters
requests List: the list of requests to cycle through indefinitely
listener CameraCaptureSession.CaptureCallback: The callback object to notify each time one of the requests in the repeating bursts has finished processing. If null, no metadata will be produced for this stream of requests, although image data will still be produced.
handler Handler: the handler on which the listener should be invoked, or null to use the current thread's looper.
Returns
int int A unique capture sequence ID used by onCaptureSequenceCompleted(CameraCaptureSession, int, long).
Throws
CameraAccessException if the camera device is no longer connected or has encountered a fatal error
IllegalStateException if this session is no longer active, either because the session was explicitly closed, a new session has been created or the camera device has been closed.
IllegalArgumentException If the requests reference no Surfaces or reference Surfaces not currently configured as outputs; or one of the requests is a reprocess capture request; or one of the captures targets a Surface in the middle of being prepared; or the handler is null, the listener is not null, and the calling thread has no looper; or no requests were passed in.

也可以看看:

setRepeatingRequest

Added in API level 21
int setRepeatingRequest (CaptureRequest request, 
                CameraCaptureSession.CaptureCallback listener, 
                Handler handler)

通过此捕获会话请求无休止地重复捕获图像。

使用此方法,相机设备将以最大可能的速率使用所提供的 CaptureRequest的设置连续捕捉图像。

重复请求是应用程序维护预览或其他连续帧流的简单方法,无需通过 capture(CaptureRequest, CameraCaptureSession.CaptureCallback, Handler)持续提交相同的请求。

重复请求具有比通过提交这些较低优先级 capture(CaptureRequest, CameraCaptureSession.CaptureCallback, Handler)captureBurst(List , CameraCaptureSession.CaptureCallback, Handler) ,因此,如果 capture(CaptureRequest, CameraCaptureSession.CaptureCallback, Handler)时的重复请求是活性被调用时,被处理的任何进一步重复请求之前捕获请求将被处理。

要停止重复捕捉,请致电stopRepeating() 致电abortCaptures()也将清除请求。

调用此方法将替换此方法或 setRepeatingBurst(List , CameraCaptureSession.CaptureCallback, Handler) 设置的任何较早的重复请求或突发,但在使用新的重复请求之前将完成任何正在进行的突发。

此方法不支持重新处理捕获请求,因为每个重新处理CaptureRequest必须从匹配要重新处理的输入图像的TotalCaptureResult创建。 这是捕获的TotalCaptureResult被发送用于重新处理,或者是来自整个集合的数据被应用程序合并成单个重新处理输入图像时的一组捕获中的一个TotalCaptureResults 该请求必须从相机捕捉图像。 如果提交重新处理捕获请求,则此方法将抛出IllegalArgumentException。

Parameters
request CaptureRequest: the request to repeat indefinitely
listener CameraCaptureSession.CaptureCallback: The callback object to notify every time the request finishes processing. If null, no metadata will be produced for this stream of requests, although image data will still be produced.
handler Handler: the handler on which the listener should be invoked, or null to use the current thread's looper.
Returns
int int A unique capture sequence ID used by onCaptureSequenceCompleted(CameraCaptureSession, int, long).
Throws
CameraAccessException if the camera device is no longer connected or has encountered a fatal error
IllegalStateException if this session is no longer active, either because the session was explicitly closed, a new session has been created or the camera device has been closed.
IllegalArgumentException If the request references no Surfaces or references Surfaces that are not currently configured as outputs; or the request is a reprocess capture request; or the capture targets a Surface in the middle of being prepared; or the handler is null, the listener is not null, and the calling thread has no looper; or no requests were passed in.

也可以看看:

stopRepeating

Added in API level 21
void stopRepeating ()

取消由setRepeatingRequestsetRepeatingBurst(List , CameraCaptureSession.CaptureCallback, Handler) 设置的任何正在进行的重复捕捉。 对通过capturecaptureBurst提交的请求没有任何影响。

任何目前的飞行中捕捉仍然会完成,就像任何中间捕捉的爆发一样。 要确保设备已完成处理其所有捕获请求并处于就绪状态,请在调用此方法后等待onReady(CameraCaptureSession)回调。

Throws
CameraAccessException if the camera device is no longer connected or has encountered a fatal error
IllegalStateException if this session is no longer active, either because the session was explicitly closed, a new session has been created or the camera device has been closed.

也可以看看:

Hooray!