1.基本使用
买了firefly那个屏幕,接入HDMI和USB线之后,屏幕会有显示,用的是weston,也带正常触屏功能。尝试挂载NFS,结果发现失败,
bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program
看了下NFS的支持,内核是支持了,busybox没支持,重新编译一下buildroot,make busybox-menuconfig 把CONFIG_FEATURE_MOUNT_NFS=y这项选择上,然后保存make busybox-update-config,退出到根目录,重新编译文件系统,重新打包,结果发现还是不行。。。尴尬的一逼。。。,还是采用SCP吧,麻烦。或者在busybox官网下载busbox的二进制文件,https://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/busybox-armv7l,直接放在设备上,./busybox-armv7l mount -t nfs -o nolock xxxx,这样就可使用nfs挂载了,估计还是文件系统那里没有编译到导致nfs挂载不上。
2.初步使用
wayland,x11这些框架不是很了解,设备默认已经跑了weston,这是基于wayland的,可以看成一个桌面系统,当从后台运行桌面程序时,会再桌面上弹出程序应用窗口。
3.摄像头控制
走V4L2那套直接控制,显的太老套了,opencv,gstreamer,qt这些工具都已经很好的封装好了摄像头的处理,瑞芯微自身也提供了修改过的gstreamer。这里采用qt处理,控制摄像头,编码,rtsp,AI等功能。
4.摄像头部分代码
QSmartCamera::QSmartCamera(QWidget *parent)
: QWidget(parent)
, ui(new Ui::QSmartCamera),needHandle(true)
{
ui->setupUi(this);
qRegisterMetaType<QSharedPointer<QImage>>("QSharedPointer<QImage>");
m_method.reset(new QSmartMethod);
QThread *methodThread = new QThread(this);
connect(m_method.data(),&QSmartMethod::handleComplete,[this](){
needHandle = true;
});
connect(this,&QSmartCamera::handleFrame,m_method.data(),&QSmartMethod::needHandleImage);
m_method->moveToThread(methodThread);
methodThread->start();
QVencParm param;
param.width = 640;
param.height = 360;
param.code = MPP_VIDEO_CodingAVC;
param.fmt = MPP_FMT_YUV420P;
m_venc.reset(new QSmartVenc(param));
QThread *vencThread = new QThread(this);
m_venc->moveToThread(vencThread);
vencThread->start();
initCamera();
}
QSmartCamera::~QSmartCamera()
{
delete ui;
}
void QSmartCamera::initCamera(const QString &cam)
{
const QList<QCameraInfo> availableCameras = QCameraInfo::availableCameras();
if(!availableCameras.size())
return;
if(!cam.isEmpty())
{
for(const QCameraInfo &cameraInfo : availableCameras)
{
if(cam == cameraInfo.deviceName())
{
setCamera(cameraInfo);
}
}
}
else
{
setCamera(QCameraInfo::defaultCamera());
}
}
void QSmartCamera::setCamera(const QCameraInfo &cameraInfo)
{
m_camera.reset(new QCamera(cameraInfo));
m_camera->setViewfinder(ui->widgetShowImage);
m_probe.reset(new QVideoProbe(this));
m_probe->setSource(m_camera.data());
//connect(m_probe.data(),&QVideoProbe::videoFrameProbed,m_method.data(),&QSmartMethod::needHandleImage); //明明就是在两个线程中,怎么会影响显示的?
connect(m_probe.data(),&QVideoProbe::videoFrameProbed,[this](QVideoFrame f){
if(needHandle) //每次等那边处理完了再处理下一帧,不然会导致qt内部队列满,处理很慢
{
needHandle = false;
emit handleFrame(f);
}
});
connect(m_probe.data(),&QVideoProbe::videoFrameProbed,m_venc.data(),&QSmartVenc::needHandleImage);//编码数据
//这里设置格式的话,其实是自己在内部转换的,大分辨率的话会导致显示比较卡顿
QCameraViewfinderSettings settings;
settings.setResolution(640,360);
settings.setPixelFormat(QVideoFrame::Format_YUV420P); //默认是YUYV(YUV422),可以输出NV12,却不能输出NV21?
// settings.setMaximumFrameRate(25);
// settings.setMinimumFrameRate(15); //限制下帧率,避免处理不过来
m_camera->setViewfinderSettings(settings);
m_camera->start();
}
在这里也得到几个问题
a).摄像头能设置NV12且输出,却不能设置NV21,设置NV21的时候,输出的是420P
b).处理分辨率不要过大,不然处理很慢