firefly-rk3399 开发记录2-摄像头控制

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).处理分辨率不要过大,不然处理很慢

猜你喜欢

转载自blog.csdn.net/huahuang1508/article/details/107791095
今日推荐