草庐IT

Android Camera onPreviewFrame帧率不一致

coder 2023-11-23 原文

我正在尝试通过相机的 PreviewCall back(onPreviewFrame) 使用 MediaCodec 对每秒 30 帧的视频进行编码。我编码的视频总是播放得非常快(这是不希望的)。 因此,我尝试通过设置一个 int frameCount 变量来记住它的计数来检查进入我的相机预览的帧数。我期望的是每秒 30 帧,因为我将相机的预览设置为具有 30 fps 的预览(如下所示)。我得到的结果是不一样的。 我调用了 onPreviewFrame 回调 10 秒,我得到的 frameCount 数量只有大约 100 帧。这很糟糕,因为我期待 300 帧。我的相机参数设置正确吗?这是Android相机预览回调的限制吗?如果这是对 Android 相机预览回调的限制,那么是否有任何其他相机回调可以以每秒 30 帧的速度返回相机的图像数据(nv21,yuv,yv12)?

感谢您阅读并花时间提供帮助。如果有任何评论和意见,我将不胜感激。

这是一个使用相机的 onPreviewFrame 编码的视频示例:

http://www.youtube.com/watch?v=I1Eg2bvrHLM&feature=youtu.be

                Camera.Parameters parameters = mCamera.getParameters();
                parameters.setPreviewFormat(ImageFormat.NV21);
                parameters.setPictureSize(previewWidth,previewHeight);
                parameters.setPreviewSize(previewWidth, previewHeight);
//              parameters.setPreviewFpsRange(30000,30000);

                parameters.setPreviewFrameRate(30);
                mCamera.setParameters(parameters);

                mCamera.setPreviewCallback(previewCallback);
                mCamera.setPreviewDisplay(holder);

最佳答案

不,Android 相机不能保证稳定的帧率,尤其是在 30 FPS 时。例如,它可能会在低光照条件下选择更长的曝光时间。

但作为应用开发者,我们有一些方法可以让事情变得更糟。

首先,使用 setPreviewCallback() 而不是 setPreviewCallbackWithBuffer()。这可能会对垃圾收集器造成不必要的压力。

其次,如果 onPreviewFrame() 到达主 (UI) 线程,您会导致任何 UI 操作直接延迟相机帧的到达。要将 onPreviewFrame() 保持在单独的线程上,您应该在辅助 Looper 线程上open() 相机。在这里我详细解释了这是如何实现的: Best use of HandlerThread over other similar classes .

第三,检查处理时间是否小于20ms。

关于Android Camera onPreviewFrame帧率不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19919793/

