在arm上利用Qt采集视频图像,能够保存采集的视频图像

我使用的是usb免驱摄像头,现在已经实现实时显示图像,并能够拍照保存,但无法实现保存视频。

以下是本程序的相关代码

main.cpp

#include "camera.h"
#include <QApplication>

int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    camera w;
    w.show();

    return a.exec();
}

camera.cpp

#include "camera.h"
#include "ui_camera.h"
#include <QDate>
#include <QTime>

void yuv422to420p(char *yuv422buf, char *yuv420pbuf,
                int width, int height)
{
        char *src, *dest, *dest2;
        int i, j;

        src = yuv422buf;
        dest = yuv420pbuf;
        for (i = 0; i < width * height * 2; i++) {
                if (i % 2 != 0) {
                        continue;
                }
                *dest++ = *(src + i);
        }

        src = yuv422buf;
        dest = yuv420pbuf + width * height;
        dest2 = dest + (width * height) / 4;
        for (i = 0; i < height; i += 2) {
                for (j = 1; j < width * 2; j += 4) {
                        *dest++ = *(src + i * width * 2 + j);
                        *dest2++ = *(src + i * width * 2 + j + 2);
                }
        }
}

/* yuv格式转换为rgb格式的算法处理函数 */
int convert_yuv_to_rgb_pixel(int y, int u, int v)
{
        unsigned int pixel32 = 0;
        unsigned char *pixel = (unsigned char *)&pixel32;
        int r, g, b;
        r = y + (1.370705 * (v-128));
        g = y - (0.698001 * (v-128)) - (0.337633 * (u-128));
        b = y + (1.732446 * (u-128));
        if(r > 255) r = 255;
        if(g > 255) g = 255;
        if(b > 255) b = 255;
        if(r < 0) r = 0;
        if(g < 0) g = 0;
        if(b < 0) b = 0;
        pixel[0] = r ;
        pixel[1] = g ;
        pixel[2] = b ;

        return pixel32;
}

/* yuv格式转换为rgb格式 */
int convert_yuv_to_rgb_buffer(unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height)
{
         unsigned int in, out = 0;
         unsigned int pixel_16;
         unsigned char pixel_24[3];
         unsigned int pixel32;
         int y0, u, y1, v;

         for(in = 0; in < width * height * 2; in += 4)
         {
                 pixel_16 =
                                 yuv[in + 3] << 24 |
                                 yuv[in + 2] << 16 |
                                 yuv[in + 1] <<  8 |
                                 yuv[in + 0];
                 y0 = (pixel_16 & 0x000000ff);
                 u  = (pixel_16 & 0x0000ff00) >>  8;
                 y1 = (pixel_16 & 0x00ff0000) >> 16;
                 v  = (pixel_16 & 0xff000000) >> 24;
                 pixel32 = convert_yuv_to_rgb_pixel(y0, u, v);
                 pixel_24[0] = (pixel32 & 0x000000ff);
                 pixel_24[1] = (pixel32 & 0x0000ff00) >> 8;
                 pixel_24[2] = (pixel32 & 0x00ff0000) >> 16;
                 rgb[out++] = pixel_24[0];
                 rgb[out++] = pixel_24[1];
                 rgb[out++] = pixel_24[2];
                 pixel32 = convert_yuv_to_rgb_pixel(y1, u, v);
                 pixel_24[0] = (pixel32 & 0x000000ff);
                 pixel_24[1] = (pixel32 & 0x0000ff00) >> 8;
                 pixel_24[2] = (pixel32 & 0x00ff0000) >> 16;
                 rgb[out++] = pixel_24[0];
                 rgb[out++] = pixel_24[1];
                 rgb[out++] = pixel_24[2];
         }
         return 0;
}

