我试图在Android4.4中修改屏幕记录的源代码,并降低捕获的帧速率,但不管我输入了什么值:
format->setFloat("frame-rate", 5);结果总是一样的(非常高的帧速率)。
编码器是否忽略此属性?如何控制帧速率?
发布于 2014-03-12 00:15:18
frame-rate值不会被忽略,但是它不会做您想做的事情。
frame-rate和i-frame-interval的组合决定了I-帧(也称为“同步帧”)在编码输出中出现的频率。在某些设备上,帧速率值也可能在达到bitrate目标方面发挥作用,但我不确定(例如,这个职位)。
MediaCodec编码器不删除帧。如果您想要降低帧速率,您必须通过发送更少的帧到它。
screenrecord命令不会以固定的帧速率对屏幕进行“示例”。相反,它从表面排序器(SurfaceFlinger)接收到的每一个帧都被发送到编码器,并带有适当的时间戳。如果屏幕记录每秒钟接收60帧,您将有60 per输出。如果它快速地连续接收10帧,然后5秒内没有任何帧,然后再多接收几个帧,那么输出文件中就会有这样的帧。
您可以修改screenrecord以删除帧,但您必须谨慎一点。如果你试图通过删除其他帧将最大帧率从60 not降低到30 not,那么在"frame0 - frame1 - long_pause - frame2“序列中,您将删除frame1,而视频将保留frame0,显示一个不完全的动画。因此,您需要缓冲一个帧,然后编码或删除帧N1,如果表示时间与帧N之间的差异是17 is。
棘手的部分是,screenrecord在其默认操作模式下,将帧定向到编码器,而不接触它们,所以您看到的只是编码输出。您不能任意丢弃单个编码数据帧,因此您确实希望从一开始就防止编码器看到它们。如果您使用屏幕记录v1.1源,您可以点击“覆盖”模式,用于--bugreport,让帧通过screenrecord到编码器的路上。
在某些方面,编写降低帧速率的后处理器可能更简单。我不知道解码和重新编码视频会损失多少质量。
更新:--关于如何粗略地这样做的示例,将其添加到processFrame_l()中
int64_t droppedFrames = 0;
+ {
+ static int flipflop = 0;
+ flipflop = 1 - flipflop;
+ if (flipflop) {
+ printf("dropping frame %lld\n", frameNumber);
+ return;
+ }
+ }
if (mLastFrameNumber > 0) {注意,这发生在updateTexImage()之后,它获取下一个缓冲区,并跳过对swapBuffers()的调用,后者将缓冲区提交给视频编码器。
https://stackoverflow.com/questions/22336604
复制相似问题