public class MediaRecorder
extends Object
java.lang.Object | |
↳ | android.media.MediaRecorder |
用于录制音频和视频。 录制控制基于简单的状态机(见下文)。
使用MediaRecorder记录音频的常见情况如下所示:
MediaRecorder recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile(PATH_NAME); recorder.prepare(); recorder.start(); // Recording is now started ... recorder.stop(); recorder.reset(); // You can reuse the object by going back to setAudioSource() step recorder.release(); // Now the object cannot be reused
应用程序可能需要注册信息和错误事件,以便在记录过程中获知某些内部更新和可能的运行时错误。 通过设置适当的监听器(通过调用(至setOnInfoListener(OnInfoListener)
setOnInfoListener和/或setOnErrorListener(OnErrorListener)
setOnErrorListener))来完成这些事件的注册。为了接收与这些监听器相关的相应回调,应用程序需要在运行Looper的线程上创建MediaRecorder对象(主UI线程默认已经有一个Looper运行)。
注意:目前,MediaRecorder无法在模拟器上工作。
有关如何使用MediaRecorder录制视频的更多信息,请阅读Camera开发人员指南。 有关如何使用MediaRecorder录制声音的更多信息,请阅读Audio Capture开发人员指南。
Nested classes |
|
---|---|
class |
MediaRecorder.AudioEncoder 定义音频编码。 |
class |
MediaRecorder.AudioSource 定义音频源。 |
interface |
MediaRecorder.OnErrorListener 在记录时发生错误时调用回调的接口定义。 |
interface |
MediaRecorder.OnInfoListener 在记录时发生错误时调用回调的接口定义。 |
class |
MediaRecorder.OutputFormat 定义输出格式。 |
class |
MediaRecorder.VideoEncoder 定义视频编码。 |
class |
MediaRecorder.VideoSource 定义视频源。 |
Constants |
|
---|---|
int |
MEDIA_ERROR_SERVER_DIED 媒体服务器死亡。 |
int |
MEDIA_RECORDER_ERROR_UNKNOWN 未指定的媒体记录器错误。 |
int |
MEDIA_RECORDER_INFO_MAX_DURATION_REACHED 最大持续时间已经建立,现在已经达到。 |
int |
MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED 最大文件大小已经设置好,现在已经达到。 |
int |
MEDIA_RECORDER_INFO_UNKNOWN 未指定的媒体记录器错误。 |
Public constructors |
|
---|---|
MediaRecorder() 默认的构造函数。 |
Public methods |
|
---|---|
static final int |
getAudioSourceMax() 获取音频源的最大值。 |
int |
getMaxAmplitude() 返回自上次调用此方法以来采样的最大绝对幅度。 |
Surface |
getSurface() 从使用SURFACE视频源时获取表面进行记录。 |
void |
pause() 暂停录制。 |
void |
prepare() 准备录音机开始捕捉和编码数据。 |
void |
release() 释放与此MediaRecorder对象关联的资源。 |
void |
reset() 将MediaRecorder重新启动到其闲置状态。 |
void |
resume() 恢复录制。 |
void |
setAudioChannels(int numChannels) 设置录制的音频通道数量。 |
void |
setAudioEncoder(int audio_encoder) 设置要用于录制的音频编码器。 |
void |
setAudioEncodingBitRate(int bitRate) 设置录制的音频编码比特率。 |
void |
setAudioSamplingRate(int samplingRate) 设置录制的音频采样率。 |
void |
setAudioSource(int audio_source) 设置要用于录制的音频源。 |
void |
setCamera(Camera c) 此方法在API级别21中已弃用。请改用 |
void |
setCaptureRate(double fps) 设置视频帧捕获率。 |
void |
setInputSurface(Surface surface) 使用SURFACE视频源时,配置录像机以使用持久表面。 |
void |
setLocation(float latitude, float longitude) 在输出文件中设置并存储地理数据(经度和纬度)。 |
void |
setMaxDuration(int max_duration_ms) 设置记录会话的最大持续时间(以毫秒为单位)。 |
void |
setMaxFileSize(long max_filesize_bytes) 设置记录会话的最大文件大小(以字节为单位)。 |
void |
setOnErrorListener(MediaRecorder.OnErrorListener l) 录制时发生错误时注册要调用的回调。 |
void |
setOnInfoListener(MediaRecorder.OnInfoListener listener) 记录时发生信息事件时注册要调用的回调。 |
void |
setOrientationHint(int degrees) 设置输出视频播放的方向提示。 |
void |
setOutputFile(String path) 设置要生成的输出文件的路径。 |
void |
setOutputFile(FileDescriptor fd) 传入要写入的文件的文件描述符。 |
void |
setOutputFormat(int output_format) 设置录制过程中输出文件的格式。 |
void |
setPreviewDisplay(Surface sv) 设置Surface以显示录制媒体(视频)的预览。 |
void |
setProfile(CamcorderProfile profile) 使用CamcorderProfile对象的设置进行录制。 |
void |
setVideoEncoder(int video_encoder) 设置要用于录制的视频编码器。 |
void |
setVideoEncodingBitRate(int bitRate) 设置录制的视频编码比特率。 |
void |
setVideoFrameRate(int rate) 设置要捕获的视频的帧速率。 |
void |
setVideoSize(int width, int height) 设置要捕捉的视频的宽度和高度。 |
void |
setVideoSource(int video_source) 设置要用于录制的视频源。 |
void |
start() 开始捕获数据并将其编码到setOutputFile()指定的文件中。 |
void |
stop() 停止录制。 |
Protected methods |
|
---|---|
void |
finalize() 当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
int MEDIA_ERROR_SERVER_DIED
媒体服务器死亡。 在这种情况下,应用程序必须释放MediaRecorder对象并实例化一个新对象。
常量值:100(0x00000064)
int MEDIA_RECORDER_ERROR_UNKNOWN
未指定的媒体记录器错误。
常数值:1(0x00000001)
int MEDIA_RECORDER_INFO_MAX_DURATION_REACHED
最大持续时间已经建立,现在已经达到。
也可以看看:
常量值:800(0x00000320)
int MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED
最大文件大小已经设置好,现在已经达到。
也可以看看:
常量值:801(0x00000321)
int MEDIA_RECORDER_INFO_UNKNOWN
未指定的媒体记录器错误。
也可以看看:
常数值:1(0x00000001)
int getMaxAmplitude ()
返回自上次调用此方法以来采样的最大绝对幅度。 仅在setAudioSource()之后调用此方法。
Returns | |
---|---|
int |
the maximum absolute amplitude measured since the last call, or 0 when called for the first time |
Throws | |
---|---|
IllegalStateException |
if it is called before the audio source has been set. |
Surface getSurface ()
从使用SURFACE视频源时获取表面进行记录。
只能在prepare()
之后prepare()
。 在start()
之前渲染到Surface的start()
将被丢弃。
Returns | |
---|---|
Surface |
Throws | |
---|---|
IllegalStateException |
if it is called before prepare() , after stop() , or is called when VideoSource is not set to SURFACE. |
也可以看看:
void pause ()
暂停录制。 在开始()后调用它。 您可以使用resume()而不用重新配置来恢复录制,而不是stop()。 如果记录已经暂停,它什么都不做。 当录制暂停并恢复时,结果输出就像暂停期间没有任何事件发生,立即切换到恢复的场景。
Throws | |
---|---|
IllegalStateException |
if it is called before start() or after stop() |
void prepare ()
准备录音机开始捕捉和编码数据。 在设置所需的音频和视频源,编码器,文件格式等之后,但在启动()之前,必须调用此方法。
Throws | |
---|---|
IllegalStateException |
if it is called after start() or before setOutputFormat(). |
IOException |
if prepare fails otherwise. |
void release ()
释放与此MediaRecorder对象关联的资源。 当您完成使用MediaRecorder时,最好调用此方法。 特别是,每当应用程序的活动暂停(调用其onPause()方法)或停止(它的onStop()方法被调用)时,应调用此方法以释放MediaRecorder对象,除非应用程序有特殊需要保持周围的物体。 除了保存不必要的资源(如内存和编解码器实例)之外,如果不再需要MediaRecorder对象,则无法立即调用此方法也可能导致移动设备的电池消耗持续,并且如果没有其他应用程序则记录失败设备支持同一编码解码器的多个实例。 即使支持同一编解码器的多个实例,当不必要的多个实例同时使用时,也可能会导致性能下降。
void resume ()
恢复录制。 在开始()后调用它。 如果录音没有暂停,它什么也不做。
Throws | |
---|---|
IllegalStateException |
if it is called before start() or after stop() |
也可以看看:
void setAudioChannels (int numChannels)
设置录制的音频通道数量。 在prepare()之前调用这个方法。 Prepare()可以对参数执行额外的检查,以确定指定数量的音频通道是否适用。
Parameters | |
---|---|
numChannels |
int : the number of audio channels. Usually it is either 1 (mono) or 2 (stereo). |
void setAudioEncoder (int audio_encoder)
设置要用于录制的音频编码器。 如果未调用此方法,则输出文件将不包含音轨。 在setOutputFormat()之后但在prepare()之前调用此方法。
Parameters | |
---|---|
audio_encoder |
int : the audio encoder to use. |
Throws | |
---|---|
IllegalStateException |
if it is called before setOutputFormat() or after prepare(). |
也可以看看:
void setAudioEncodingBitRate (int bitRate)
设置录制的音频编码比特率。 在prepare()之前调用这个方法。 Prepare()可以对参数执行额外的检查以确定指定的比特率是否适用,并且有时传递的比特率将在内部被裁剪,以确保可以基于平台的功能顺利地进行音频记录。
Parameters | |
---|---|
bitRate |
int : the audio encoding bit rate in bits per second. |
void setAudioSamplingRate (int samplingRate)
设置录制的音频采样率。 在prepare()之前调用这个方法。 Prepare()可以对参数执行额外的检查,以确定指定的音频采样率是否适用。 采样率实际上取决于录音的格式以及平台的功能。 例如,AAC音频编码标准支持的采样率范围为8至96 kHz,AMRNB支持的采样率为8 kHz,AMRWB支持的采样率为16 kHz。 有关支持的音频采样率,请参阅相关的音频编码标准。
Parameters | |
---|---|
samplingRate |
int : the sampling rate for audio in samples per second. |
void setAudioSource (int audio_source)
设置要用于录制的音频源。 如果未调用此方法,则输出文件将不包含音轨。 在设置记录参数或编码器之前,需要指定源。 只在setOutputFormat()之前调用它。
Parameters | |
---|---|
audio_source |
int : the audio source to use |
Throws | |
---|---|
IllegalStateException |
if it is called after setOutputFormat() |
也可以看看:
void setCamera (Camera c)
此方法在API级别21中已弃用。
改为使用getSurface()
和android.hardware.camera2
API。
设置 Camera
用于录制。
使用此功能可以在预览和拍摄模式之间快速切换,而无需拆卸相机对象。 应该在此之前调用unlock()
。 必须在prepare()
之前prepare()
。
Parameters | |
---|---|
c |
Camera : the Camera to use for recording |
void setCaptureRate (double fps)
设置视频帧捕获率。 这可用于设置与录制的视频播放速率不同的视频帧捕捉速率。 该方法还将录制模式设置为时间流逝。 在时间流逝视频录制中,只录制视频。 如果应用程序设置它们,则在延时记录会话启动时忽略音频相关参数。
Parameters | |
---|---|
fps |
double : Rate at which frames should be captured in frames per second. The fps can go as low as desired. However the fastest fps will be limited by the hardware. For resolutions that can be captured by the video camera, the fastest fps can be computed using getPreviewFpsRange(int[]) . For higher resolutions the fastest fps may be more restrictive. Note that the recorder cannot guarantee that frames will be captured at the given rate due to camera/encoder limitations. However it tries to be as close as possible. |
void setInputSurface (Surface surface)
使用SURFACE视频源时,配置录像机以使用持久表面。
只能在prepare()
之前prepare()
。 如果调用, getSurface()
不应使用getSurface()
并会抛出IllegalStateException。 在start()
之前渲染到表面的start()
将被丢弃。
Parameters | |
---|---|
surface |
Surface : a persistent input surface created by createPersistentInputSurface() |
Throws | |
---|---|
IllegalStateException |
if it is called after prepare() and before stop() . |
IllegalArgumentException |
if the surface was not created by createPersistentInputSurface() . |
void setLocation (float latitude, float longitude)
在输出文件中设置并存储地理数据(经度和纬度)。 这个方法应该在prepare()之前调用。 如果输出格式为OutputFormat.THREE_GPP或OutputFormat.MPEG_4,则地理数据将存储在udta框中,并且其他输出格式将被忽略。 地理数据根据ISO-6709标准进行存储。
Parameters | |
---|---|
latitude |
float : latitude in degrees. Its value must be in the range [-90, 90]. |
longitude |
float : longitude in degrees. Its value must be in the range [-180, 180]. |
Throws | |
---|---|
IllegalArgumentException |
if the given latitude or longitude is out of range. |
void setMaxDuration (int max_duration_ms)
设置记录会话的最大持续时间(以毫秒为单位)。 在setOutFormat()之后但在prepare()之前调用此方法。 录音达到指定的时间后,将通过MediaRecorder.OnInfoListener
的“what”代码向MEDIA_RECORDER_INFO_MAX_DURATION_REACHED
发送通知,并停止录音。 停止是异步发生的,不能保证在收听者收到通知时录音机将停止。
Parameters | |
---|---|
max_duration_ms |
int : the maximum duration in ms (if zero or negative, disables the duration limit) |
Throws | |
---|---|
IllegalArgumentException |
void setMaxFileSize (long max_filesize_bytes)
设置记录会话的最大文件大小(以字节为单位)。 在setOutFormat()之后但在prepare()之前调用此方法。 录音达到指定的文件大小后,将通过“what”代码MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED
向MediaRecorder.OnInfoListener
发送通知,并停止录制。 停止是异步发生的,不能保证在收听者收到通知时录音机将停止。
Parameters | |
---|---|
max_filesize_bytes |
long : the maximum filesize in bytes (if zero or negative, disables the limit) |
Throws | |
---|---|
IllegalArgumentException |
void setOnErrorListener (MediaRecorder.OnErrorListener l)
录制时发生错误时注册要调用的回调。
Parameters | |
---|---|
l |
MediaRecorder.OnErrorListener : the callback that will be run |
void setOnInfoListener (MediaRecorder.OnInfoListener listener)
记录时发生信息事件时注册要调用的回调。
Parameters | |
---|---|
listener |
MediaRecorder.OnInfoListener : the callback that will be run |
void setOrientationHint (int degrees)
设置输出视频播放的方向提示。 这个方法应该在prepare()之前调用。 此方法不会在视频录制期间触发源视频帧旋转,但如果输出格式为OutputFormat.THREE_GPP或OutputFormat.MPEG_4,则在输出视频中添加包含旋转角度的合成矩阵,以便视频播放器可以选择合适的重放方向。 请注意,某些视频播放器在播放过程中可能会忽略视频中的组合矩阵。
Parameters | |
---|---|
degrees |
int : the angle to be rotated clockwise in degrees. The supported angles are 0, 90, 180, and 270 degrees. |
Throws | |
---|---|
IllegalArgumentException |
if the angle is not supported. |
void setOutputFile (String path)
设置要生成的输出文件的路径。 在setOutputFormat()之后但在prepare()之前调用此方法。
Parameters | |
---|---|
path |
String : The pathname to use. |
Throws | |
---|---|
IllegalStateException |
if it is called before setOutputFormat() or after prepare() |
void setOutputFile (FileDescriptor fd)
传入要写入的文件的文件描述符。 在setOutputFormat()之后但在prepare()之前调用此方法。
Parameters | |
---|---|
fd |
FileDescriptor : an open file descriptor to be written into. |
Throws | |
---|---|
IllegalStateException |
if it is called before setOutputFormat() or after prepare() |
void setOutputFormat (int output_format)
设置录制过程中输出文件的格式。 在setAudioSource()/ setVideoSource()之后但在prepare()之前调用它。
建议在使用H.263视频编码器和AMR音频编码器时始终使用3GP格式。 使用MPEG-4容器格式可能会混淆某些桌面播放器。
Parameters | |
---|---|
output_format |
int : the output format to use. The output format needs to be specified before setting recording-parameters or encoders. |
Throws | |
---|---|
IllegalStateException |
if it is called after prepare() or before setAudioSource()/setVideoSource(). |
也可以看看:
void setPreviewDisplay (Surface sv)
设置Surface以显示录制媒体(视频)的预览。 在prepare()之前调用它以确保设置了预期的预览显示。 如果使用setCamera(Camera)
并且曲面已经设置到相机,应用程序不需要调用它。 如果使用非空曲面调用它,则摄像机的预览表面将被新曲面替换。 如果此方法是使用零曲面调用的,或者根本不调用,媒体录制器将不会更改相机的预览表面。
Parameters | |
---|---|
sv |
Surface : the Surface to use for the preview |
void setProfile (CamcorderProfile profile)
使用CamcorderProfile对象的设置进行录制。 在设置视频和音频源之后以及在setOutputFile()之前调用此方法。 如果使用延时摄像机配置文件,则会忽略与音频相关的来源或录制参数。
Parameters | |
---|---|
profile |
CamcorderProfile : the CamcorderProfile to use |
也可以看看:
void setVideoEncoder (int video_encoder)
设置要用于录制的视频编码器。 如果未调用此方法,则输出文件将不包含视频轨道。 在setOutputFormat()之后和prepare()之前调用它。
Parameters | |
---|---|
video_encoder |
int : the video encoder to use. |
Throws | |
---|---|
IllegalStateException |
if it is called before setOutputFormat() or after prepare() |
也可以看看:
void setVideoEncodingBitRate (int bitRate)
设置录制的视频编码比特率。 在prepare()之前调用这个方法。 Prepare()可以对参数执行额外的检查,以确定指定的比特率是否适用,并且有时传递的比特率将在内部被裁剪,以确保视频录制可以基于平台的功能顺利进行。
Parameters | |
---|---|
bitRate |
int : the video encoding bit rate in bits per second. |
void setVideoFrameRate (int rate)
设置要捕获的视频的帧速率。 必须在setVideoSource()之后调用。 在setOutFormat()之后但在prepare()之前调用此方法。
Parameters | |
---|---|
rate |
int : the number of frames per second of video to capture |
Throws | |
---|---|
IllegalStateException |
if it is called after prepare() or before setOutputFormat(). NOTE: On some devices that have auto-frame rate, this sets the maximum frame rate, not a constant frame rate. Actual frame rate will vary according to lighting conditions. |
void setVideoSize (int width, int height)
设置要捕捉的视频的宽度和高度。 必须在setVideoSource()之后调用。 在setOutFormat()之后但在prepare()之前调用此方法。
Parameters | |
---|---|
width |
int : the width of the video to be captured |
height |
int : the height of the video to be captured |
Throws | |
---|---|
IllegalStateException |
if it is called after prepare() or before setOutputFormat() |
void setVideoSource (int video_source)
设置要用于录制的视频源。 如果未调用此方法,则输出文件将不包含视频轨道。 在设置记录参数或编码器之前,需要指定源。 只在setOutputFormat()之前调用它。
Parameters | |
---|---|
video_source |
int : the video source to use |
Throws | |
---|---|
IllegalStateException |
if it is called after setOutputFormat() |
也可以看看:
void start ()
开始捕获数据并将其编码到setOutputFile()指定的文件中。 在prepare()之后调用它。
由于API级别13,如果应用程序通过setCamera(Camera)
设置摄像头,应用程序可以在此方法调用后使用摄像头。 这些应用程序不需要再次锁定相机。 但是,如果此方法失败,应用程序仍应将相机锁定。 录制过程中应用程序不应该启动另一个录制会话。
Throws | |
---|---|
IllegalStateException |
if it is called before prepare(). |
void stop ()
停止录制。 在开始()后调用它。 一旦录制停止,您将不得不再次配置它,就像它刚刚构建一样。 请注意,如果在调用stop()时没有收到有效的音频/视频数据,则会故意将RuntimeException抛出到应用程序。 如果在start()之后立即调用stop(),则会发生这种情况。 失败后,应用程序会采取相应措施来清理输出文件(例如,删除输出文件),因为输出文件在发生这种情况时没有正确构建。
Throws | |
---|---|
IllegalStateException |
if it is called before start() |
void finalize ()
当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。 子类会覆盖finalize
方法以处置系统资源或执行其他清理。
的常规协定finalize
是,它被调用,如果当在Java TM虚拟机已确定不再有由该目的可以通过还没有死亡,除了作为一个动作的结果的任何线程访问的任何手段取决于某些其他可以完成的对象或类别的最终定稿。 方法finalize
可以采取任何行动,包括使这个对象再次可用于其他线程; 然而, finalize
的通常目的是在对象被不可撤销地丢弃之前执行清理操作。 例如,表示输入/输出连接的对象的finalize方法可能会执行显式I / O事务,以在永久丢弃该对象之前中断连接。
类finalize
方法Object
执行特殊操作; 它只是正常返回。 Object
子类可能会覆盖此定义。
Java编程语言不保证哪个线程将为任何给定对象调用finalize
方法。 但是,保证调用finalize的线程在调用finalize时不会保留任何用户可见的同步锁。 如果finalize方法引发未捕获的异常,则忽略该异常,并终止该对象的终止。
在针对对象调用 finalize
方法之后,在Java虚拟机再次确定不再有任何方法可以通过尚未死亡的任何线程访问此对象,包括可能的操作通过准备完成的其他对象或类别,此时该对象可能被丢弃。
对于任何给定的对象,Java虚拟机从不会多次调用 finalize
方法。
finalize
方法引发的任何异常 finalize
导致终止此对象的终止,但会被忽略。