int camera::camera_init()
{
    int ret=0,i=0,count=0;
    struct v4l2_capability cap;             //视频设备的功能,对应命令VIDIOC_QUERYCAP
    struct v4l2_fmtdesc fmtdesc;            //视频格式描述符类型
    struct v4l2_format format;              //帧的格式,如宽度,高度等,对应命令VIDIOC_G_FMT、VIDIOC_S_FMT等
    struct v4l2_requestbuffers reqbuf;      //向驱动申请帧缓冲请求,包含申请的个数,对应命令VIDIOC_REQBUFS
    struct v4l2_buffer buf;                 //驱动中的一帧图像缓存,对应命令VIDIOC_QUERYBUF

    fmtdesc.index = 0;
    fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

    format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;      //传输流类型
    ret = ::ioctl(fd, VIDIOC_G_FMT, &format);       //'VIDIOC_G_FMT'——读取当前驱动的视频捕获格式
    if(ret < 0){
        perror("VIDIOC_G_FMT");
        exit(1);
    }

    printf("width:%d\n", format.fmt.pix.width);
    printf("height:%d\n", format.fmt.pix.height);
    printf("pixelformat:%x\n", format.fmt.pix.pixelformat);
    printf("field:%x\n", format.fmt.pix.field);
    printf("bytesperline:%d\n", format.fmt.pix.bytesperline);
    printf("sizeimage:%d\n", format.fmt.pix.sizeimage);
    printf("colorspace:%d\n", format.fmt.pix.colorspace);
    format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    format.fmt.pix.width = 640;
    format.fmt.pix.height = 480;
    format.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;

    ret = ::ioctl(fd, VIDIOC_S_FMT, &format);
    if(ret < 0){
        fprintf(stderr, "Not support jepg");
        perror("VIDIOC_S_FMT");
        exit(1);
    }
    reqbuf.count = 3;
    reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    reqbuf.memory = V4L2_MEMORY_MMAP;
    ret = ::ioctl(fd, VIDIOC_REQBUFS, &reqbuf);
    if(ret < 0){
        perror("VIDIOC_REQBUFS");
        exit(1);
    }

    bufinf = (struct bufinfor *)calloc(reqbuf.count, sizeof(struct bufinfor));
    if(!bufinf){
        perror("calloc");
        exit(1);
    }
    for(count = 0; count < reqbuf.count; count++){
        buf.index = count;
        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        buf.memory = V4L2_MEMORY_MMAP;
        ret = ::ioctl(fd, VIDIOC_QUERYBUF, &buf);
        if(ret < 0){
            perror("VIDIOC_REQBUFS");
            exit(1);
        }
        bufinf[buf.index].length = buf.length;
        bufinf[buf.index].start = mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset);
        if(!(bufinf[buf.index].start)){
            perror("mmap");
            exit(1);
        }
    }
    for(i = 0; i < reqbuf.count; i++){
        buf.index = i;
        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        buf.memory = V4L2_MEMORY_MMAP;
        ret = ::ioctl(fd, VIDIOC_QBUF, &buf);
        if(ret < 0){
            perror("VIDIOC_QBUF");
            exit(1);
        }
    }
    enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    ret = ::ioctl(fd, VIDIOC_STREAMON, &type);
    if(ret < 0){
        perror("VIDIOC_STREAMON");
        exit(1);
    }
    return 0;
}

camera::camera(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::camera)
{

    char devname[32];
    int i=0;
    int ret;
    struct v4l2_capability cap;
    ui->setupUi(this);
    while(i < 100)
    {
        sprintf(devname,"/dev/video%d",i++);

        fd = ::open(devname,O_RDWR);
        if(fd < 0)
        {
            continue;
        }

        ui->comboBox->addItem(QWidget::tr(devname));
        ::close(fd);
    }
}

camera::~camera()
{
    free(bufinf);

    ::close(fd);
    delete ui;
}
void camera::moveEvent(QMoveEvent *)
{
    this->move(QPoint(0,0));
}
void camera::resizeEvent(QResizeEvent *)
{
    this->showMaximized();
}


