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);
profile
是 CamcorderProfile
与 QUALITY_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 捕捉慢动作视频的主要内容,如果未能解决你的问题,请参考以下文章