Android 捕捉慢动作视频

Posted

技术标签:

【中文标题】Android 捕捉慢动作视频【英文标题】:Android capturing slow motion video 【发布时间】:2016-01-15 00:54:15 【问题描述】:

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

我尝试过使用

 mMediaRecorder.setVideoFrameRate(100);

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

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

【问题讨论】:

嗨,你成功了吗?否则您是否知道任何真正以 120 fps 捕获的 Android 应用程序?谢谢 @JugaliLakota 虽然我无法在没有抖动的情况下捕捉流畅的慢动作视频,但我能够使用 ffmpeg 将捕捉到的视频转换为慢动作,结果非常流畅甚至......看看我的回答 【参考方案1】:

From the source you provided (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) 设置这些配置文件而不指定任何其他编码参数将产生高速视频,而不是具有不同捕获和输出(回放)帧速率的慢动作视频。要录制慢动作视频,应用程序必须通过 setVideoFrameRate(int)适当地设置视频输出(回放)帧速率和比特率) 和 setVideoEncodingBitRate(int) 基于慢动作因子。如果应用程序打算使用 MediaCodec 编码器进行视频录制,则必须根据此 CamcorderProfile 类似地设置 MediaFormat 的每个单独字段。

【讨论】:

所以你想让我把-mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH_SPEED_HIGH)); 然后mMediaRecorder.setVideoFrameRate(100) ?????请检查你的答案..我不能把QUALITY_HIGH_SPEED_HIGH 里面mMediaRecorder.setVideoFrameRate() 不...我想让你做的是了解你向设备发出的命令。如果你使用setCaptureRate(a Number),那么通过增加这个值,你可以添加更多帧和“慢动作电影”......或者你可以使用CamcorderProfile类中已经准备好的东西......但是,你不应该做什么,只是继续尝试代码而不了解它们的作用。 好的..现在我尝试设置mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH_SPEED_720P));,然后设置mMediaRecorder.setVideoFrameRate(30);,但我的应用程序崩溃了......它不适用于setVideoFrameRate()中的更高值 再次阅读我的上一条评论。请注意使用的函数以及链接的文档。 QUALITY_HIGH_SPEED_LOW 不等于 2000 fps!!您知道 2000 fps 相机的成本是多少吗?别再固执了,阅读文档吧!接下来,您需要在支持“慢动作”的媒体播放器中播放录制的视频。您可以自己编写,也可以使用 VLC。【参考方案2】:

虽然我无法在没有抖动的情况下捕捉流畅的慢动作视频,但我能够使用 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

不询问就覆盖输出文件

-i

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

-地图

输出链接标签用 -map 引用。

-b:v

设置视频码率

-r

设置帧率

-vcodec

设置视频编解码器

-filter_complex filtergraph

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

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

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

【讨论】:

【参考方案3】:

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

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

profileCamcorderProfileQUALITY_HIGH 的集合(我无法拥有更多,因为我使用的是 LG G2,API 19)。

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

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

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

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

希望对你有帮助。

【讨论】:

【参考方案4】:

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

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());

【讨论】:

当这个答案与问题完全无关时,为什么有人支持这个答案?如果我发布一个非常好的布丁食谱的答案怎么办......这也会引起投票吗?

以上是关于Android 捕捉慢动作视频的主要内容,如果未能解决你的问题,请参考以下文章

Android:捕捉按下键盘输入按钮的动作

Android 捕捉视频并播放

sh 捕捉Android屏幕(视频/截图

基于视频的动作捕捉

使用 FFmpeg 进行 Android 相机捕捉

Motion camera 真人动作捕捉器