Android捕捉慢动作video

如何在我的应用中捕捉慢动作video?

我试过用

mMediaRecorder.setVideoFrameRate(100); 

但如果我使用IllegalStateException设置值20或更多,应用程序崩溃。

我研究了很多。正常video在24到30 fps之间。要看慢动作video,我们需要捕获100-120 fps但设备不允许这样。但是我看到设备中的默认摄像头有一个慢动作选项。游戏商店中的应用程序也很少允许创建慢动作video。我也尝试设置更高的setCaptureRate() ,但也可以捕获普通模式video。在少数地方提到慢动作电影可以通过OpenCV/JavaCV完成库,但我不明白如何使用这些库来捕获Android中的慢动作video?

    从您提供的来源(CamcorderProfile) ,您所要做的就是每秒增加拍摄的图像:

     mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_LOW); 

    要么

     mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH); 

    因此,如果您每秒拍摄100张图像,并且每秒显示25帧,则记录的第二帧需要4秒才能显示

    请阅读您正在使用的课程的文档:

    public static final int QUALITY_HIGH_SPEED_LOW

    高速(> = 100fps)质量等级,对应于最低可用分辨率。

    对于下面定义的所有高速配置文件((从QUALITY_HIGH_SPEED_LOW到QUALITY_HIGH_SPEED_2160P),它们与正常录制配置文件类似,只有更高的输出帧速率和比特率。因此,使用setProfile(CamcorderProfile)设置这些配置文件而不指定任何其他编码参数将生成高速video,而不是具有不同捕获和输出(回放)帧速率的慢动作video。要记录慢动作video,应用程序必须通过setVideoFrameRate(int)和setVideoEncodingBitRate适当地设置video输出(回放)帧速率和比特率。 (int)基于慢动作因子。如果应用程序打算使用MediaCodec编码器进行video录制,则必须根据此CamcorderProfile类似地设置MediaFormat的每个单独字段。

    虽然我无法在没有混蛋的情况下捕获平滑的慢动作video,但我能够使用ffmpeg将捕获的video转换为慢动作,这非常流畅和均匀。为了在android中集成FFmpeg,我们可以使用预编译的库,如ffmpeg-android 。

    根据相关案例,我们可以从相机捕获video,然后使用ffmpeg将其转换为慢动作。

    要创建慢动作video,我们可以使用以下命令 –

     String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-filter_complex", "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]", "-map", "[v]", "-map", "[a]", "-b:v", "2097k", "-r", "60", "-vcodec", "mpeg4", outputFileAbsolutePath}; 

    这里,

    -y

    无需询问即可覆盖输出文件

    -一世

    ffmpeg从-i选项指定的任意数量的输入“文件”中读取

    -地图

    输出链接标签用-map表示。

    -b:v

    设置video比特率

    -r

    设置帧速率

    -vcodec

    设置video编解码器

    -filter_complex filtergraph

    定义复杂的滤波器图形,即具有任意数量的输入和/或输出的滤波器图形。 filter通过更改每个video帧的显示时间戳(PTS)来工作。要减慢video速度,必须使用大于1的乘数。例如,如果在时间戳1和2处显示两个连续帧,并且您想要减慢video速度,那些时间戳需要分别变为2和4。因此,我们必须将它们乘以2.0。

    您可以使用atemto音频滤波器加速或减慢音频。atempo滤波器仅限于使用介于0.5和2.0之间的值(因此它可以将其减慢到不低于原始速度的一半,并且速度不超过两倍输入)。要将音频减慢到其速度的一半,我们必须使用atempo值0.5。

    看看我在博客上写的这个 fffmpegvideo编辑器教程,其中包括创建慢动作video和本教程的完整代码。

    对我mMediaRecorder是提高mMediaRecorder的捕获率,如:

     mMediaRecorder.setVideoFrameRate(profile.videoFrameRate / 2); mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate / 2); mMediaRecorder.setCaptureRate(profile.videoFrameRate); 

    其中profile是使用QUALITY_HIGH设置的QUALITY_HIGH (由于我使用的是LG G2,我不能拥有更多,API 19)。

    在我的例子中, profile.videoFrameRate等于30。

    有关setCaptureRate更多信息,请setCaptureRate官方文件:

    设置video帧捕获率。 这可用于设置与录制video的播放速率不同的video帧捕获速率。 该方法还将记录模式设置为时间流逝。 在定时video录制中,仅录制video。 如果应用程序设置了时间间隔记录会话,则会忽略音频相关参数。

    video录制结果是初始捕获的两倍。 但是,设置捕获率会禁用音频。 在我的情况下,我的最大fps速率似乎是30fps,然后它以15fps回放。

    希望能帮助到你。

    试试这个代码。它会有所帮助……

     myCamera = getCameraInstance(); mediaRecorder = new MediaRecorder(); myCamera.unlock(); mediaRecorder.setCamera(myCamera); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); mediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());