14

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

我尝试使用

 mMediaRecorder.setVideoFrameRate(100);

但是如果我将值设置为 20 或更多,应用程序就会崩溃IllegalStateException

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

4

4 回答 4

13

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

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_LOW);

或者

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH);

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

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

公共静态最终 int QUALITY_HIGH_SPEED_LOW

对应于最低可用分辨率的高速(> = 100fps)质量水平。

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

于 2015-10-16T12:03:35.413 回答
3

虽然我无法在没有抖动的情况下捕捉平滑的慢动作视频,但我能够使用 ffmpeg 将捕捉到的视频转换为慢动作,结果非常流畅甚至。为了在 android 中集成 FFmpeg,我们可以使用预编译库,如ffmpeg-android .

根据所讨论的情况,我们可以从相机捕获视频,然后使用 ffmpeg 将其转换为慢动作。

要创建慢动作视频,我们可以使用以下命令 -

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

设置视频比特率

-r

设置帧率

-vcodec

设置视频编解码器

-filter_complex 过滤器图

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

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

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

于 2017-03-22T16:35:41.850 回答
0

对我有用的是提高以下捕获率mMediaRecorder

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

套装profile在哪里(我无法拥有更多,因为我使用的是 LG G2,API 19)。CamcorderProfileQUALITY_HIGH

在我的情况下,profile.videoFrameRate等于 30。

setCaptureRate有关官方文档的更多信息:

设置视频帧捕获率。这可用于设置与录制视频的播放速率不同的视频帧捕获速率。此方法还将录制模式设置为延时。在延时视频录制中,仅录制视频。如果应用程序设置了音频相关参数,则在延时录制会话开始时将忽略这些参数。

视频录制的结果是初始捕获的两倍。但是,设置捕获率会禁用音频。就我而言,我的最大 fps 速率似乎是 30fps,然后以 15fps 播放。

希望能帮助到你。

于 2017-01-12T10:45:57.213 回答
-2

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

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());
于 2015-10-16T10:52:55.877 回答