如何在我的应用中捕捉慢动作视频?
我尝试使用
mMediaRecorder.setVideoFrameRate(100);
但如果我使用IllegalStateException
将值设置为20或更多,则应用会崩溃。
我研究了很多。正常视频介于24到30 fps之间。要看慢动作视频,我们需要捕获100-120 fps,但设备不允许这样。但是我看到设备中的默认摄像头有一个选项还有很少的应用程序在Play商店允许创建慢动作视频。我也尝试设置更高的setCaptureRate()
,但是也可以拍摄普通模式视频。在少数地方提到慢动作电影可以是通过OpenCV/JavaCV
库完成,但我不明白如何使用这些库来捕获android中的慢动作视频?
答案 0 :(得分:11)
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的每个单独字段。
答案 1 :(得分:1)
虽然我无法在没有混蛋的情况下捕获平滑的慢动作视频,但我能够使用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 强>
输出链接标签用-map引用。
<强> -b:v 强>
设置视频比特率
<强> -r 强>
设置帧速率
<强> -vcodec 强>
设置视频编解码器
-filter_complex filtergraph
定义一个复杂的滤波器图形,即具有任意数量的输入和/或输出的滤波器图形。 过滤器通过更改每个视频帧的显示时间戳(PTS)来工作。要减慢视频速度,必须使用大于1的乘数。例如,如果在时间戳1和2处显示两个连续帧,并且您想要减慢视频速度,那些时间戳需要分别变成2和4。因此,我们必须将它们乘以2.0。
您可以使用atemto音频滤波器加速或减慢音频。atempo滤波器仅限于使用介于0.5和2.0之间的值(因此它可以将其降低至不低于原始速度的一半,并加速至否输入的两倍以上。。要将音频降低到其速度的一半,我们必须使用atempo值0.5。
答案 2 :(得分:0)
对我有用的是提高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回放。
希望它有所帮助。
答案 3 :(得分:-1)
试试这段代码。这会有所帮助......
position: absolute;
bottom: 0;
width: 100%;