有关Android Camera onPreviewFrame帧率不一致的更多相关文章

  1. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  2. ruby - Mongoid 3 中 Rails 模型的强一致性 - 2

    我希望特定模型的所有数据库交互都通过集群中的mongo主节点,因此我将模型设置为使用强一致性。classPhotoincludeMongoid::Documentwithconsistency::strongfield:number,type:Integer#let'ssayaphotonumberisuniqueinthedbvalidate:unique_numberend但这似乎不起作用,因为当我保存两张非常靠近的照片时,我仍然遇到验证错误。photo1#dbhasnumber=1forthisobjectphoto1.update_attributes(number:2)pho

  3. ruby - 为什么 Gemfile 语义版本控制运算符 (~>) 会产生与一个数字不一致的结果? - 2

    gemspec语义版本控制运算符~>(又名twiddle-wakka,又名pessimistic运算符)允许限制gem版本但允许进行一些升级。我经常看到它可以读作:"~>3.1"=>"Anyversion3.x,butatleast3.1""~>3.1.1"=>"Anyversion3.1.x,butatleast3.1.1"但是有了一个数字,这条规则就失效了:"~>3"=>"Anyversionx,butatleast3"*NOTTRUE!*"~>3"=>"Anyversion3.x"*True.Butwhy?*如果我想要“任何版本3.x”,我可以只使用“~>3.0”,这是一致的。就

  4. ruby - Ruby 中不一致的隐式哈希创建? - 2

    好的,所以我将我自己的DSL中的一些东西与Ruby进行了比较。他们都支持的一个结构是这个x=["key"=>"value"]知道数组和散列的区别,我会认为这是不合法的,但是在Ruby中的结果是[{"key"=>"value"}]这是为什么?有了这种语法,你为什么不能这样做x=("key"=>"value")为什么数组是隐式创建的哈希的特例? 最佳答案 另一个特殊情况是在函数调用中,考虑:deff(x)puts"OK:#{x.inspect}"endf("foo"=>"bar")=>OK:{"foo"=>"bar"}因此在某些情况下,

  5. ruby - 00.0 和 0.0 不一样吗? - 2

    我刚刚在编程语言ruby中发现了一个奇怪的问题,这不是什么大问题,但我就是不明白为什么会这样。如果有人知道我的问题的问题,我会很感兴趣。在ruby中你可以写成0或者00,没关系,结果是一样的。如果您运行0===00,您还会得到true,这意味着两个输入完全相同。0.0也等于0,所以逻辑上00.0也应该等于0.0但问题是,如果你尝试使用数字00.0那么你只会得到一个错误。例如,如果您运行:a=00.0你得到这个错误:syntaxerror,unexpectedtINTEGER当然我知道这是个小问题,但如前所述,我想了解为什么计算机不将00.0视为与0.0相同?

  6. ruby - if + else 和 if -> unless 不一致 - 2

    我今天在定义我解决的自定义RSpec匹配器时遇到了一个问题,但实际上看不出任何一种方法有效而另一种方法无效的原因,这是代码:方法1——if+else:RSpec::Matchers.define:have_success_messagedo|message|matchdo|page|ifmessage.nil?page.shouldhave_selector('div.alert.alert-success')elsepage.shouldhave_selector('div.alert.alert-success',text:message)endendend方法2--if后跟unl

  7. ruby-on-rails - 如何使用 Rails Faker gem 生成一致的数据? - 2

    为了用虚假数据填充我的Rails应用程序,我经常这样做:person=Person.create(:first_name=>Faker::Name.first_name,:last_name=>Faker::Name.last_name,:email=>Faker::Internet.email)这可能会产生一个像这样的人:Firstname:OliviaLastname:KuberaEmail:milan_nieklauson@bachmannjacob.net有没有办法生成更连贯的假数据,例如:Firstname:OliviaLastname:KuberaEmail:olivia_

  8. ruby - 在 String 子类上覆盖 =~ 方法会产生不一致 - 2

    我为String的子类覆盖了=~方法:classMyString重写的方法在某些情况下被正确调用:r=/abc/s=~r#=>"Overriddenmethod."s.send(:=~,r)#=>"Overriddenmethod."s.send(:=~,/abc/)#=>"Overriddenmethod."而在其他情况下它被绕过,而是调用String#=~:s=~/abc/#=>0s=~(/abc/)#=>0我可以在Ruby1.8.7、2.1.0上重现这些结果。有人知道为什么会这样吗?是错误吗? 最佳答案 在String#=~的

  9. php - Ruby 和 PHP HMAC 不一致 - 2

    我尝试在Ruby中创建一个HMAC,然后在PHP中验证它。ruby:require'openssl'message="A522EBF2-5083-484D-99D9-AA97CE49FC6C,1234567890,/api/comic/aWh62,GET"key="3D2143BD-6F86-449F-992C-65ADC97B968B"hash=OpenSSL::HMAC.hexdigest('sha256',message,key)phashPHP:对于Ruby,我得到:20e3f261b762e8371decdf6f42a5892b530254e666508e885c708c5b

  10. ruby - YARD 和 RDoc 不一样? - 2

    如果我错了请纠正我,是YARD与RDoc不同?它不是基于RDoc,而是完全重写?所以如果我使用YARD,我就不必为RDoc而烦恼,对吧? 最佳答案 简而言之:是的。(针对所有三个问题。)请注意,YARD在很大程度上与RDoc向后兼容,至少就标记而言是这样。(RDoc插件OTOH不适用于YARD。)因此,您实际上可以使用YARD来处理遗留RDoc文件。YARD主要是RDoc的适当超集。 关于ruby-YARD和RDoc不一样?,我们在StackOverflow上找到一个类似的问题:

随机推荐