如何在libcamera库中设置帧率?(非命令行工具)
在libcamera中调整帧率的方法
这里讨论的是libcamera库本身,而非libcamera-hello这类命令行工具。按照libcamera官方教程编写的简单程序,无论选择何种像素格式/分辨率,帧率始终锁定30FPS,且文档中搜索"fps"无结果,以下是调整帧率的具体方法:
核心原理
libcamera通过流配置的frameDurationLimits参数控制帧率,帧率与帧时长的关系为:帧率 = 10^9 / 帧时长(纳秒),而非直接搜索"fps"关键词设置。
具体实现步骤
获取相机配置对象
从相机实例生成默认配置(以取景器流为例):std::unique_ptr<CameraConfiguration> config = camera->generateConfiguration({StreamRole::Viewfinder});设置帧率范围
针对目标流设置帧时长上下限,固定帧率则将上下限设为相同值:// 设置固定60FPS(帧时长=1e9/60≈16666667纳秒) config->at(0)->frameDurationLimits = {16666667, 16666667}; // 若需允许帧率波动,可设置范围(例:20-60FPS) // config->at(0)->frameDurationLimits = {16666667, 50000000};验证并应用配置
确保配置合法后应用到相机:if (config->validate() == CameraConfiguration::Invalid) { std::cerr << "无效的配置" << std::endl; return -1; } camera->configure(config.get());
注意事项
- 并非所有分辨率和像素格式都支持任意帧率,需参考相机传感器的硬件能力。可通过
camera->properties()接口获取传感器参数,或使用libcamera-still --list-cameras快速查看支持的参数范围。 - 需确保配置生效后再开始队列请求,否则帧率设置不会生效。
用户用于计算FPS的代码片段:
uint64_t prev_time = 0; static void requestComplete(Request* req) { if (req->status() == Request::RequestCancelled) return; clog << "on req complete" << endl; for (const auto& stream_and_buf: req->buffers()) { auto* stream = stream_and_buf.first; auto* buf = stream_and_buf.second; if (prev_time > 0) { auto delta_time = buf->metadata().timestamp - prev_time; clog << " stream " << std::hex << size_t(stream) << " buffer " << std::hex << size_t(buf) << " capture at " << std::dec << double(delta_time / 1000000) << endl; } prev_time = buf->metadata().timestamp; } req->reuse(Request::ReuseBuffers); camera->queueRequest(req); }
内容的提问来源于stack exchange,提问作者jiandingzhe
相关产品推荐
相关产品推荐

