首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MediaCodec KEY_FRAME_RATE似乎被忽视了

MediaCodec KEY_FRAME_RATE似乎被忽视了
EN

Stack Overflow用户
提问于 2014-03-11 21:04:26
回答 1查看 8.3K关注 0票数 10

我试图在Android4.4中修改屏幕记录的源代码,并降低捕获的帧速率,但不管我输入了什么值:

代码语言:javascript
复制
format->setFloat("frame-rate", 5);

结果总是一样的(非常高的帧速率)。

编码器是否忽略此属性?如何控制帧速率?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-12 00:15:18

frame-rate值不会被忽略,但是它不会做您想做的事情。

frame-ratei-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()

代码语言:javascript
复制
     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()的调用,后者将缓冲区提交给视频编码器。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22336604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档