Qt/C++摄像头采集/二维码解析/同时采集多路/图片传输/分辨率帧率可调/自动重连

一、前言

本地摄像头的采集可以有多种方式,一般本地摄像头会通过USB的方式连接,在嵌入式上可能大部分是CMOS之类的软带的接口,这些都统称本地摄像头,和网络摄像头最大区别就是一个是通过网络来通信,一个是直接本地通信。本地摄像机的采集可以用qcamera来做,但是qcamera类在很多平台没有实现,比如嵌入式linux系统上几乎是没有用的,所以更加推荐用兼容性跨平台最好的ffmpeg来做,在linux上当然也可以通过v4l2来实现,这个其实是整个linux系统中通用的USB摄像头采集的框架,无论是ffmpeg还是qcamera,在linux系统上底层其他都是用v4l2来实现的,所以如果在嵌入式板子受限于内存或者存储空间大小,用不了ffmpeg一堆库,这个时候就可以用最底层的v4l2来采集。

很多人的应用场景要求不止采集1路本地摄像头,可能有多路都需要同时采集,其实这个和程序没有太大关系,能够采集一路肯定就能多路,毕竟就是封装的一个类,直接new出来就行,要能采集多路最大的性能瓶颈在USB带宽,数据带宽,还有就是USB口子的供电足不足,供电不足,也只能采集1-2路,比如有些人用的是USB集线器,上面一排USB口子,由于供电不足,就算你插4个USB摄像头,也只能最多采集2路,带宽又限制了分辨率和帧率,比如一个普通PC机器可以同时采集4路640x480分辨率,但是由于带宽不足,无法同时采集4路1080P,尽管4个摄像头都支持1080p分辨率,所以这是个综合因素的叠加影响,遇到问题慢慢查。

这个摄像头综合应用,陆陆续续完善了很多年,最开始是v4l2版本,只能用在嵌入式linux上,而后从Qt5开始集成了qcamera类,所以有用qcamera来做了一个版本,现在Qt6在多媒体框架有了巨大的性能提升,又用Qt6的qcamera做了个版本,为什么不通用了?因为Qt6的多媒体框架做了巨大更新调整,完全不兼容之前的类。在做视频组件的实现用ffmpeg采集本地摄像头也实现了,而且做的比较完善,所以后面单独提炼出来做了ffmpeg的版本,最后测试下来发现ffmpeg是最通用的,在哪里都能正常采集。

做二维码采集这个功能,用的是zxing类,最初的做法是将采集的图片发给zxing解析,实际过程发现大图片解析很慢,比如1080P图片大概1s只能解析3张,这个速度看起来就慢了点,如果是2K的分辨率呢。后面经过一些真实场景应用,包括菜鸟驿站里面带的扫描识别,发现都有个放大区域,用户可以设置一个关心的矩形区域,要放在这个矩形区域内,能够最大最快的识别,这是个不错的策略,在ffmpeg中通过设置crop裁剪区域就可以直接将对应内容放大显示,然后采集的实时画面可以是原视频,发送给zxing解析的就是裁剪后的画面,这样速度大大提升。之前大图就算二维码在里面,由于在整个图片中的占比区域太小,也可能解析失败,自动调整后裁剪区域,性能大幅度提升,完美解决。

二、效果图

在这里插入图片描述

三、体验地址

  1. 国内站点:https://gitee.com/feiyangqingyun
  2. 国际站点:https://github.com/feiyangqingyun
  3. 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_camera。

四、相关代码

