Most visited

Recently visited

Added in API level 1

MediaRecorder

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无法在模拟器上工作。

Developer Guides

有关如何使用MediaRecorder录制视频的更多信息,请阅读Camera开发人员指南。 有关如何使用MediaRecorder录制声音的更多信息,请阅读Audio Capture开发人员指南。

Summary

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中已弃用。请改用getSurface()android.hardware.camera2 API。

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

Constants

MEDIA_ERROR_SERVER_DIED

Added in API level 17
int MEDIA_ERROR_SERVER_DIED

媒体服务器死亡。 在这种情况下,应用程序必须释放MediaRecorder对象并实例化一个新对象。

也可以看看:

常量值:100(0x00000064)

MEDIA_RECORDER_ERROR_UNKNOWN

Added in API level 3
int MEDIA_RECORDER_ERROR_UNKNOWN

未指定的媒体记录器错误。

也可以看看:

常数值:1(0x00000001)

MEDIA_RECORDER_INFO_MAX_DURATION_REACHED

Added in API level 3
int MEDIA_RECORDER_INFO_MAX_DURATION_REACHED

最大持续时间已经建立,现在已经达到。

也可以看看:

常量值:800(0x00000320)

MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED

Added in API level 3
int MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED

最大文件大小已经设置好,现在已经达到。

也可以看看:

常量值:801(0x00000321)

MEDIA_RECORDER_INFO_UNKNOWN

Added in API level 3
int MEDIA_RECORDER_INFO_UNKNOWN

未指定的媒体记录器错误。

也可以看看:

常数值:1(0x00000001)

Public constructors

MediaRecorder

Added in API level 1
MediaRecorder ()

默认的构造函数。

Public methods

getAudioSourceMax

Added in API level 4
int getAudioSourceMax ()

获取音频源的最大值。

Returns
int

也可以看看:

getMaxAmplitude

Added in API level 1
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.

getSurface

Added in API level 21
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.

也可以看看:

pause

Added in API level 24
void pause ()

暂停录制。 在开始()后调用它。 您可以使用resume()而不用重新配置来恢复录制,而不是stop()。 如果记录已经暂停,它什么都不做。 当录制暂停并恢复时,结果输出就像暂停期间没有任何事件发生,立即切换到恢复的场景。

Throws
IllegalStateException if it is called before start() or after stop()

prepare

Added in API level 1
void prepare ()

准备录音机开始捕捉和编码数据。 在设置所需的音频和视频源,编码器,文件格式等之后,但在启动()之前,必须调用此方法。

Throws
IllegalStateException if it is called after start() or before setOutputFormat().
IOException if prepare fails otherwise.

release

Added in API level 1
void release ()

释放与此MediaRecorder对象关联的资源。 当您完成使用MediaRecorder时,最好调用此方法。 特别是,每当应用程序的活动暂停(调用其onPause()方法)或停止(它的onStop()方法被调用)时,应调用此方法以释放MediaRecorder对象,除非应用程序有特殊需要保持周围的物体。 除了保存不必要的资源(如内存和编解码器实例)之外,如果不再需要MediaRecorder对象,则无法立即调用此方法也可能导致移动设备的电池消耗持续,并且如果没有其他应用程序则记录失败设备支持同一编码解码器的多个实例。 即使支持同一编解码器的多个实例,当不必要的多个实例同时使用时,也可能会导致性能下降。

reset

Added in API level 1
void reset ()

将MediaRecorder重新启动到其闲置状态。 在调用这个方法之后,你必须重新配置它,就好像它刚刚构建完成一样。

resume

Added in API level 24
void resume ()

恢复录制。 在开始()后调用它。 如果录音没有暂停,它什么也不做。

Throws
IllegalStateException if it is called before start() or after stop()

也可以看看:

setAudioChannels

Added in API level 8
void setAudioChannels (int numChannels)

设置录制的音频通道数量。 在prepare()之前调用这个方法。 Prepare()可以对参数执行额外的检查,以确定指定数量的音频通道是否适用。

Parameters
numChannels int: the number of audio channels. Usually it is either 1 (mono) or 2 (stereo).

setAudioEncoder

Added in API level 1
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().

也可以看看:

setAudioEncodingBitRate

Added in API level 8
void setAudioEncodingBitRate (int bitRate)

设置录制的音频编码比特率。 在prepare()之前调用这个方法。 Prepare()可以对参数执行额外的检查以确定指定的比特率是否适用,并且有时传递的比特率将在内部被裁剪,以确保可以基于平台的功能顺利地进行音频记录。

Parameters
bitRate int: the audio encoding bit rate in bits per second.

setAudioSamplingRate

Added in API level 8
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.

setAudioSource

Added in API level 1
void setAudioSource (int audio_source)

设置要用于录制的音频源。 如果未调用此方法,则输出文件将不包含音轨。 在设置记录参数或编码器之前,需要指定源。 只在setOutputFormat()之前调用它。

Parameters
audio_source int: the audio source to use
Throws
IllegalStateException if it is called after setOutputFormat()

也可以看看:

setCamera

Added in API level 3
void setCamera (Camera c)