void camera::on_pushButton_2_clicked()
{
    take_photo();
}

static bool take = 0;

void camera::show_()
{
    int ret;
    unsigned char *rgb=new unsigned char [640 * 480 *3];
    struct v4l2_buffer buf;

    fd_set readset;
    FD_ZERO(&readset);
    FD_SET(fd, &readset);
    ret = select(fd + 1, &readset, NULL, NULL, NULL);
    if(ret < 0){
        perror("select");
        exit(1);
    }

    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    buf.memory = V4L2_MEMORY_MMAP;
    ret = ioctl(fd, VIDIOC_DQBUF, &buf);
    if(ret < 0){
        perror("VIDIOC_DQBUF");
        exit(1);
    }

    convert_yuv_to_rgb_buffer((unsigned char *)bufinf[buf.index].start,rgb,640,480);
    ret = ioctl(fd, VIDIOC_QBUF, &buf);
    if(ret < 0){
        perror("VIDIOC_QBUF");
        exit(1);
    }

    QImage *mage = new QImage(rgb,640,480,QImage::Format_RGB888);
    if (take == 1)
    {
        mage->save(tr("%1.jpg").arg("/mnt/Photo/Photo_2019.04.15/IMG" + QDate::currentDate().toString("yyyyMMdd") + QTime::currentTime().toString("hhmmss")),"JPG");
//      mage->save(tr("%1.jpg").arg("/home/root/Photo/IMG" + QDate::currentDate().toString("yyyyMMdd") + QTime::currentTime().toString("hhmmss")),"JPG");
        take = 0;
    }
    QImage resultimg=mage->scaled(ui->label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
    ui->label->setPixmap(QPixmap::fromImage(resultimg));
    delete mage;
    delete rgb;
}

void camera::take_photo()
{
    take = 1;
}

void camera::on_comboBox_activated(const QString &arg1)
{
    QString text=ui->comboBox->currentText();
    QByteArray devtext=text.toLatin1();
    char *devname=devtext.data();
    int ret;
    struct v4l2_capability cap;

    fd = ::open(devname, O_RDWR);

    if(fd < 0)
    {
        perror("open error");
    }
    camera::camera_init();
    QTimer *timer;
    timer=new QTimer();
    timer->setInterval(10);
    connect(timer,SIGNAL(timeout()),this,SLOT(show_()));
    timer->start(10);
    camera_flag=1;
}

void camera::on_pushButton_clicked()
{
    close();
}

camera.h

#ifndef CAMERA_H
#define CAMERA_H

#include <QMainWindow>
#include <QTimer>
#include <QImage>
#include <QPixmap>
#include <QDebug>
#include <QStringList>
#include <QByteArray>
#include <QComboBox>

extern "C"{
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <string.h>
#include <time.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <jpeglib.h>
#include <linux/videodev2.h>
}

namespace Ui {
class camera;
}

struct bufinfor{
    void *start;
    unsigned int length;
};

class camera : public QMainWindow
{
    Q_OBJECT

public:
    explicit camera(QWidget *parent = 0);

    ~camera();

protected:
    void moveEvent(QMoveEvent *);
    void resizeEvent(QResizeEvent *);

private slots:
    int camera_init(void);
    void on_pushButton_2_clicked();
    void show_();
    void take_photo();
    void on_comboBox_activated(const QString &arg1);

    void on_pushButton_clicked();

private:
    Ui::camera *ui;
    int fd;
    int camera_flag;
    struct bufinfor *bufinf;
};

#endif // CAMERA_H

usbcamera.pro

#-------------------------------------------------
#
# Project created by QtCreator 2019-08-02T09:08:26
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = usbcamera
TEMPLATE = app
LIBS += -L. -ljpeg

SOURCES += main.cpp\
        camera.cpp

HEADERS  += camera.h

FORMS    += camera.ui

程序界面如下
图片说明
图片说明
求助大神该怎么保存拍摄的视频
非常感谢

1个回答

试试把多帧图片保存为视频 这是我搜到的

1.用Qt + opencv,opencv里面的cv::VideoWriter可以将图片写入视频文件

2.需要使用第三方库实现,例如:ffmpeg

3.https://blog.csdn.net/casun_li/article/details/70052986

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
安装QT,具体步骤在arm上运行

安装了,可是有很多错误,安装了3.2.2的,可是编译器用不了。

Windows下QT开发的程序如何移植到ARM板上

我想把在Windows环境下用QT开发的程序移植到ARM板上,有没有大牛玩过这个,程序里面还用到了boost,google protobuf,不知道有没有影响

arm上的qt鼠标与触摸屏共存情况下,使用触摸屏控制qt界面,指针会飘?

运行环境:2440+linux2.6.22.6+qt4.7.3 目前问题: qt已经移植到arm板子上面,这是关于qt界面指针的驱动设置:export QWS_MOUSE_PROTO="Tslib:/dev/event1 mouseman:/dev/mice",我希望既能够使用触摸屏来操作qt界面也能够使用鼠标来操作,通过以上设置,发现使用鼠标没问题,可以操作,但是触摸屏使用的时候指针会飘,而且点击绝大多数情况下不起作用,哪位大神给指条明路? 试验: 我分别使用了intellimouse microsoft mousesystems mouseman 来设置,效果都一样,其中microsoft放上去之后干脆什么放映都没有。

Qt arm移植 树莓派

想在树莓派B版上跑Qt程序,自己下载源码包按照网上的教程,arm包没编译成功。求一份编译好的源码包能够放到树莓派上,树莓派是armv6的

IMX6ARM平台gstreamer视频始终全屏播放

目前采用ARM芯片为飞思卡尔的imx6,该芯片具备VPU,具备硬件加速的能力。在ARM板上安装UBUNTU系统,桌面为XFCE桌面/KDE桌面/GNOME桌面(都尝试了),安装gstreamer1.0播放器可以流畅播放高清视频。但是使用QT调用gstreamer后,无法在QTwidget上播放,而是全屏播放。 另外使用gst-launch-1.0 filesrc location=/home/chipsee/haihang.flv ! decodebin ! videoconvert ! video/x-raw,width=1280,height=720,framerate=30/1 ! imxipuvideosink无法修改画面尺寸。。 请问:使用gst-launch-1.0要想修改最后画面尺寸应该用什么完整命令?无法像VLC一样在QTwindget上指定窗口播放跟调用方法是否有关,提出宝贵建议

ARM开发板上QT5 中 OSD显示的问题 具体如下

各位 ,我现在做一个视频监控类的东西,在IMX6的开发板上移植了QT5.4 用于GUI界面的显示, 然后用IMX6的/dev/vidio17作为视频的输出到fb0,现在要求视频显示在底层,GUI显示在上层,GUI的背景我设置为透明的,这样可以看到后面的视频,IMX6有两层fb0和fb1 但是现在的情况视频老是挡住GUI 我明明通过 export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb1指定输出到fb1 然后执行是:./ XX -platform linuxfb 但是总感觉没有什么用 还是原来那样 请各位大神指导!

QT ARM 交叉编译 求帮助

已经安装 QT5.2.1for linux 和 arm-linux-gcc 以及 qt-4.8.3-linux-arm-install。 执行#arm-linux-gcc -v 和#qmake -v 都能成功现实版本号。而且我已经在/etc/profile中添加: export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin export PATH=$PATH:/usr/local/qt-4.8.3-linux-arm-install/bin export QMAKESPEC=/usr/local/qt-4.8.3-linux-arm-install/mkspecs/qws/linux-arm-g++ 问题1:在编译hello.cpp文件时,显示如下: wangsy@9527laptop:~/test$ qmake -project wangsy@9527laptop:~/test$ qmake wangsy@9527laptop:~/test$ make arm-linux-g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/qt-4.8.3-linux-arm-install/mkspecs/qws/linux-arm-g++ -I. -I/usr/local/qt-4.8.3-linux-arm-install/include/QtCore -I/usr/local/qt-4.8.3-linux-arm-install/include/QtNetwork -I/usr/local/qt-4.8.3-linux-arm-install/include/QtGui -I/usr/local/qt-4.8.3-linux-arm-install/include -I. -I. -o hello.o hello.cpp arm-linux-g++ -Wl,-O1 -Wl,-rpath,/usr/local/qt-4.8.3-linux-arm-install/lib -o test hello.o -L/usr/local/qt-4.8.3-linux-arm-install/lib -lQtGui -L/usr/local/qt-4.8.3-linux-arm-install/lib -lQtNetwork -lQtCore -lpthread 问题2:在 Qt Creator 中,在Qt versions中已经添加了qt-4.8.3-linux-arm-install中的qmake,路径是/usr/local/qt-4.8.3-linux-arm-install/bin/qmake;在Compilers中添加了arm-linux-gcc,路径是/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/bin/gcc。可是在build的时候会显示这样的信息: Error while parsing file /home/wangsy/QT_test/console_test/console_test.pro. Giving up. Cannot read /qws/linux-arm-g++/qmake.conf: No such file or directory Could not read qmake configuration file /qws/linux-arm-g++/qmake.conf. Could not read qmake configuration file /qws/linux-arm-g++/qmake.conf. 对于问题一,这种提示是说我环境没配好吗?如果是的话我应该怎么修改? 对于问题二,应该在哪里配置才能解决这个问题? 跪谢大神帮助~~

将Qtopencv的程序移植到ARM板子上面运行没有反应是怎么回事?

为什么我把编译好的QtOpenCv程序移植到ARM上面,运行什么反应也没有,没有报错, 也没有反应,opencv是用的4.5.1的编译器编译的,qt程序是4.7.1的编译器编译的, 请问这两者的不统一会导致这个问题吗??如果不会,那么导致这个程序什么反应都没有的情况是怎么导致的。请有关大神来解决下。。。。

qt5.8移植到arm335x上字体显示异常问题

我的板子分辨率是1024x600,物理尺寸154x92单位cm。现在问题是这样的,当我的环境变量 配置为下如下 export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1024x600:mmsize=154x92:offset=0x0:tty=/dev/tty1 Qt应用程序部分为 int main(int argc, char *argv[]) { // QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication a(argc, argv); QWidget pDevice; qDebug() << "logical" << pDevice.logicalDpiX() << pDevice.logicalDpiY(); qDebug() << "physical" << pDevice.physicalDpiX() << pDevice.physicalDpiY(); myUiloader loader; QFile file("./Scrip.ui"); file.open(QFile::ReadOnly); loader.addPluginPath("./"); //qDebug() << "pluginPaths:" << loader.pluginPaths(); //auto *Uiwidget = qobject_cast<ICDButton *>(loader.load(&file)); QWidget * w= loader.load(&file); file.close(); w->show(); return a.exec(); 此时交叉编译后,在板子上运行打印信息为logical2 169 166 physical2 169 166 根据dpi的计算方式确实是169 166,但是这时动态加载ui界面文件字体显示异常偏大,并不是所见所得,而当我修改配置 export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1024x600:**mmsize=169x166**:offset=0x0:tty=/dev/tty1后 运行Qt应用程序,打印信息变成logical 154 92 physical 154 92,此时所有字体显示正常(按照qt官网说明mmsize设置应该是mmsize=154x92才是对的,这是显示才应该正常)请问这可能是什么原因?本人初学Qt,求大神解答

关于linux和arm的qt交叉编译的几个问题,求助啊!大神们!

我想要交叉编译linux和arm,已经下载了qt-everywhere-opensource-src-4.8.3。请问是不是说只有用qt4.8.3编译成功的才能使得qt-every……交叉编译成功呢?谢谢大神解答!

在fedora 10下移植QT到arm平台失败也就是运行不起来

安装了 qt-x11-opensource-src-4.5.3.tar.gz qt-embedded-linux-opensource-src-4.5.2.tar.gz 这两个。 安装方法是按照教程来装。 为了方便,我直接把qt-embedded-linux-opensource-src-4.5.2 arm 版本的装到了开发板。 QTCreator 也已经设置qt-embedded- 这个安装好里的qmake build settings 也设置成了release 手动 qmake -project qmake make 这时候会出错(make的时候会出错) 用QTCreator 点锤子可以编译出来,但是不能执行,(是不是arm版本的原因?设置PC环境可以执行) 编译出来的arm 版本应用程序复制到了根文件系统下,我是用NFS挂载的方式,没有转换成yaffs2文件(有没有关系?应该没关系吧?) 执行开发板的应用程序的时候会报 not found 本人纯粹是个人自学,没办法,没人问,求各位高手帮帮忙,小弟感激不尽。

arm9 保存图像数据至pc

当初用dsp的时候用fwrite函数,然而现在arm上虽然可以编译通过,但运行不了。 问:如何把数据保存至pc,除了串口通讯,因为我要保存图像。

QT+gstreamer,视频不在窗口显示问题

目前采用ARM芯片为飞思卡尔的imx6,该芯片具备VPU,具备硬件加速的能力。在ARM板上安装UBUNTU14系统,桌面为XFCE桌面,安装gstreamer1.0(使用synaptic一键安装)播放器可以流畅播放高清视频。使用QT5.1.2调用gstreamer1.0,视频无法在指定窗口播放,而是全屏播放 代码摘录如下,请指出不能在正确位置播放是否为调用方法问题? Widget::Widget(QWidget *parent) : QWidget(parent) { /* Create the elements */ data->playbin2 = gst_element_factory_make ("playbin", "playbin2"); g_object_set(data->playbin2, "uri", uri.toUtf8().data(), NULL); /* Create the GUI */ createUi(data); /* Instruct the bus to emit signals for each received message, and connect to the interesting signals */ bus = gst_element_get_bus (data->playbin2); } void Widget::createUi (CustomData *data) { setWindowTitle(tr("????????")); setWindowIcon(QIcon(":/new/image/Image/icon_fronware.png")); resize(600,500); setStyleSheet("background-color: white;"); qDebug()<<"CURRENT WIDGET"<<this->winId(); mainLayout = new QVBoxLayout(this); mainLayout->setContentsMargins(5,5,5,5); mainLayout->setSpacing(5); displayWnd = new VideoWidget; qDebug()<<"1"<<displayWnd->width()<<displayWnd->height(); backgroundWnd = new QLabel; backgroundWnd->setStyleSheet("background-color: black;"); qDebug()<<"2backgroundWnd"<<backgroundWnd->width()<<backgroundWnd->height(); renderWnd = new QStackedWidget; //A = new QGstWidget; renderWnd->addWidget(displayWnd); renderWnd->addWidget(backgroundWnd); renderWnd->setCurrentIndex(0); //qDebug()<<"2"<<displayWnd->width()<<displayWnd->height(); qDebug()<<"2renderWnd"<<renderWnd->width()<<renderWnd->height(); qDebug()<<"3renderWnd"<<this->width()<<this->height(); slider = new QSlider(Qt::Horizontal); slider->setFixedHeight(15); timeLabel = new QLabel; timeLabel->setFixedHeight(15); timeLabel->setStyleSheet("background-color: #ffffff;color:black; font-family:\"STXihei\";font-size: 10px;"); timeLabel->setText("00:00:00/00:00:00"); timeLayout = new QHBoxLayout; timeLayout->setContentsMargins(0,0,0,0); timeLayout->setSpacing(5); timeLayout->addWidget(slider,5); timeLayout->addWidget(timeLabel,1); infoLabel = new QLabel; infoLabel->setFixedHeight(25); infoLabel->setStyleSheet("background-color: white;color:black; font-family:\"STXihei\";font-size: 15px;"); openBtn = new QPushButton; openBtn->setFixedSize(75,25); openBtn->setText("????"); openBtn->setStyleSheet(" QPushButton{border: 1px solid #C0C0C0; \ background-color: white;\ border-style: solid;\ border-radius:0px;\ color:black;\ font-family:\"STXihei\";\ font-size: 15px;\ padding:0 0px;\ margin:0 0px;\ }\ QPushButton:hover{border: 1px solid #C0C0C0; \ background-color: #ececec;\ border-style: solid;\ border-radius:0px;\ color:black;\ font-family:\"STXihei\";\ font-size: 15px;\ padding:0 0px;\ margin:0 0px;\ }\ "); startBtn = new QPushButton; startBtn->setFixedSize(45,25); startBtn->setText("??"); startBtn->setStyleSheet(openBtn->styleSheet()); stopBtn = new QPushButton; stopBtn->setFixedSize(45,25); stopBtn->setText("??"); stopBtn->setStyleSheet(openBtn->styleSheet()); plauseBtn = new QPushButton; plauseBtn->setFixedSize(45,25); plauseBtn->setText("??"); plauseBtn->setStyleSheet(openBtn->styleSheet()); plauseBtn->setVisible(false); muteButton = new QToolButton; muteButton->setFixedSize(45,25); muteButton->setIcon(style()->standardIcon(QStyle::SP_MediaVolume)); volumeSlider = new QSlider(Qt::Horizontal); volumeSlider->setFixedSize(60,15); volumeSlider->setRange(0,100); buttonLayout = new QHBoxLayout; buttonLayout->setContentsMargins(0,0,0,0); buttonLayout->setSpacing(15); buttonLayout->addStretch(); buttonLayout->addWidget(openBtn); buttonLayout->addWidget(startBtn); buttonLayout->addWidget(plauseBtn); buttonLayout->addWidget(stopBtn); buttonLayout->addWidget(muteButton); buttonLayout->addWidget(volumeSlider); buttonLayout->addStretch(); mainLayout->addWidget(renderWnd,5); mainLayout->addWidget(infoLabel,1); mainLayout->addLayout(timeLayout); mainLayout->addLayout(buttonLayout); qDebug()<<"3"<<displayWnd->width()<<displayWnd->height(); realize_cb(displayWnd,data); connect(openBtn,SIGNAL(clicked()),this,SLOT(slotOpenButtonClicked())); connect(startBtn,SIGNAL(clicked()),this,SLOT(slotPlayButtonClicked())); connect(plauseBtn,SIGNAL(clicked()),this,SLOT(slotPaluseButtonClicked())); connect(stopBtn,SIGNAL(clicked()),this,SLOT(slotStopButtonClicked())); connect(displayWnd,SIGNAL(fullScreenSignal(bool)),this,SLOT(slotFullScreen(bool))); connect(muteButton,SIGNAL(clicked()),this,SLOT(slotmuteButtonClicked())); connect(volumeSlider,SIGNAL(sliderMoved(int)),this,SLOT(slotVolumeChange(int))); slider->setRange(0,100); volumeSlider->setValue(50); data->slider = slider; connect(slider,SIGNAL(sliderMoved(int)),this,SLOT(seek(int))); data->streams_list = infoLabel; qDebug()<<"4"<<displayWnd->width()<<displayWnd->height(); } void Widget::realize_cb(QWidget *widget, CustomData *data) { guintptr window_handle; window_handle = (guintptr)(widget->winId()); gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(data->playbin2),window_handle); } void Widget::playButtonClicked(QPushButton *button, CustomData *data) { Q_UNUSED(button); GstStateChangeReturn ret; ret = gst_element_set_state (data->playbin2, GST_STATE_PLAYING); }

ARM上的无线视频接收客户端方案

在ARM上面做无线传输视频接收显示,请问有什么好点的方案,jrtp+ffmpeg+SDL怎么样,求高手解答,做毕设用的 还是用live555比较好????

基于ARM的简易示波器 不知道ADC驱动和QT应用程序结合

想做一个没有前端电路的基于ARM9的简易示波器,现在已经做到ADC驱动已经写好,QT应用程序也差不多了,不过不知道怎么结合一起用起来,希望做过这方面的大牛指导一下谢谢! 问题:怎么把自己写的ADC驱动和QT应用程序结合起来(手边没有信号发生器),如果结合好了怎么测试呢?

求助:Ubuntu16.04交叉编译Qt4.8.6出错

目标机器:银河麒麟/arm64,所用交叉编译器为:aarch64-linux-gnu-g++ ./configure -opensource -confirm-license -prefix /opt/arm_qt4.8.6 -xplatform qws/linux-aarch64-gnu-g++ -shared -no-qt3support -no-phonon -no-phonon-backend -qt-zlib -no-gif -no-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -no-glib -no-dbus -no-rpath -no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-neon -no-audio-backend -no-svg -no-javascript-jit -no-script -no-scripttools -no-multimedia -no-openssl -nomake tools -nomake examples -nomake demos -DQT_ARCH_ARM _在mkspecs/qws/linux-aarch64-gnu-g++/中的qmake.conf也已经修改完毕。 在make时出错如下图: ![图片说明](https://img-ask.csdn.net/upload/201807/17/1531793511_417806.png)

在Qt中编译带Qwt的ARM程序时总是提示 cannot find -lqwt

我编译Qt的ARM程序就不会报错,而且编译的程序能够顺利在ARM板子上运行,但是只要一加上Qwt就会报错,总是说找不到libqwt.so文件,但是我已经指定了路径了,而且设置了环境变量,它还是提示说找不到。这是怎么回事呢。连在Ubuntu上编译都编译不过,更别说在板子上运行了。下面是我Qt中配置的工具链![报错信息](https://img-ask.csdn.net/upload/201711/11/1510370611_736004.jpg) ![飞思卡尔的板](https://img-ask.csdn.net/upload/201711/11/1510370639_666595.jpg) ![使用Kits-mx6编译](https://img-ask.csdn.net/upload/201711/11/1510370647_398030.jpg) 以上配置如果没有用到qwt是没问题的,能够在板上运行,只要一用到qwt就提示找不到库文件。这问题折腾了我几天了。要醉了

QT4.8.6加载网上下载的opencv2.4.9 arm32动态库出错

![图片说明](https://img-ask.csdn.net/upload/201803/05/1520241688_176381.png) ![图片说明](https://img-ask.csdn.net/upload/201803/05/1520241730_680180.png) 我用的虚拟机是 ubuntu16.04 64 位 该库为 arm32位 ,qt的qmake和交叉编译工具链都已经设置成arm模式 ,但是 就是 编译时 出现警告导致编译失败 库的下载地址为[http://download.csdn.net/download/learning_life/9737679]( "") 希望 大神看到 还望 帮助解决

QT5.0的arm移植问题之configure指令

我实在找不好相关资料,望指教。 请问configure中的xplatform和platform参数的区别,如何设置???

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

你以为这样写Java代码很6,但我看不懂

为了提高 Java 编程的技艺,我最近在 GitHub 上学习一些高手编写的代码。下面这一行代码(出自大牛之手)据说可以征服你的朋友,让他们觉得你写的代码很 6,来欣赏一下吧。 IntStream.range(1, 5).boxed().map(i -&gt; { System.out.print("Happy Birthday "); if (i == 3) return "dear NAME"...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

立即提问
相关内容推荐