#include "frmzxing.h"
#include "frmmain.h"
#include "ui_frmzxing.h"
#include "qthelper.h"
#include "camerahelper.h"
#include "widgethelper.h"
#include "zxingthread.h"frmZxing::frmZxing(QWidget *parent) : QWidget(parent), ui(new Ui::frmZxing)
{ui->setupUi(this);this->initForm();this->initConfig();
}frmZxing::~frmZxing()
{delete ui;
}void frmZxing::initForm()
{ui->frame->setFixedWidth(AppData::RightWidth);//关联信号槽connect(ui->cameraWidget, SIGNAL(sig_receivePlayStart(int)), this, SLOT(receivePlayStart(int)));connect(ui->cameraWidget, SIGNAL(sig_receivePoint(int, QPoint)), this, SLOT(receivePoint(int, QPoint)));//实例化解析类并启动线程zxing = new ZXingThread(this);connect(zxing, SIGNAL(receiveResult(QString, QString, int)), this, SLOT(receiveResult(QString, QString, int)));zxing->start();//启动定时器截图timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(on_btnSnap_clicked()));if (AppConfig::Zxing_Interval > 0) {timer->start(AppConfig::Zxing_Interval);}
}void frmZxing::initConfig()
{CameraHelper::loadCameraCore(ui->cboxCameraCore, AppConfig::Zxing_CameraCore);connect(ui->cboxCameraCore, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));this->cameraDeviceChanged();connect(ui->cboxCameraName->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));CameraHelper::loadVideoSize(ui->cboxVideoSize);ui->cboxVideoSize->lineEdit()->setText(AppConfig::Zxing_VideoSize);connect(ui->cboxVideoSize->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));CameraHelper::loadFrameRate(ui->cboxFrameRate);ui->cboxFrameRate->lineEdit()->setText(QString::number(AppConfig::Zxing_FrameRate));connect(ui->cboxFrameRate->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));ui->cboxVideoMode->setCurrentIndex(AppConfig::Zxing_VideoMode);connect(ui->cboxVideoMode, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));zxing->setDecoder(AppConfig::Zxing_DecoderFormat);ui->cboxDecoderFormat->addItem("仅二维码");ui->cboxDecoderFormat->addItem("一维二维");ui->cboxDecoderFormat->addItem("所有格式");ui->cboxDecoderFormat->setCurrentIndex(AppConfig::Zxing_DecoderFormat);connect(ui->cboxDecoderFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));ui->cboxInterval->addItem("暂停");ui->cboxInterval->addItem("300");ui->cboxInterval->addItem("500");ui->cboxInterval->addItem("800");ui->cboxInterval->addItem("1000");int index = ui->cboxInterval->findText(QString::number(AppConfig::Zxing_Interval));ui->cboxInterval->setCurrentIndex(index < 0 ? 0 : index);connect(ui->cboxInterval, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));ui->txtTopLeft->setText(AppConfig::Zxing_TopLeft);connect(ui->txtTopLeft, SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));ui->txtBottomRight->setText(AppConfig::Zxing_BottomRight);connect(ui->txtBottomRight, SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));
}void frmZxing::saveConfig()
{//内核变了需要重新搜索设备int cameraCore = ui->cboxCameraCore->itemData(ui->cboxCameraCore->currentIndex()).toInt();if (AppConfig::Zxing_CameraCore != cameraCore) {AppConfig::Zxing_CameraCore = cameraCore;this->cameraDeviceChanged();}//不为空才需要改变QString cameraName = ui->cboxCameraName->currentText();if (!cameraName.isEmpty()) {AppConfig::Zxing_CameraName = cameraName;}AppConfig::Zxing_VideoSize = ui->cboxVideoSize->currentText();AppConfig::Zxing_FrameRate = ui->cboxFrameRate->currentText().toInt();AppConfig::Zxing_VideoMode = ui->cboxVideoMode->currentIndex();//变了立即重新设置int decoderFormat = ui->cboxDecoderFormat->currentIndex();if (AppConfig::Zxing_DecoderFormat != decoderFormat) {AppConfig::Zxing_DecoderFormat = decoderFormat;zxing->setDecoder(AppConfig::Zxing_DecoderFormat);}int interval = ui->cboxInterval->currentText().toInt();if (AppConfig::Zxing_Interval != interval) {AppConfig::Zxing_Interval = interval;if (interval > 0) {timer->start(interval);} else {timer->stop();}}AppConfig::Zxing_TopLeft = ui->txtTopLeft->text().trimmed();AppConfig::Zxing_BottomRight = ui->txtBottomRight->text().trimmed();AppConfig::writeConfig();
}void frmZxing::initPara()
{//设置显示窗体参数WidgetPara widgetPara = ui->cameraWidget->getWidgetPara();widgetPara.borderWidth = 1;widgetPara.videoMode = (VideoMode)AppConfig::Zxing_VideoMode;ui->cameraWidget->setWidgetPara(widgetPara);//设置采集线程参数CameraPara cameraPara = ui->cameraWidget->getCameraPara();cameraPara.cameraCore = (CameraCore)AppConfig::Zxing_CameraCore;cameraPara.cameraName = AppConfig::Zxing_CameraName;cameraPara.videoSize = AppConfig::Zxing_VideoSize;cameraPara.frameRate = AppConfig::Zxing_FrameRate;ui->cameraWidget->setCameraPara(cameraPara);
}void frmZxing::append(int type, const QString &data, bool clear)
{static int maxCount = 50;static int currentCount = 0;QtHelper::appendMsg(ui->txtMain, type, data, maxCount, currentCount, clear);ui->txtMain->moveCursor(QTextCursor::End);
}void frmZxing::createImage(const QString &text)
{if (!text.isEmpty()) {QImage image = zxing->encodeData(text, QSize(250, 250));ui->labResult->setImage(image, true);}
}void frmZxing::cameraDeviceChanged()
{frmMain::getCameraInfo((CameraCore)AppConfig::Zxing_CameraCore);CameraHelper::loadCameraName(ui->cboxCameraName, AppConfig::Zxing_CameraName);
}void frmZxing::snapImage(const QImage &image, const QString &snapName)
{QImage img = image;if (snapName != "file") {//有左上右下坐标说明需要裁减int w = image.width();int h = image.height();if (!AppConfig::Zxing_TopLeft.isEmpty() && !AppConfig::Zxing_BottomRight.isEmpty()) {QRect rect = WidgetHelper::getRect(AppConfig::Zxing_TopLeft, AppConfig::Zxing_BottomRight);img = img.copy(rect);QString msg = QString("执行裁剪(原分辨率: %1 x %2  新分辨率: %3 x %4)").arg(w).arg(h).arg(img.width()).arg(img.height());append(4, msg);img.save("f:/1.jpg", "jpg");}//防止图片过大导致解析很慢static int maxWidth = 1280;static int maxHeight = 720;w = img.width();h = img.height();if (w > maxWidth || h > maxHeight) {img = img.scaled(QSize(maxWidth, maxHeight), Qt::KeepAspectRatio);QString msg = QString("执行缩放(原分辨率: %1 x %2  新分辨率: %3 x %4)").arg(w).arg(h).arg(maxWidth).arg(maxHeight);append(4, msg);}}//添加到线程中解析zxing->append("", img);//显示图片ui->labImage->setImage(img, true);
}void frmZxing::receiveResult(const QString &flag, const QString &text, int time)
{append(2, QString("(用时: %1 毫秒) 结果: %2").arg(time).arg(text));ui->txtResult->setText(text);//重新生成新的二维码图片createImage(text);
}void frmZxing::receivePlayStart(int time)
{//如果存在裁剪区域则设置图形if (!AppConfig::Zxing_TopLeft.isEmpty() && !AppConfig::Zxing_BottomRight.isEmpty()) {GraphInfo graph;graph.rect = WidgetHelper::getRect(AppConfig::Zxing_TopLeft, AppConfig::Zxing_BottomRight);graph.borderWidth = WidgetHelper::getBorderWidth(ui->cameraWidget);ui->cameraWidget->setGraph(graph);}
}void frmZxing::receivePoint(int type, const QPoint &point)
{QString text = QString("%1, %2").arg(point.x()).arg(point.y());if (ui->rbtnTopLeft->isChecked()) {ui->txtTopLeft->setText(text);} else {ui->txtBottomRight->setText(text);}
}void frmZxing::on_btnPlay_clicked()
{this->initPara();if (!ui->cameraWidget->init()) {return;}//关联采集线程信号槽CameraThread *cameraThread = ui->cameraWidget->getCameraThread();connect(cameraThread, SIGNAL(cameraDeviceChanged()), this, SLOT(cameraDeviceChanged()));connect(cameraThread, SIGNAL(snapImage(QImage, QString)), this, SLOT(snapImage(QImage, QString)));ui->cameraWidget->play();ui->widget->setEnabled(false);
}void frmZxing::on_btnStop_clicked()
{ui->cameraWidget->stop();ui->widget->setEnabled(true);
}void frmZxing::on_btnPause_clicked()
{ui->cameraWidget->pause();
}void frmZxing::on_btnNext_clicked()
{ui->cameraWidget->next();
}void frmZxing::on_btnSnap_clicked()
{CameraThread *thread = ui->cameraWidget->getCameraThread();if (thread && thread->getIsOk()) {append(4, "执行截图并解析二维码");ui->cameraWidget->snap();}
}void frmZxing::on_btnFile_clicked()
{QString fileName = QFileDialog::getOpenFileName(this, "打开", "", "*.jpg *.png");if (!fileName.isEmpty()) {QImage image(fileName);snapImage(image, "file");}
}void frmZxing::on_btnCreate_clicked()
{createImage(ui->txtResult->text());
}

五、功能特点

  1. 同时支持 qcamera、ffmpeg、v4l2 三种内核解析本地摄像头。
  2. 提供函数 findCamera 自动搜索环境中的所有本地摄像头设备,搜索结果信号发出。
  3. 支持自动搜索和指定设备两种模式,自动搜索模式下会将搜索到的第一个设备作为当前设备打开。
  4. 支持同时打开多路设备,亲测4路,受限于具体的环境比如带宽。
  5. 支持自动重连,默认开启,失败后会自动重新搜索和尝试打开。
  6. ffmpeg方案、v4l2方案都支持回调模式(采集后转成QImage绘制)和句柄模式(采集后YUV数据GPU绘制,性能高)。
  7. 视频显示位置自动调整算法,当视频分辨率超过显示控件大小则等比例缩放居中显示,不超过则原尺寸居中显示,还可设置拉伸填充显示。(自动调整、等比例缩放、拉伸填充)。
  8. 可选不同的分辨率来打开摄像头,支持 160x120、320x240、640x480、800x600、1280x720、1280x960、1920x1080 等。
  9. 可选不同的帧率来打开摄像头,支持 0(采用默认值)、5、、10、15、20、25、30 等。
  10. 支持抓拍截图,传入文件名则自动保存截图文件,不传入则将图片数据QImage信号发出。
  11. 提供函数接口 开始播放play、停止播放stop、暂停播放pause、继续播放next。
  12. 支持动态热插拔加载,包括自动读取所有设备名称到下拉框。
  13. 支持录像文件存储,提供开始录像recordStart、暂停录像recordPause、停止录像recordStop 等函数。
  14. 提供二维码示例,自动采集画面识别二维码,支持自动将识别到的二维码重新生成大图。
  15. 二维码识别支持设置热点区域,对该区域内的图片进行裁切并识别,在大分辨率图像采集的时候非常有用,提升速度和效率。
  16. 支持选择图片文件解析二维码,手动输入文本内容生成二维码。
  17. 提供图片传输示例,自动将打开的摄像头视频实时传输出去,服务器端接收后解析显示。此方案可以作为将本地的摄像头实时画面远程传输,比如嵌入式板子上的摄像头画面传输到PC端显示。
  18. 支持等比例拉伸填充显示,画面宽高小于显示控件的宽高则以原视频大小为准,大于则按照显示控件的尺寸等比例缩放居中。
  19. 视频控件悬浮条自带开始和停止录像切换、声音静音切换、抓拍截图、关闭视频等功能。
  20. 音频组件支持声音波形值数据解析,可以根据该值绘制波形曲线和柱状声音条,默认提供了声音振幅信号。
  21. 代码框架和结构优化到极致,性能彪悍,持续迭代更新升级。
  22. 源码支持Qt4、Qt5、Qt6,兼容所有版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/235434.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Camunda Rest API

客户端像调用本地方法一样调用引擎中的接口。 https://docs.camunda.org/manual/7.17/reference/rest/ 一&#xff1a;pom.xml <dependency><groupId>org.camunda.community.rest</groupId><artifactId>camunda-platform-7-rest-client-spring-boot-…

通义千问Qwen-72B-Chat基于PAI的低代码微调部署实践

作者&#xff1a;熊兮、求伯、一耘 引言 通义千问-72B&#xff08;Qwen-72B&#xff09;是阿里云研发的通义千问大模型系列的720亿参数规模模型。Qwen-72B的预训练数据类型多样、覆盖广泛&#xff0c;包括大量网络文本、专业书籍、代码等。Qwen-72B-Chat是在Qwen-72B的基础上…

一起玩儿物联网人工智能小车(ESP32)——24. 变量与函数(二)

摘要&#xff1a;本文介绍变量和函数的基本知识 在前面一篇中了解了变量&#xff0c;接着就来了解一下函数。函数是程序中的一个关键概念&#xff0c;它可以简化程序的编写&#xff0c;使代码更加模块化、可复用&#xff0c;提高程序的可读性。其实在之前已经多次遇到函数了&am…

Android AAudio

文章目录 基本概念启用流程基本流程HAL层对接数据流计时模型调试 基本概念 AAudio 是 Android 8.0 版本中引入的一种音频 API。 AAudio 提供了一个低延迟数据路径。在 EXCLUSIVE 模式下&#xff0c;使用该功能可将客户端应用代码直接写入与 ALSA 驱动程序共享的内存映射缓冲区…

Thingsbaord采用redis缓存(自用)

在CentOS系统上&#xff0c;您可以通过以下步骤使用yum安装Redis&#xff1a; 添加EPEL仓库&#xff1a; 首先&#xff0c;需要添加EPEL&#xff08;Extra Packages for Enterprise Linux&#xff09;仓库&#xff0c;因为Redis可能不在默认的CentOS仓库中。使用以下命令添加EP…

iOS 应用上架指南:资料填写及提交审核

摘要 本文提供了iOS新站上架资料填写及提交审核的详细指南&#xff0c;包括创建应用、资料填写-综合、资料填写-IOS App和提交审核等步骤。通过本指南&#xff0c;您将了解到如何填写正确的资料&#xff0c;并顺利通过苹果公司的审核。 引言 在开发iOS应用后&#xff0c;将其…

在IntelliJ IDEA上使用通义灵码(TONGYI Lingma)

参考链接&#xff1a; 通义灵码产品介绍_智能编码助手_AI编程_云效(Apsara Devops)-阿里云帮助中心 【IDEA如何使用通义灵码&#xff1f;】_idea 通义灵码-CSDN博客 1. 简介 1.1 定义 通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提…

【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax类图

【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax概述 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax快速入门 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax类图 【大数据进阶第三阶段之Datax学习笔记】使用…

密码学(一)

文章目录 前言一、Cryptographic Primitives二、Cryptographic Keys2.1 Symmetric key cryptography2.2 asymmetric key cryptography 三、Confidentiality3.1 Symmetric key encryption algorithms3.2 asymmetric key block ciphers3.3 其他 四、Integrity4.1 secure hashing …

【安卓模拟器】雷电模拟器9 v9.0.64 绿色版(免安装版,一键绿化)

下载地址 极核GetShell 简介 雷电模拟器9是一款安卓模拟器&#xff0c;支持安卓9版本。安卓模拟器除了能够运行游戏娱乐&#xff0c;对于渗透测试&移动安全测试也有举足轻重的作用。 软件截图 绿化教程 视频教程 下载地址提供了视频绿化教程&#xff0c;有需要的可以…

微信小程序Burp抓包

方法有很多&#xff0c;工具也各有差异&#xff0c;主要是学代理流量的思路 Burp流量代理工具小程序 一、Burp证书导入 1、开启代理 开启浏览器的代理&#xff0c;火狐推荐FoxyProxy&#xff0c;Google推荐SwitchyOmega&#xff0c;设置代理为127.0.0.1:8080。 2、下载证书…

GSEQ行为序列分析软件学习汇总

0、问题描述&#xff1a; 1、GSEQ软件是做什么的&#xff1f;2、GSEQ软件如何使用&#xff1f;2、GSEQ软件前期需要在“记事本”中编写“程式码”需要将所有行为数据编码之后&#xff0c;将编码行为序列粘贴到GSEQ软件中去&#xff0c;如果数据量很大&#xff0c;这个过程就非…

构建中国人自己的私人GPT

创作不易&#xff0c;请大家多鼓励支持。 在现实生活中&#xff0c;很多人的资料是不愿意公布在互联网上的&#xff0c;但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢&#xff1f;于是我们构建自己或公司的私人GPT变得非常重要。 先看效果 一、…

C语言之扫雷小游戏的实现【含递归展开】

文章目录 前言一、扫雷游戏代码设计思路二、设计扫雷代码1.创建菜单函数2.实现9x9扫雷3.初始化棋盘4.打印棋盘5.随机布置雷的位置6.排查雷的信息7.递归展开 三、源码1.新建一个test.c源文件2.新建一个game.c源文件3.创建一个game.h头文件 前言 扫雷游戏是1992年发行的一款大众类…

Salesforce生态系统2024年就业趋势

对于Salesforce专业人士来说&#xff0c;新一年的开始都是激动人心的。但2023年仍存在显著挑战&#xff0c;经济技术低迷导致裁员&#xff0c;以及Salesforce生态系统增长放缓等等&#xff0c;这些挑战将延续到2024年。 回顾2023年 2023年&#xff0c;Salesforce生态系统以及…

ant design vue Tree组件叶子节点横向排列

antdesignvue的树形组件要实现组件叶子节点横向排列有点坑&#xff0c;没有 配置属性&#xff0c;需要自己想办法。 要实现的效果 看tree组件的dom结构&#xff0c;父元素flex竖向布局&#xff0c;子项不论节点层级都在同一层&#xff01;&#xff01;&#xff01; 难点在于想…

windows下使用PowerShell切割大数据文件

测试文件为24.4G文件 打开PowerShell窗口&#xff0c;使用以下命令 $filePath 为指向文件路径 $outputPath 输出到指定文件夹 $chunkSize 单个文件控制切割大小 将命令修改完后&#xff0c;直接粘贴到powershell窗口&#xff0c;点击回车即可进行切割 $filePath "D:\…

使用metricbeat 监控多ES集群

背景 ES 本身自带 监控&#xff0c;属于xpack 中的内容&#xff0c;为商业版&#xff0c;需要收费&#xff1b; 并且 monitor 功能必须要在security开启后才能使用&#xff0c;还有就是集群监控自己&#xff0c;将采集到的性能数据保存到本集群&#xff0c;这是一个比较差的设…

二游玩家“清算”厂商

​很少有哪款游戏&#xff0c;能像《少女前线2&#xff1a;追放》一样&#xff0c;在还没上线时就持续不断地遭遇这么长的节奏。 从四测开始&#xff0c;游戏就被爆出“删除硬盘”事件以及剧情上的巨大负面争议。 然后&#xff0c;在官方连续三次公开致歉后&#xff0c;于游戏…

一个Java程序员解决一个BUG的艰难历程

问题背景 昨天&#xff0c;项目经理半夜给我发了一个BUG&#xff0c;说是在集成平台上面&#xff0c;我们的应用无法跳转&#xff0c;让我今天早上看看。应用是做了单点登录&#xff0c;登录用户从第三平台通过接口获取信息的&#xff0c;我猜测大概率是用户获取不到&#xff…