此方法在API级别21中已弃用。
改为使用getSurface()android.hardware.camera2 API。

设置 Camera用于录制。

使用此功能可以在预览和拍摄模式之间快速切换,而无需拆卸相机对象。 应该在此之前调用unlock() 必须在prepare()之前prepare()

Parameters
c Camera: the Camera to use for recording

setCaptureRate

Added in API level 11
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.

setInputSurface

Added in API level 23
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().

也可以看看:

setLocation

Added in API level 14
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.

setMaxDuration

Added in API level 3
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

setMaxFileSize

Added in API level 3
void setMaxFileSize (long max_filesize_bytes)

设置记录会话的最大文件大小(以字节为单位)。 在setOutFormat()之后但在prepare()之前调用此方法。 录音达到指定的文件大小后,将通过“what”代码MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHEDMediaRecorder.OnInfoListener发送通知,并停止录制。 停止是异步发生的,不能保证在收听者收到通知时录音机将停止。

Parameters
max_filesize_bytes long: the maximum filesize in bytes (if zero or negative, disables the limit)
Throws
IllegalArgumentException

setOnErrorListener

Added in API level 3
void setOnErrorListener (MediaRecorder.OnErrorListener l)

录制时发生错误时注册要调用的回调。

Parameters
l MediaRecorder.OnErrorListener: the callback that will be run

setOnInfoListener

Added in API level 3
void setOnInfoListener (MediaRecorder.OnInfoListener listener)

记录时发生信息事件时注册要调用的回调。

Parameters
listener MediaRecorder.OnInfoListener: the callback that will be run

setOrientationHint

Added in API level 9
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.

setOutputFile

Added in API level 1
void setOutputFile (String path)

设置要生成的输出文件的路径。 在setOutputFormat()之后但在prepare()之前调用此方法。

Parameters
path String: The pathname to use.
Throws
IllegalStateException if it is called before setOutputFormat() or after prepare()

setOutputFile

Added in API level 3
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()

setOutputFormat

Added in API level 1
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().

也可以看看:

setPreviewDisplay

Added in API level 1
void setPreviewDisplay (Surface sv)

设置Surface以显示录制媒体(视频)的预览。 在prepare()之前调用它以确保设置了预期的预览显示。 如果使用setCamera(Camera)并且曲面已经设置到相机,应用程序不需要调用它。 如果使用非空曲面调用它,则摄像机的预览表面将被新曲面替换。 如果此方法是使用零曲面调用的,或者根本不调用,媒体录制器将不会更改相机的预览表面。

Parameters
sv Surface: the Surface to use for the preview

也可以看看:

setProfile

Added in API level 8
void setProfile (CamcorderProfile profile)

使用CamcorderProfile对象的设置进行录制。 在设置视频和音频源之后以及在setOutputFile()之前调用此方法。 如果使用延时摄像机配置文件,则会忽略与音频相关的来源或录制参数。

Parameters
profile CamcorderProfile: the CamcorderProfile to use

也可以看看:

setVideoEncoder

Added in API level 3
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()

也可以看看:

setVideoEncodingBitRate

Added in API level 8
void setVideoEncodingBitRate (int bitRate)

设置录制的视频编码比特率。 在prepare()之前调用这个方法。 Prepare()可以对参数执行额外的检查,以确定指定的比特率是否适用,并且有时传递的比特率将在内部被裁剪,以确保视频录制可以基于平台的功能顺利进行。

Parameters
bitRate int: the video encoding bit rate in bits per second.

setVideoFrameRate

Added in API level 3
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.

setVideoSize

Added in API level 3
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()

setVideoSource

Added in API level 3
void setVideoSource (int video_source)

设置要用于录制的视频源。 如果未调用此方法,则输出文件将不包含视频轨道。 在设置记录参数或编码器之前,需要指定源。 只在setOutputFormat()之前调用它。

Parameters
video_source int: the video source to use
Throws
IllegalStateException if it is called after setOutputFormat()

也可以看看:

start

Added in API level 1
void start ()

开始捕获数据并将其编码到setOutputFile()指定的文件中。 在prepare()之后调用它。

由于API级别13,如果应用程序通过setCamera(Camera)设置摄像头,应用程序可以在此方法调用后使用摄像头。 这些应用程序不需要再次锁定相机。 但是,如果此方法失败,应用程序仍应将相机锁定。 录制过程中应用程序不应该启动另一个录制会话。

Throws
IllegalStateException if it is called before prepare().

stop

Added in API level 1
void stop ()

停止录制。 在开始()后调用它。 一旦录制停止,您将不得不再次配置它,就像它刚刚构建一样。 请注意,如果在调用stop()时没有收到有效的音频/视频数据,则会故意将RuntimeException抛出到应用程序。 如果在start()之后立即调用stop(),则会发生这种情况。 失败后,应用程序会采取相应措施来清理输出文件(例如,删除输出文件),因为输出文件在发生这种情况时没有正确构建。

Throws
IllegalStateException if it is called before start()

Protected methods

finalize

Added in API level 1
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导致终止此对象的终止,但会被忽略。

Hooray!