国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于IMX6ULL的智能車載終端項(xiàng)目(代碼開源)_imx6ull 開源 linux 項(xiàng)目 車載終端

這篇具有很好參考價(jià)值的文章主要介紹了基于IMX6ULL的智能車載終端項(xiàng)目(代碼開源)_imx6ull 開源 linux 項(xiàng)目 車載終端。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.4 車載終端:雜項(xiàng)功能

車載終端是一個(gè)非常復(fù)雜且常用的裝置,隨著電車與自動(dòng)駕駛技術(shù)的不斷升級(jí)迭代,需求也與日俱增!我們往往需要在終端上附加許許多多其他的功能,比如:智能家居聯(lián)動(dòng)、車內(nèi)環(huán)境監(jiān)測(cè)、天氣預(yù)報(bào)與網(wǎng)上瀏覽等!

imx6ull linux項(xiàng)目,程序員,嵌入式

二、IMX6ULL車載項(xiàng)目的驅(qū)動(dòng)

作者強(qiáng)調(diào):考慮到篇幅有限,作者本篇博客僅進(jìn)行部分功能實(shí)現(xiàn)教學(xué),并側(cè)重應(yīng)用層的實(shí)現(xiàn)!基礎(chǔ)薄弱的朋友,可以直接使用正點(diǎn)原子出廠的鏡像程序進(jìn)行項(xiàng)目復(fù)現(xiàn)!

2.1 音頻設(shè)備驅(qū)動(dòng)

音頻 CODEC 支持 I2S 協(xié)議,那么主控制器也必須支持 I2S 協(xié)議,I.MX6ULL 也提供了一個(gè)叫做 SAI 的外設(shè),全稱為 SynchronousAudio Interface,翻譯過來就是同步音頻接口。

I.MX6ULLSAI 是一個(gè)全雙工、支持幀同步的串行接口,支持I2S、AC97、TDM和音頻DSP

正點(diǎn)原子 ALPHA 開發(fā)板音頻原理圖如圖所示:

imx6ull linux項(xiàng)目,程序員,嵌入式

NXP 官方已經(jīng)寫好了 WM8960 驅(qū)動(dòng),因此我們直接配置內(nèi)核使能 WM8960 驅(qū)動(dòng)即可,按照如下所示步驟使能 WM8960 驅(qū)動(dòng)。

1、根據(jù)IMX6ULL的引腳原理圖修改設(shè)備樹;

2、使能內(nèi)核的 WM8960 驅(qū)動(dòng);

2.1、取消 ALSA 模擬 OSS API

imx6ull linux項(xiàng)目,程序員,嵌入式

2.2、使能 I.MX6ULL 的 WM8960 驅(qū)動(dòng)

imx6ull linux項(xiàng)目,程序員,嵌入式

完整可見:《【正點(diǎn)原子】I.MX6U嵌入式Linux驅(qū)動(dòng)開發(fā)指南V1.6》 第 1544 頁(yè)

2.2 LCD驅(qū)動(dòng)

正點(diǎn)原子的 IMX6ULL 與 NXP 官方的 “藍(lán)版”相似度極高,就是仿照著進(jìn)行制作的(一般情況下,大都公司產(chǎn)品的項(xiàng)目板也是如此)

6ULL 的 eLCDIF 接口驅(qū)動(dòng)程序 NXP 已經(jīng)編寫好了,因此 LCD 驅(qū)動(dòng)部分我們不需要去修改。我們需要做的就是按照所使用的 LCD 來修改設(shè)備樹。重點(diǎn)要注意三個(gè)地方:

①、LCD 所使用的 IO 配置。
②、LCD 屏幕節(jié)點(diǎn)修改,修改相應(yīng)的屬性值,換成我們所使用的 LCD 屏幕參數(shù)。
③、LCD 背光節(jié)點(diǎn)信息修改,要根據(jù)實(shí)際所使用的背光 IO 來修改相應(yīng)的設(shè)備節(jié)點(diǎn)信息。

1、修改 LCD 所使用的 IO 配置;

檢查一下設(shè)備樹中 LCD 所使用的 IO 配置,這個(gè)其實(shí) NXP 都已經(jīng)給我們寫好了,不需要修改!

2、LCD 屏幕參數(shù)節(jié)點(diǎn)信息修改

imx6ull-alientek-emmc.dts 文件中找到 lcdif 節(jié)點(diǎn),節(jié)點(diǎn)內(nèi)容如下所示:

&lcdif {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_lcdif_dat
		     &pinctrl_lcdif_ctrl>;

	display = <&display0>;
	status = "okay"; 

	/* 7寸1024*600 */
	display0: display {
		bits-per-pixel = <24>;		/*  */
		bus-width = <24>;			/* LCD屏幕數(shù)據(jù)線有多少 */

		display-timings {
			native-mode = <&timing0>;
			timing0: timing0 {
			clock-frequency = <51200000>;		/* 時(shí)鐘頻率51.2MHZ */
			hactive = <1024>;					/* 水平像素點(diǎn) */
			vactive = <600>;					/* 垂直像素點(diǎn) */
			hfront-porch = <160>;
			hback-porch = <140>;
			hsync-len = <20>;
			vback-porch = <20>;
			vfront-porch = <12>;
			vsync-len = <3>;
			
			/* 像素點(diǎn)有效電平值 */
			hsync-active = <0>;
			vsync-active = <0>;
			de-active = <1>;
			pixelclk-active = <0>;
			};
		};
	};

	/* 4.3寸480*272 */
	/* display0: display {
		bits-per-pixel = <24>;
		bus-width = <24>;

		display-timings {
			native-mode = <&timing0>;
			timing0: timing0 {
			clock-frequency = <9000000>;
			hactive = <480>;
			vactive = <272>;
			hfront-porch = <5>;
			hback-porch = <40>;
			hsync-len = <1>;
			vback-porch = <8>;
			vfront-porch = <8>;
			vsync-len = <1>;

			hsync-active = <0>;
			vsync-active = <0>;
			de-active = <1>;
			pixelclk-active = <0>;
			};
		};
	};*/

	/* 4.3寸800*480 */
	/* display0: display {
		bits-per-pixel = <24>;
		bus-width = <24>;

		display-timings {
			native-mode = <&timing0>;
			timing0: timing0 {
			clock-frequency = <31000000>;
			hactive = <800>;
			vactive = <480>;
			hfront-porch = <40>;
			hback-porch = <88>;
			hsync-len = <48>;
			vback-porch = <32>;
			vfront-porch = <13>;
			vsync-len = <3>;

			hsync-active = <0>;
			vsync-active = <0>;
			de-active = <1>;
			pixelclk-active = <0>;
			};
		};
	};*/

};

imx6ull linux項(xiàng)目,程序員,嵌入式

根據(jù)自己使用 LCD 的實(shí)際參數(shù)修改紅色框中的各個(gè)參數(shù)信息!

3、LCD 屏幕背光節(jié)點(diǎn)信息

正點(diǎn)原子的 LCD 接口背光控制 IO 連接到了 I.MX6U 的 GPIO1_IO08 引腳上,GPIO1_IO08復(fù)用為 PWM1_OUT,通過 PWM 信號(hào)來控制 LCD 屏幕背光的亮度。正點(diǎn)原子 I.MX6U-ALPHA 開發(fā)板的 LCD 背光引腳和 NXP 官方 EVK 開發(fā)板的背光引腳一樣,因此背光的設(shè)備樹節(jié)點(diǎn)是不需要修改的。

設(shè)置 backlight 節(jié)點(diǎn),這個(gè) NXP 已經(jīng)給我們?cè)O(shè)置好了,大家在 imx6ull-alientek-emmc.dts 文件中找到如下內(nèi)容:

backlight {
	compatible = "pwm-backlight";
	pwms = <&pwm1 0 5000000>;
	brightness-levels = <0 4 8 16 32 64 128 255>;
	default-brightness-level = <7>;
	status = "okay";
};

第 3 行,設(shè)置背光使用 pwm1,PWM 頻率為 200Hz。
第 4 行,設(shè)置背 8 級(jí)背光(0~7),分別為 0、4、8、16、32、64、128、255,對(duì)應(yīng)占空比為0%、1.57%、3.13%、6.27%、12.55%、25.1%、50.19%、100%,如果嫌少的話可以自行添加一些其他的背光等級(jí)值。
第 5 行,設(shè)置默認(rèn)背光等級(jí)為 6,也就是 **50.19%**的亮度。

完整可見:《【正點(diǎn)原子】I.MX6U嵌入式Linux驅(qū)動(dòng)開發(fā)指南V1.6》 第 1386 頁(yè)

2.3 AP3216C驅(qū)動(dòng)

本項(xiàng)目作者替換的智能家居 APP 的功能頁(yè)為 AP3216C 的車載內(nèi)室監(jiān)測(cè)功能!

篇幅有限,AP3216的使用和 QT 功能頁(yè)設(shè)計(jì)博客:http://t.csdn.cn/cN6p1

imx6ull linux項(xiàng)目,程序員,嵌入式

三、QT智能車載裝置

3.1 QMusic音樂播放器

音樂播放器是各家嵌入式機(jī)構(gòu) QT 練習(xí)的常規(guī)項(xiàng)目,QMediaPlayer 類是一個(gè)高級(jí)媒體播放類。它可以用來播放歌曲、電影和網(wǎng)絡(luò)廣播等內(nèi)容。一般用于播放 mp3 和 mp4 等等媒體文件。QMediaPlayer 類常常與 QMediaPlaylist 類一起使用??梢院茌p松的設(shè)計(jì)一個(gè)自己喜歡的音樂播放器與視頻播放器。

QMediaPlayer 提供了很多信號(hào),我們可以使用這些信號(hào)來完成音樂播放器的一系列操作,比如媒體狀態(tài)改變的信號(hào) stateChanged(QMediaPlayer::State state),判斷這個(gè) state 的狀態(tài)就可以知道什么時(shí)候媒體暫停、播放、停止了。

★在項(xiàng)目文件 14_musicplayer.pro 文件第一行添加的代碼:multimedia

imx6ull linux項(xiàng)目,程序員,嵌入式

在頭文件 “mainwindow.h” 具體代碼如下:

/******************************************************************
* @projectName   musicplayer
* @brief         mainwindow.h
* @author        混分巨獸龍某某
* @email         1178305328@qq.com
*******************************************************************/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QPushButton>
#include <QSlider>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QListWidget>
#include <QLabel>
#include <QSpacerItem>
#include <QDebug>

/* 媒體信息結(jié)構(gòu)體 */
struct MediaObjectInfo {
    /* 用于保存歌曲文件名 */
    QString fileName;
    /* 用于保存歌曲文件路徑 */
    QString filePath;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    /* 媒體播放器,用于播放音樂 */
    QMediaPlayer *musicPlayer;

    /* 媒體列表 */
    QMediaPlaylist *mediaPlaylist;

    /* 音樂列表 */
    QListWidget *listWidget;

    /* 播放進(jìn)度條 */
    QSlider *durationSlider;

    /* 音樂播放器按鈕 */
    QPushButton *pushButton[7];
    QPushButton *exit_button;


    /* 垂直布局 */
    QVBoxLayout *vBoxLayout[3];

    /* 水平布局 */
    QHBoxLayout *hBoxLayout[4];

    /* 垂直容器 */
    QWidget *vWidget[3];

    /* 水平容器 */
    QWidget *hWidget[4];

    /* 標(biāo)簽文本 */
    QLabel *label[4];

    /* 用于遮罩 */
    QWidget *listMask;

    /* 音樂布局函數(shù) */
    void musicLayout();

    /* 主窗體大小重設(shè)大小函數(shù)重寫 */
    void resizeEvent(QResizeEvent *event);

    /* 媒體信息存儲(chǔ) */
    QVector<MediaObjectInfo> mediaObjectInfo;

    /* 掃描歌曲 */
    void scanSongs();

    /* 媒體播放器類初始化 */
    void mediaPlayerInit();

private slots:
    /* 播放按鈕點(diǎn)擊 */
    void btn_play_clicked();

    /* 下一曲按鈕點(diǎn)擊*/
    void btn_next_clicked();

    /* 上一曲按鈕點(diǎn)擊 */
    void btn_previous_clicked();

    /* 媒體狀態(tài)改變 */
    void mediaPlayerStateChanged(QMediaPlayer::State);

    /* 列表單擊 */
    void listWidgetCliked(QListWidgetItem*);

    /* 媒體列表項(xiàng)改變 */
    void mediaPlaylistCurrentIndexChanged(int);

    /* 媒體總長(zhǎng)度改變 */
    void musicPlayerDurationChanged(qint64);

    /* 媒體播放位置改變 */
    void mediaPlayerPositionChanged(qint64);

    /* 播放進(jìn)度條松開 */
    void durationSliderReleased();
};
#endif // MAINWINDOW_H

在源文件 “mainwindow.cpp” 具體代碼如下:

#include "mainwindow.h"
#include <QCoreApplication>
#include <QFileInfoList>
#include <QDir>
#include <QProcess>


QProcess * mypro;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    /* 布局初始化 */
    musicLayout();

    /* 媒體播放器初始化 */
    mediaPlayerInit();

    /* 掃描歌曲 */
    scanSongs();

    /* 按鈕信號(hào)槽連接 */
    connect(pushButton[0], SIGNAL(clicked()),
            this, SLOT(btn_previous_clicked()));
    connect(pushButton[1], SIGNAL(clicked()),
            this, SLOT(btn_play_clicked()));
    connect(pushButton[2], SIGNAL(clicked()),
            this, SLOT(btn_next_clicked()));

    /* 媒體信號(hào)槽連接 */
    connect(musicPlayer,
            SIGNAL(stateChanged(QMediaPlayer::State)),
            this,
            SLOT(mediaPlayerStateChanged(QMediaPlayer::State)));
    connect(mediaPlaylist,
            SIGNAL(currentIndexChanged(int)),
            this,
            SLOT(mediaPlaylistCurrentIndexChanged(int)));
    connect(musicPlayer, SIGNAL(durationChanged(qint64)),
            this,
            SLOT(musicPlayerDurationChanged(qint64)));
    connect(musicPlayer,
            SIGNAL(positionChanged(qint64)),
            this,
            SLOT(mediaPlayerPositionChanged(qint64)));

    /* 列表信號(hào)槽連接 */
    connect(listWidget, SIGNAL(itemClicked(QListWidgetItem*)),
            this, SLOT(listWidgetCliked(QListWidgetItem*)));

    /* slider信號(hào)槽連接 */
    connect(durationSlider, SIGNAL(sliderReleased()),
            this, SLOT(durationSliderReleased()));

    /* 失去焦點(diǎn) */
    this->setFocus();

    exit_button = new QPushButton(this);
    exit_button->setMinimumSize(50, 50);
    exit_button->setMaximumSize(50, 50);
    exit_button->move(760,440);
    exit_button->setStyleSheet("QPushButton{background:yellow}");

    connect(exit_button,&QPushButton::clicked,[=](){
        mypro->close();
        exit(1);//退出程序
    });
}

void MainWindow::musicLayout()
{
    /* 設(shè)置位置與大小,這里固定為800, 480 */
    this->setGeometry(0, 0, 800, 480);
    QPalette pal;

    /* 按鈕 */
    for (int i = 0; i < 7; i++)
        pushButton[i] = new QPushButton();

    /* 標(biāo)簽 */
    for (int i = 0; i < 4; i++)
        label[i] = new QLabel();

    for (int i = 0; i < 3; i++) {
        /* 垂直容器 */
        vWidget[i] = new QWidget();
        vWidget[i]->setAutoFillBackground(true);
        /* 垂直布局 */
        vBoxLayout[i] = new QVBoxLayout();
    }

    for (int i = 0; i < 4; i++) {
        /* 水平容器 */
        hWidget[i] = new QWidget();
        hWidget[i]->setAutoFillBackground(true);
        /* 水平布局 */
        hBoxLayout[i] = new QHBoxLayout();
    }

    /* 播放進(jìn)度條 */
    durationSlider = new QSlider(Qt::Horizontal);
    durationSlider->setMinimumSize(300, 15);
    durationSlider->setMaximumHeight(15);
    durationSlider->setObjectName("durationSlider");

    /* 音樂列表 */
    listWidget = new QListWidget();
    listWidget->setObjectName("listWidget");
    listWidget->resize(310, 265);
    listWidget->setVerticalScrollBarPolicy(
                Qt::ScrollBarAlwaysOff);
    listWidget->setHorizontalScrollBarPolicy(
                Qt::ScrollBarAlwaysOff);

    /* 列表遮罩 */
    listMask = new QWidget(listWidget);
    listMask->setMinimumSize(310, 50);
    listMask->setMinimumHeight(50);
    listMask->setObjectName("listMask");
    listMask->setGeometry(0,
                          listWidget->height() - 50,
                          310,
                          50);


    /* 設(shè)置對(duì)象名稱 */
    pushButton[0]->setObjectName("btn_previous");
    pushButton[1]->setObjectName("btn_play");
    pushButton[2]->setObjectName("btn_next");
    pushButton[3]->setObjectName("btn_favorite");
    pushButton[4]->setObjectName("btn_mode");
    pushButton[5]->setObjectName("btn_menu");
    pushButton[6]->setObjectName("btn_volume");

    /* 設(shè)置按鈕屬性 */
    pushButton[1]->setCheckable(true);
    pushButton[3]->setCheckable(true);

    /* H0布局 */
    vWidget[0]->setMinimumSize(310, 480);
    vWidget[0]->setMaximumWidth(310);
    vWidget[1]->setMinimumSize(320, 480);
    QSpacerItem *hSpacer0 = new
            QSpacerItem(70, 480,
                        QSizePolicy::Minimum,
                        QSizePolicy::Maximum);

    QSpacerItem *hSpacer1 = new
            QSpacerItem(65, 480,
                        QSizePolicy::Minimum,
                        QSizePolicy::Maximum);

    QSpacerItem *hSpacer2 = new
            QSpacerItem(60, 480,
                        QSizePolicy::Minimum,
                        QSizePolicy::Maximum);

    hBoxLayout[0]->addSpacerItem(hSpacer0);
    hBoxLayout[0]->addWidget(vWidget[0]);
    hBoxLayout[0]->addSpacerItem(hSpacer1);
    hBoxLayout[0]->addWidget(vWidget[1]);
    hBoxLayout[0]->addSpacerItem(hSpacer2);
    hBoxLayout[0]->setContentsMargins(0, 0, 0, 0);

    hWidget[0]->setLayout(hBoxLayout[0]);
    setCentralWidget(hWidget[0]);

    /* V0布局 */
    listWidget->setMinimumSize(310, 265);
    hWidget[1]->setMinimumSize(310, 80);
    hWidget[1]->setMaximumHeight(80);
    label[0]->setMinimumSize(310, 95);
    label[0]->setMaximumHeight(95);
    QSpacerItem *vSpacer0 = new
            QSpacerItem(310, 10,
                        QSizePolicy::Minimum,
                        QSizePolicy::Maximum);
    QSpacerItem *vSpacer1 = new
            QSpacerItem(310, 30,
                        QSizePolicy::Minimum,
                        QSizePolicy::Minimum);
    vBoxLayout[0]->addWidget(label[0]);
    vBoxLayout[0]->addWidget(listWidget);
    vBoxLayout[0]->addSpacerItem(vSpacer0);
    vBoxLayout[0]->addWidget(hWidget[1]);
    vBoxLayout[0]->addSpacerItem(vSpacer1);
    vBoxLayout[0]->setContentsMargins(0, 0, 0, 0);

    vWidget[0]->setLayout(vBoxLayout[0]);

    /* H1布局 */
    for (int i = 0; i < 3; i++) {
        pushButton[i]->setMinimumSize(80, 80);
    }
    QSpacerItem *hSpacer3 = new
            QSpacerItem(40, 80,
                        QSizePolicy::Expanding,
                        QSizePolicy::Expanding);
    QSpacerItem *hSpacer4 = new
            QSpacerItem(40, 80,
                        QSizePolicy::Expanding,
                        QSizePolicy::Expanding);
    hBoxLayout[1]->addWidget(pushButton[0]);
    hBoxLayout[1]->addSpacerItem(hSpacer3);
    hBoxLayout[1]->addWidget(pushButton[1]);
    hBoxLayout[1]->addSpacerItem(hSpacer4);
    hBoxLayout[1]->addWidget(pushButton[2]);
    hBoxLayout[1]->setContentsMargins(0, 0, 0, 0);

    hWidget[1]->setLayout(hBoxLayout[1]);

    /* V1布局 */
    QSpacerItem *vSpacer2 = new
            QSpacerItem(320, 40,
                        QSizePolicy::Minimum,
                        QSizePolicy::Maximum);
    QSpacerItem *vSpacer3 = new
            QSpacerItem(320, 20,
                        QSizePolicy::Minimum,
                        QSizePolicy::Maximum);
    QSpacerItem *vSpacer4 = new
            QSpacerItem(320, 30,
                        QSizePolicy::Minimum,
                        QSizePolicy::Minimum);
    label[1]->setMinimumSize(320, 320);
    QImage Image;
    Image.load(":/images/cd.png");
    QPixmap pixmap = QPixmap::fromImage(Image);
    int with = 320;
    int height = 320;
    QPixmap fitpixmap =
            pixmap.scaled(with, height,
                          Qt::IgnoreAspectRatio,
                          Qt::SmoothTransformation);
    label[1]->setPixmap(fitpixmap);
    label[1]->setAlignment(Qt::AlignCenter);
    vWidget[2]->setMinimumSize(300, 80);
    vWidget[2]->setMaximumHeight(80);
    vBoxLayout[1]->addSpacerItem(vSpacer2);
    vBoxLayout[1]->addWidget(label[1]);
    vBoxLayout[1]->addSpacerItem(vSpacer3);
    vBoxLayout[1]->addWidget(durationSlider);
    vBoxLayout[1]->addWidget(vWidget[2]);
    vBoxLayout[1]->addSpacerItem(vSpacer4);
    vBoxLayout[1]->setContentsMargins(0, 0, 0, 0);

    vWidget[1]->setLayout(vBoxLayout[1]);

    /* V2布局 */
    QSpacerItem *vSpacer5 = new
            QSpacerItem(300, 10,
                        QSizePolicy::Minimum,
                        QSizePolicy::Maximum);
    hWidget[2]->setMinimumSize(320, 20);
    hWidget[3]->setMinimumSize(320, 60);
    vBoxLayout[2]->addWidget(hWidget[2]);
    vBoxLayout[2]->addSpacerItem(vSpacer5);
    vBoxLayout[2]->addWidget(hWidget[3]);
    vBoxLayout[2]->setContentsMargins(0, 0, 0, 0);

    vWidget[2]->setLayout(vBoxLayout[2]);

    /* H2布局 */
    QFont font;

    font.setPixelSize(10);

    /* 設(shè)置標(biāo)簽文本 */
    label[0]->setText("Q Music,Enjoy it!");
    label[2]->setText("00:00");
    label[3]->setText("00:00");
    label[2]->setSizePolicy(QSizePolicy::Expanding,
                            QSizePolicy::Expanding);
    label[3]->setSizePolicy(QSizePolicy::Expanding,
                            QSizePolicy::Expanding);
    label[3]->setAlignment(Qt::AlignRight);
    label[2]->setAlignment(Qt::AlignLeft);
    label[2]->setFont(font);
    label[3]->setFont(font);

    pal.setColor(QPalette::WindowText, Qt::white);
    label[0]->setPalette(pal);
    label[2]->setPalette(pal);
    label[3]->setPalette(pal);

    hBoxLayout[2]->addWidget(label[2]);
    hBoxLayout[2]->addWidget(label[3]);

    hBoxLayout[2]->setContentsMargins(0, 0, 0, 0);
    hWidget[2]->setLayout(hBoxLayout[2]);

    /* H3布局 */
    QSpacerItem *hSpacer5 = new
            QSpacerItem(0, 60,
                        QSizePolicy::Minimum,
                        QSizePolicy::Maximum);
    QSpacerItem *hSpacer6 = new
            QSpacerItem(80, 60,
                        QSizePolicy::Maximum,
                        QSizePolicy::Maximum);
    QSpacerItem *hSpacer7 = new
            QSpacerItem(80, 60,
                        QSizePolicy::Maximum,
                        QSizePolicy::Maximum);
    QSpacerItem *hSpacer8 = new
            QSpacerItem(80, 60,
                        QSizePolicy::Maximum,
                        QSizePolicy::Maximum);
    QSpacerItem *hSpacer9 = new
            QSpacerItem(0, 60,
                        QSizePolicy::Minimum,
                        QSizePolicy::Maximum);

    for (int i = 3; i < 7; i++) {
        pushButton[i]->setMinimumSize(25, 25);
        pushButton[i]->setMaximumSize(25, 25);
    }

    hBoxLayout[3]->addSpacerItem(hSpacer5);
    hBoxLayout[3]->addWidget(pushButton[3]);
    hBoxLayout[3]->addSpacerItem(hSpacer6);
    hBoxLayout[3]->addWidget(pushButton[4]);
    hBoxLayout[3]->addSpacerItem(hSpacer7);
    hBoxLayout[3]->addWidget(pushButton[5]);
    hBoxLayout[3]->addSpacerItem(hSpacer8);
    hBoxLayout[3]->addWidget(pushButton[6]);
    hBoxLayout[3]->addSpacerItem(hSpacer9);
    hBoxLayout[3]->setContentsMargins(0, 0, 0, 0);
    hBoxLayout[3]->setAlignment(Qt::AlignHCenter);

    hWidget[3]->setLayout(hBoxLayout[3]);

    //hWidget[0]->setStyleSheet("background-color:red");
    //hWidget[1]->setStyleSheet("background-color:#ff5599");
    //hWidget[2]->setStyleSheet("background-color:#ff55ff");
    //hWidget[3]->setStyleSheet("background-color:black");
    //vWidget[0]->setStyleSheet("background-color:#555555");
    //vWidget[1]->setStyleSheet("background-color:green");
    //vWidget[2]->setStyleSheet("background-color:gray");

}

MainWindow::~MainWindow()
{
}

void MainWindow::btn_play_clicked()
{
    int state = musicPlayer->state();

    switch (state) {
    case QMediaPlayer::StoppedState:
        /* 媒體播放 */
        musicPlayer->play();
        break;

    case QMediaPlayer::PlayingState:
        /* 媒體暫停 */
        musicPlayer->pause();
        break;

    case QMediaPlayer::PausedState:
        musicPlayer->play();
        break;
    }
}

void MainWindow::btn_next_clicked()
{
    musicPlayer->stop();
    int count = mediaPlaylist->mediaCount();
    if (0 == count)
        return;

    /* 列表下一個(gè) */
    mediaPlaylist->next();
    musicPlayer->play();
}

void MainWindow::btn_previous_clicked()
{
    musicPlayer->stop();
    int count = mediaPlaylist->mediaCount();
    if (0 == count)
        return;

    /* 列表上一個(gè) */
    mediaPlaylist->previous();
    musicPlayer->play();
}

void MainWindow::mediaPlayerStateChanged(
        QMediaPlayer::State
        state)
{
    switch (state) {
    case QMediaPlayer::StoppedState:
        pushButton[1]->setChecked(false);
        break;

    case QMediaPlayer::PlayingState:
        pushButton[1]->setChecked(true);
        break;

    case QMediaPlayer::PausedState:
        pushButton[1]->setChecked(false);
        break;
    }
}

void MainWindow::listWidgetCliked(QListWidgetItem *item)
{
    musicPlayer->stop();
    mediaPlaylist->setCurrentIndex(listWidget->row(item));
    musicPlayer->play();
}

void MainWindow::mediaPlaylistCurrentIndexChanged(
        int index)
{
    if (-1 == index)
        return;

    /* 設(shè)置列表正在播放的項(xiàng) */
    listWidget->setCurrentRow(index);
}

void MainWindow::musicPlayerDurationChanged(
        qint64 duration)
{
    durationSlider->setRange(0, duration / 1000);
    int second  = duration / 1000;
    int minute = second / 60;
    second %= 60;

    QString mediaDuration;
    mediaDuration.clear();

    if (minute >= 10)
        mediaDuration = QString::number(minute, 10);
    else
        mediaDuration = "0" + QString::number(minute, 10);

    if (second >= 10)
        mediaDuration = mediaDuration
                + ":" + QString::number(second, 10);
    else
        mediaDuration = mediaDuration
                + ":0" + QString::number(second, 10);

    /* 顯示媒體總長(zhǎng)度時(shí)間 */
    label[3]->setText(mediaDuration);
}

void MainWindow::mediaPlayerPositionChanged(
        qint64 position)
{
    if (!durationSlider->isSliderDown())
        durationSlider->setValue(position/1000);

    int second  = position / 1000;
    int minute = second / 60;
    second %= 60;

    QString mediaPosition;
    mediaPosition.clear();

    if (minute >= 10)
        mediaPosition = QString::number(minute, 10);
    else
        mediaPosition = "0" + QString::number(minute, 10);

    if (second >= 10)
        mediaPosition = mediaPosition
                + ":" + QString::number(second, 10);
    else
        mediaPosition = mediaPosition
                + ":0" + QString::number(second, 10);

    /* 顯示現(xiàn)在播放的時(shí)間 */
    label[2]->setText(mediaPosition);
}

void MainWindow::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event);
    listMask->setGeometry(0,
                          listWidget->height() - 50,
                          310,
                          50);
}

void MainWindow::durationSliderReleased()
{
    /* 設(shè)置媒體播放的位置 */
    musicPlayer->setPosition(durationSlider->value() * 1000);
}

void MainWindow::scanSongs()
{
    QDir dir(QCoreApplication::applicationDirPath()
             + "/myMusic");
    QDir dirbsolutePath(dir.absolutePath());
    /* 如果目錄存在 */
    if (dirbsolutePath.exists()) {
        /* 定義過濾器 */
        QStringList filter;
        /* 包含所有.mp3后綴的文件 */
        filter << "*.mp3";
        /* 獲取該目錄下的所有文件 */
        QFileInfoList files =
                dirbsolutePath.entryInfoList(filter, QDir::Files);
        /* 遍歷 */
        for (int i = 0; i < files.count(); i++) {
            MediaObjectInfo info;
            /* 使用utf-8編碼 */
            QString fileName = QString::fromUtf8(files.at(i)
                                                 .fileName()
                                                 .replace(".mp3", "")
                                                 .toUtf8()
                                                 .data());
            info.fileName = fileName + "\n"
                    + fileName.split("-").at(1);
            info.filePath = QString::fromUtf8(files.at(i)
                                              .filePath()
                                              .toUtf8()
                                              .data());
            /* 媒體列表添加歌曲 */
            if (mediaPlaylist->addMedia(
                        QUrl::fromLocalFile(info.filePath))) {
                /* 添加到容器數(shù)組里儲(chǔ)存 */
                mediaObjectInfo.append(info);
                /* 添加歌曲名字至列表 */
                listWidget->addItem(info.fileName);
            } else {
                qDebug()<<
                           mediaPlaylist->errorString()
                           .toUtf8().data()
                        << endl;
                qDebug()<< "  Error number:"
                         << mediaPlaylist->error()
                         << endl;
            }
        }
    }
}

void MainWindow::mediaPlayerInit()
{
    musicPlayer = new QMediaPlayer(this);
    mediaPlaylist = new QMediaPlaylist(this);
    /* 確保列表是空的 */
    mediaPlaylist->clear();
    /* 設(shè)置音樂播放器的列表為mediaPlaylist */
    musicPlayer->setPlaylist(mediaPlaylist);
    /* 設(shè)置播放模式,Loop是列循環(huán) */
    mediaPlaylist->setPlaybackMode(QMediaPlaylist::Loop);
}

上述代碼就是常規(guī)的 QT 頁(yè)面布局以及操作函數(shù)和信號(hào),代碼參考了正點(diǎn)原子的教程。特別需要注意的地方是需要在 QMusic 的功能頁(yè)中加入退出按鈕,即切換至其父進(jìn)程!具體如下圖:

imx6ull linux項(xiàng)目,程序員,嵌入式

運(yùn)行結(jié)果:

imx6ull linux項(xiàng)目,程序員,嵌入式

3.2 QVideo視頻播放器

視頻播放器依舊是各家嵌入式機(jī)構(gòu)QT練習(xí)的常規(guī)項(xiàng)目,與音樂播放器一樣使用 QMediaPlayer 類,不同的是需要使用 setVideoOutput(QVideoWidget*) 設(shè)置一個(gè)視頻輸出窗口,好讓視頻在此窗口顯示,其他步驟基本都一樣。

★在項(xiàng)目文件 15_videoplayer.pro 文件第一行添加的代碼:multimedia multimediawidgets

imx6ull linux項(xiàng)目,程序員,嵌入式

在頭文件 “mainwindow.h” 具體代碼如下

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QPushButton>
#include <QSlider>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QListWidget>
#include <QLabel>
#include <QSpacerItem>
#include <QVideoWidget>
#include <QDebug>

/* 媒體信息結(jié)構(gòu)體 */
struct MediaObjectInfo {
    /* 用于保存視頻文件名 */
    QString fileName;
    /* 用于保存視頻文件路徑 */
    QString filePath;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    /* 媒體播放器,用于播放視頻 */
    QMediaPlayer *videoPlayer;

    /* 媒體列表 */
    QMediaPlaylist *mediaPlaylist;

    /* 視頻顯示窗口 */
    QVideoWidget *videoWidget;

    /* 視頻列表 */
    QListWidget *listWidget;

    /* 播放進(jìn)度條 */
    QSlider *durationSlider;

    /* 音量條 */
    QSlider *volumeSlider;

    /* 視頻播放器按鈕 */
    QPushButton *pushButton[5];

    QPushButton *exit_button;

    /* 水平布局 */
    QHBoxLayout *hBoxLayout[3];

    /* 水平容器 */
    QWidget *hWidget[3];

    /* 標(biāo)簽文本 */
    QLabel *label[2];

    /* 垂直容器 */
    QWidget *vWidget[2];

    /* 垂直界面 */
    QVBoxLayout *vBoxLayout[2];

    /* 視頻布局函數(shù) */
    void videoLayout();

    /* 主窗體大小重設(shè)大小函數(shù)重寫 */
    void resizeEvent(QResizeEvent *event);

    /* 媒體信息存儲(chǔ) */
    QVector<MediaObjectInfo> mediaObjectInfo;

    /* 掃描本地視頻文件 */
    void scanVideoFiles();

    /* 媒體初始化 */
    void mediaPlayerInit();
private slots:
    /* 播放按鈕點(diǎn)擊 */
    void btn_play_clicked();

    /* 下一個(gè)視頻按鈕點(diǎn)擊 */
    void btn_next_clicked();

    /* 音量加 */
    void btn_volmeup_clicked();

    /* 音量減 */
    void btn_volmedown_clicked();

    /* 全屏 */
    void btn_fullscreen_clicked();

    /* 媒體狀態(tài)改變 */
    void mediaPlayerStateChanged(QMediaPlayer::State);

    /* 列表單擊 */
    void listWidgetCliked(QListWidgetItem*);

    /* 媒體列表項(xiàng)改變 */
    void mediaPlaylistCurrentIndexChanged(int);

    /* 媒體總長(zhǎng)度改變 */
    void musicPlayerDurationChanged(qint64);

    /* 媒體播放位置改變 */
    void mediaPlayerPositionChanged(qint64);

    /* 播放進(jìn)度條松開 */
    void durationSliderReleased();

    /* 音量條松開 */
    void volumeSliderReleased();
};
#endif // MAINWINDOW_H

在源文件**“mainwindow.cpp”**具體代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-844557.html

#include "mainwindow.h"
#include <QCoreApplication>
#include <QFileInfoList>
#include <QDir>
#include <QProcess>


QProcess * mypro;
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    /* 視頻播放器布局初始化 */
    videoLayout();

    /* 媒體初始化 */
    mediaPlayerInit();

    /* 掃描本地視頻 */
    scanVideoFiles();

    /* 設(shè)置按鈕的屬性 */
    pushButton[0]->setCheckable(true);
    pushButton[4]->setCheckable(true);

    /* 按鈕連接信號(hào)槽 */
    connect(pushButton[0], SIGNAL(clicked()),
            this, SLOT(btn_play_clicked()));
    connect(pushButton[1], SIGNAL(clicked()),
            this, SLOT(btn_next_clicked()));
    connect(pushButton[2], SIGNAL(clicked()),
            this, SLOT(btn_volmedown_clicked()));
    connect(pushButton[3], SIGNAL(clicked()),
            this, SLOT(btn_volmeup_clicked()));
    connect(pushButton[4], SIGNAL(clicked()),
            this, SLOT(btn_fullscreen_clicked()));

    /* 列表連接信號(hào)槽 */
    connect(listWidget, SIGNAL(itemClicked(QListWidgetItem*)),
            this, SLOT(listWidgetCliked(QListWidgetItem*)));

    /* 媒體連接信號(hào)槽 */
    connect(videoPlayer,
            SIGNAL(stateChanged(QMediaPlayer::State)),
            this,
            SLOT(mediaPlayerStateChanged(QMediaPlayer::State)));
    connect(mediaPlaylist,
            SIGNAL(currentIndexChanged(int)),
            this,
            SLOT(mediaPlaylistCurrentIndexChanged(int)));
    connect(videoPlayer, SIGNAL(durationChanged(qint64)),
            this,
            SLOT(musicPlayerDurationChanged(qint64)));
    connect(videoPlayer,
            SIGNAL(positionChanged(qint64)),
            this,
            SLOT(mediaPlayerPositionChanged(qint64)));

    /* slider信號(hào)槽連接 */
    connect(durationSlider, SIGNAL(sliderReleased()),
            this, SLOT(durationSliderReleased()));
    connect(volumeSlider, SIGNAL(sliderReleased()),
            this, SLOT(volumeSliderReleased()));

    /* 退出按鈕 */
    exit_button = new QPushButton(this);
    exit_button->setMinimumSize(60, 50);
    exit_button->setMaximumSize(60, 50);
    exit_button->move(740,10);
    exit_button->setStyleSheet("QPushButton{background: black}");

    connect(exit_button,&QPushButton::clicked,[=](){
        mypro->close();
        exit(1);//退出程序
    });

}

MainWindow::~MainWindow()
{
}

void MainWindow::videoLayout()
{
    /* 設(shè)置位置與大小,這里固定為800, 480 */
    this->setGeometry(0, 0, 800, 480);
    //    this->setMinimumSize(800, 480);
    //    this->setMaximumSize(800, 480);
    QPalette pal;
    pal.setColor(QPalette::WindowText, Qt::white);

    for (int i = 0; i < 3; i++) {
        /* 水平容器 */
        hWidget[i] = new QWidget();
        hWidget[i]->setAutoFillBackground(true);
        /* 水平布局 */
        hBoxLayout[i] = new QHBoxLayout();
    }

    for (int i = 0; i < 2; i++) {
        /* 垂直容器 */
        vWidget[i] = new QWidget();
        vWidget[i]->setAutoFillBackground(true);
        /* 垂直布局 */
        vBoxLayout[i] = new QVBoxLayout();
    }

    for (int i = 0; i < 2; i++) {
        label[i] = new QLabel();
    }

    for (int i = 0; i < 5; i++) {
        pushButton[i] = new QPushButton();
        pushButton[i]->setMaximumSize(44, 44);
        pushButton[i]->setMinimumSize(44, 44);
    }

    /* 設(shè)置 */
    vWidget[0]->setObjectName("vWidget0");
    vWidget[1]->setObjectName("vWidget1");
    hWidget[1]->setObjectName("hWidget1");
    hWidget[2]->setObjectName("hWidget2");
    pushButton[0]->setObjectName("btn_play");
    pushButton[1]->setObjectName("btn_next");
    pushButton[2]->setObjectName("btn_volumedown");
    pushButton[3]->setObjectName("btn_volumeup");
    pushButton[4]->setObjectName("btn_screen");

    QFont font;

    font.setPixelSize(18);
    label[0]->setFont(font);
    label[1]->setFont(font);

    pal.setColor(QPalette::WindowText, Qt::white);
    label[0]->setPalette(pal);
    label[1]->setPalette(pal);

    label[0]->setText("00:00");
    label[1]->setText("/00:00");

    durationSlider = new QSlider(Qt::Horizontal);
    durationSlider->setMaximumHeight(15);
    durationSlider->setObjectName("durationSlider");

    volumeSlider = new QSlider(Qt::Horizontal);
    volumeSlider->setRange(0, 100);
    volumeSlider->setMaximumWidth(80);
    volumeSlider->setObjectName("volumeSlider");
    volumeSlider->setValue(50);

    listWidget = new QListWidget();
    listWidget->setObjectName("listWidget");
    listWidget->setVerticalScrollBarPolicy(
                Qt::ScrollBarAlwaysOff);
    listWidget->setHorizontalScrollBarPolicy(
                Qt::ScrollBarAlwaysOff);
    //listWidget->setFocusPolicy(Qt::NoFocus);
    videoWidget = new QVideoWidget();
    videoWidget->setStyleSheet("border-image: none;"
                               "background: transparent;"
                               "border:none");

    /* H0布局 */
    vWidget[0]->setMinimumSize(300, 480);
    vWidget[0]->setMaximumWidth(300);
    videoWidget->setMinimumSize(500, 480);

    hBoxLayout[0]->addWidget(videoWidget);
    hBoxLayout[0]->addWidget(vWidget[0]);

    hWidget[0]->setLayout(hBoxLayout[0]);
    hBoxLayout[0]->setContentsMargins(0, 0, 0, 0);

    setCentralWidget(hWidget[0]);

    /* V0布局 */
    QSpacerItem *vSpacer0 = new
            QSpacerItem(0, 80,
                        QSizePolicy::Minimum,
                        QSizePolicy::Maximum);
    vBoxLayout[0]->addWidget(listWidget);
    vBoxLayout[0]->addSpacerItem(vSpacer0);
    vBoxLayout[0]->setContentsMargins(0, 0, 0, 0);

    vWidget[0]->setLayout(vBoxLayout[0]);

    /* V1布局 */
    /* 底板部件布局 */
    hWidget[1]->setMaximumHeight(15);
    hWidget[2]->setMinimumHeight(65);
    vBoxLayout[1]->addWidget(hWidget[1]);
    vBoxLayout[1]->addWidget(hWidget[2]);
    vBoxLayout[1]->setAlignment(Qt::AlignCenter);

    vWidget[1]->setLayout(vBoxLayout[1]);
    vWidget[1]->setParent(this);
    vWidget[1]->setGeometry(0, this->height() - 80, this->width(), 80);
    vBoxLayout[1]->setContentsMargins(0, 0, 0, 0);
    /* 位于最上層 */
    vWidget[1]->raise();

    /* H1布局 */
    hBoxLayout[1]->addWidget(durationSlider);
    hBoxLayout[1]->setContentsMargins(0, 0, 0, 0);
    hWidget[1]->setLayout(hBoxLayout[1]);

    /* H2布局 */
    QSpacerItem *hSpacer0 = new
            QSpacerItem(300, 80,
                        QSizePolicy::Expanding,
                        QSizePolicy::Maximum);

    hBoxLayout[2]->addSpacing(20);
    hBoxLayout[2]->addWidget(pushButton[0]);
    hBoxLayout[2]->addSpacing(10);
    hBoxLayout[2]->addWidget(pushButton[1]);
    hBoxLayout[2]->addSpacing(10);
    hBoxLayout[2]->addWidget(pushButton[2]);
    hBoxLayout[2]->addWidget(volumeSlider);
    hBoxLayout[2]->addWidget(pushButton[3]);
    hBoxLayout[2]->addWidget(label[0]);
    hBoxLayout[2]->addWidget(label[1]);
    hBoxLayout[2]->addSpacerItem(hSpacer0);
    hBoxLayout[2]->addWidget(pushButton[4]);
    hBoxLayout[2]->addSpacing(20);
    hBoxLayout[2]->setContentsMargins(0, 0, 0, 0);
    hBoxLayout[2]->setAlignment(Qt::AlignLeft | Qt::AlignTop);

    hWidget[2]->setLayout(hBoxLayout[2]);
}

void MainWindow::mediaPlayerInit()
{
    videoPlayer = new QMediaPlayer(this);
    mediaPlaylist = new QMediaPlaylist(this);
    /* 確保列表是空的 */
    mediaPlaylist->clear();
    /* 設(shè)置視頻播放器的列表為mediaPlaylist */
    videoPlayer->setPlaylist(mediaPlaylist);
    /* 設(shè)置視頻輸出窗口 */
    videoPlayer->setVideoOutput(videoWidget);
    /* 設(shè)置播放模式,Loop是列循環(huán) */
    mediaPlaylist->setPlaybackMode(QMediaPlaylist::Loop);
    /* 設(shè)置默認(rèn)軟件音量為50% */
    videoPlayer->setVolume(50);
}

void MainWindow::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event);
    vWidget[1]->setGeometry(0, this->height() - 80, this->width(), 80);
}

void MainWindow::btn_play_clicked()
{
    int state = videoPlayer->state();
    switch (state) {
    case QMediaPlayer::StoppedState:
        /* 媒體播放 */
        videoPlayer->play();
        break;

    case QMediaPlayer::PlayingState:
        /* 媒體暫停 */
        videoPlayer->pause();
        break;

    case QMediaPlayer::PausedState:
        /* 設(shè)置視頻輸出窗口 */
        videoPlayer->play();
        break;
    }
}

void MainWindow::btn_next_clicked()
{
    videoPlayer->stop();
    int count = mediaPlaylist->mediaCount();
    if (0 == count)
        return;

    /* 列表下一個(gè) */
    mediaPlaylist->next();
    videoPlayer->play();
}

void MainWindow::btn_volmeup_clicked()
{
    /* 點(diǎn)擊每次音量+5 */
    volumeSlider->setValue(volumeSlider->value() + 5);
    videoPlayer->setVolume(volumeSlider->value());
}

void MainWindow::btn_fullscreen_clicked()
{
    /* 全屏/非全屏操作 */
    vWidget[0]->setVisible(!pushButton[4]->isChecked());
}

void MainWindow::btn_volmedown_clicked()
{
    /* 點(diǎn)擊每次音量-5 */
    volumeSlider->setValue(volumeSlider->value() - 5);
    videoPlayer->setVolume(volumeSlider->value());
}

void MainWindow::mediaPlayerStateChanged(
        QMediaPlayer::State
        state)
{
    switch (state) {
    case QMediaPlayer::StoppedState:
        pushButton[0]->setChecked(false);
        break;

    case QMediaPlayer::PlayingState:
        pushButton[0]->setChecked(true);
        break;

    case QMediaPlayer::PausedState:
        pushButton[0]->setChecked(false);
        break;
    }
}

void MainWindow::listWidgetCliked(QListWidgetItem *item)
{
    videoPlayer->stop();
    mediaPlaylist->setCurrentIndex(listWidget->row(item));
    videoPlayer->play();
}

void MainWindow::mediaPlaylistCurrentIndexChanged(
        int index)
{
    if (-1 == index)
        return;

    /* 設(shè)置列表正在播放的項(xiàng) */
    listWidget->setCurrentRow(index);
}

void MainWindow::musicPlayerDurationChanged(
        qint64 duration)
{
    durationSlider->setRange(0, duration / 1000);
    int second  = duration / 1000;
    int minute = second / 60;
    second %= 60;

    QString mediaDuration;
    mediaDuration.clear();

    if (minute >= 10)
        mediaDuration = QString::number(minute, 10);
    else
        mediaDuration = "0" + QString::number(minute, 10);

    if (second >= 10)
        mediaDuration = mediaDuration
                + ":" + QString::number(second, 10);
    else
        mediaDuration = mediaDuration
                + ":0" + QString::number(second, 10);

    /* 顯示媒體總長(zhǎng)度時(shí)間 */
    label[1]->setText("/" + mediaDuration);
}

void MainWindow::mediaPlayerPositionChanged(
        qint64 position)
{
    if (!durationSlider->isSliderDown())
        durationSlider->setValue(position / 1000);

    int second  = position / 1000;
    int minute = second / 60;
    second %= 60;

    QString mediaPosition;
    mediaPosition.clear();

    if (minute >= 10)
        mediaPosition = QString::number(minute, 10);
    else
        mediaPosition = "0" + QString::number(minute, 10);

    if (second >= 10)
        mediaPosition = mediaPosition
                + ":" + QString::number(second, 10);
**自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。**

**深知大多數(shù)嵌入式工程師,想要提升技能,往往是自己摸索成長(zhǎng)或者是報(bào)班學(xué)習(xí),但對(duì)于培訓(xùn)機(jī)構(gòu)動(dòng)則幾千的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前!**

**因此收集整理了一份《2024年嵌入式&物聯(lián)網(wǎng)開發(fā)全套學(xué)習(xí)資料》,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。**

imx6ull linux項(xiàng)目,程序員,嵌入式

imx6ull linux項(xiàng)目,程序員,嵌入式

imx6ull linux項(xiàng)目,程序員,嵌入式

 **既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上嵌入式&物聯(lián)網(wǎng)開發(fā)知識(shí)點(diǎn),真正體系化!**

imx6ull linux項(xiàng)目,程序員,嵌入式

imx6ull linux項(xiàng)目,程序員,嵌入式

 

**由于文件比較大,這里只是將部分目錄大綱截圖出來,每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會(huì)持續(xù)更新**

**如果你覺得這些內(nèi)容對(duì)你有幫助,可以+V:Vip1104z獲?。。?! (備注:嵌入式)**

<img src="https://



# 最后

**資料整理不易,覺得有幫助的朋友可以幫忙點(diǎn)贊分享支持一下小編~**

**你的支持,我的動(dòng)力;祝各位前程似錦,offer不斷,步步高升?。。?*

   /* 顯示媒體總長(zhǎng)度時(shí)間 */
    label[1]->setText("/" + mediaDuration);
}

void MainWindow::mediaPlayerPositionChanged(
        qint64 position)
{
    if (!durationSlider->isSliderDown())
        durationSlider->setValue(position / 1000);

    int second  = position / 1000;
    int minute = second / 60;
    second %= 60;

    QString mediaPosition;
    mediaPosition.clear();

    if (minute >= 10)
        mediaPosition = QString::number(minute, 10);
    else
        mediaPosition = "0" + QString::number(minute, 10);

    if (second >= 10)
        mediaPosition = mediaPosition
                + ":" + QString::number(second, 10);
**自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。**

**深知大多數(shù)嵌入式工程師,想要提升技能,往往是自己摸索成長(zhǎng)或者是報(bào)班學(xué)習(xí),但對(duì)于培訓(xùn)機(jī)構(gòu)動(dòng)則幾千的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前!**

**因此收集整理了一份《2024年嵌入式&物聯(lián)網(wǎng)開發(fā)全套學(xué)習(xí)資料》,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。**

[外鏈圖片轉(zhuǎn)存中...(img-OqHqMWfJ-1712382462148)]

[外鏈圖片轉(zhuǎn)存中...(img-PmH8rlSC-1712382462149)]

[外鏈圖片轉(zhuǎn)存中...(img-75sdQibn-1712382462150)]

 **既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上嵌入式&物聯(lián)網(wǎng)開發(fā)知識(shí)點(diǎn),真正體系化!**

[外鏈圖片轉(zhuǎn)存中...(img-wRgIHtu7-1712382462151)]

[外鏈圖片轉(zhuǎn)存中...(img-znu7l7JS-1712382462152)]

 

**由于文件比較大,這里只是將部分目錄大綱截圖出來,每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會(huì)持續(xù)更新**

**如果你覺得這些內(nèi)容對(duì)你有幫助,可以+V:Vip1104z獲?。。。?(備注:嵌入式)**

<img src="https://



# 最后

**資料整理不易,覺得有幫助的朋友可以幫忙點(diǎn)贊分享支持一下小編~**

**你的支持,我的動(dòng)力;祝各位前程似錦,offer不斷,步步高升?。。?*

**[更多資料點(diǎn)擊此處獲qu?。(https://bbs.csdn.net/topics/618376385)**

到了這里,關(guān)于基于IMX6ULL的智能車載終端項(xiàng)目(代碼開源)_imx6ull 開源 linux 項(xiàng)目 車載終端的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【基于IMX6ULL開發(fā)板開機(jī)攝像頭的自啟動(dòng)】

    這里簡(jiǎn)述項(xiàng)目相關(guān)背景: 最近在準(zhǔn)備暑期實(shí)習(xí)和秋招,準(zhǔn)備一個(gè)Camera項(xiàng)目,涉及調(diào)試內(nèi)核、優(yōu)化開機(jī)——從啟動(dòng)到獲取第一幀圖像的時(shí)間,硬件平臺(tái)為 正點(diǎn)原子IMX6ULL開發(fā)板 ,攝像頭為 OV5640 ,內(nèi)核基于正點(diǎn)原子出廠linux源碼,根文件系統(tǒng)暫時(shí)選擇正點(diǎn)原子出廠文件系統(tǒng) 首先

    2024年02月08日
    瀏覽(18)
  • 嵌入式Linux實(shí)戰(zhàn)開發(fā)之項(xiàng)目總體概述(基于IMX6ULL)

    嵌入式Linux實(shí)戰(zhàn)開發(fā)之項(xiàng)目總體概述(基于IMX6ULL)

    現(xiàn)在越來越多的智能設(shè)備融入到我們的生活,然而,豐富的設(shè)備之下也是有一套基本的運(yùn)行框架,只是根據(jù)不同的需求增減相應(yīng)的功能從而滿足自身的需要。而電子產(chǎn)品量產(chǎn)工具項(xiàng)目,就是實(shí)現(xiàn)基礎(chǔ)的功能,可以作為一個(gè)基礎(chǔ)的模版,學(xué)成之后便可進(jìn)行擴(kuò)展,根據(jù)自身需求,

    2024年02月13日
    瀏覽(84)
  • iMX6ULL驅(qū)動(dòng)開發(fā) | 讓imx6ull開發(fā)板支持usb接口FC游戲手柄

    iMX6ULL驅(qū)動(dòng)開發(fā) | 讓imx6ull開發(fā)板支持usb接口FC游戲手柄

    手邊有一閑置的linux開發(fā)板iMX6ULL一直在吃灰,不用來搞點(diǎn)事情,總覺得對(duì)不住它。業(yè)余打發(fā)時(shí)間就玩起來吧,總比刷某音強(qiáng)。從某多多上買來一個(gè)usb接口的游戲手柄,讓開發(fā)板支持以下它,后續(xù)就可以接著在上面玩童年經(jīng)典游戲啦。 ?我使用的是正點(diǎn)原子的I.MX6U-ALPHA 開發(fā)板,

    2024年02月14日
    瀏覽(38)
  • 【IMX6ULL驅(qū)動(dòng)開發(fā)學(xué)習(xí)】08.IMX6ULL通過GPIO子系統(tǒng)函數(shù)點(diǎn)亮LED

    【IMX6ULL驅(qū)動(dòng)開發(fā)學(xué)習(xí)】08.IMX6ULL通過GPIO子系統(tǒng)函數(shù)點(diǎn)亮LED

    通過GPIO子系統(tǒng)函數(shù)點(diǎn)亮LED 1、GPIO子系統(tǒng)函數(shù) 1.1 確定 led 的GPIO標(biāo)號(hào),查看內(nèi)核中的gpiochip 查看 gpiochip ,以正點(diǎn)原子的IMX6ULL阿爾法開發(fā)板為例 查看原理圖,發(fā)現(xiàn)led接的引腳是 GPIO1_IO3,對(duì)應(yīng) /sys/kernel/debug/gpio 中的 gpiochip0 組,gpiochip0 組從0開始算起, 所以 GPIO1_IO3 對(duì)應(yīng)的標(biāo)號(hào)就

    2024年02月10日
    瀏覽(23)
  • 【IMX6ULL驅(qū)動(dòng)開發(fā)學(xué)習(xí)】22.IMX6ULL開發(fā)板讀取ADC(以MQ-135為例)

    【IMX6ULL驅(qū)動(dòng)開發(fā)學(xué)習(xí)】22.IMX6ULL開發(fā)板讀取ADC(以MQ-135為例)

    IMX6ULL一共有兩個(gè)ADC,每個(gè)ADC都有八個(gè)通道,但他們共用一個(gè)ADC控制器 在imx6ull.dtsi文件中已經(jīng)幫我們定義好了adc1的節(jié)點(diǎn)部分信息 注意 num-channels = 2; ,這個(gè)表示指定使用ADC1的兩個(gè)通道,即通道1和通道2 如果你要使用多個(gè)ADC通道,修改這個(gè)值即可 配置ADC引腳的 pinctrl ,在自己的

    2024年02月12日
    瀏覽(60)
  • 【IMX6ULL驅(qū)動(dòng)開發(fā)學(xué)習(xí)】05.IMX6ULL驅(qū)動(dòng)開發(fā)_編寫第一個(gè)hello驅(qū)動(dòng)【熬夜肝】

    【IMX6ULL驅(qū)動(dòng)開發(fā)學(xué)習(xí)】05.IMX6ULL驅(qū)動(dòng)開發(fā)_編寫第一個(gè)hello驅(qū)動(dòng)【熬夜肝】

    經(jīng)過以下四個(gè)步驟,終于可以開始驅(qū)動(dòng)開發(fā)了 01.安裝交叉編譯環(huán)境【附下載地址】 02.IMX6ULL燒寫Linux系統(tǒng) 03.設(shè)置IMX6ULL開發(fā)板與虛擬機(jī)在同一網(wǎng)段 04.IMX6ULL開發(fā)板與虛擬機(jī)互傳文件 一、獲取內(nèi)核、編譯內(nèi)核 二、創(chuàng)建vscode工作區(qū),添加內(nèi)核目錄和個(gè)人目錄 三、了解驅(qū)動(dòng)程序編寫

    2024年02月06日
    瀏覽(17)
  • 【IMX6ULL驅(qū)動(dòng)開發(fā)學(xué)習(xí)】15.IMX6ULL驅(qū)動(dòng)開發(fā)問題記錄(sleep被kill_fasync打斷)

    【IMX6ULL驅(qū)動(dòng)開發(fā)學(xué)習(xí)】15.IMX6ULL驅(qū)動(dòng)開發(fā)問題記錄(sleep被kill_fasync打斷)

    發(fā)現(xiàn)問題的契機(jī): 學(xué)習(xí)異步通知的時(shí)候,自己實(shí)現(xiàn)一個(gè)功能:按鍵控制蜂鳴器,同時(shí)LED燈在閃爍 結(jié)果:LED好像也同時(shí)被按鍵控制了 最后調(diào)試結(jié)果發(fā)現(xiàn): 應(yīng)用層的 sleep 被驅(qū)動(dòng)層的 kill_fasync 打斷,所以sleep沒有執(zhí)行完就重新進(jìn)入下一次循環(huán)了 修改代碼后解決該問題 解決邏輯就

    2024年02月13日
    瀏覽(17)
  • 基于IMX6ULL的AP3216C的QT動(dòng)態(tài)數(shù)據(jù)曲線圖顯示

    基于IMX6ULL的AP3216C的QT動(dòng)態(tài)數(shù)據(jù)曲線圖顯示

    前言: 本文為手把手教學(xué) Linux+QT 的典型基礎(chǔ)項(xiàng)目 AP3216C 的數(shù)據(jù)折線圖顯示,項(xiàng)目使用正點(diǎn)原子的 IMX6ULL ?阿爾法( Cortex-A7 系列)開發(fā)板。項(xiàng)目需要實(shí)現(xiàn) AP3216C 在 Linux 系統(tǒng)下的驅(qū)動(dòng),使用 QT 設(shè)計(jì) AP3216C 的數(shù)據(jù)顯示頁(yè)面作為項(xiàng)目的應(yīng)用層。該項(xiàng)目屬于非常簡(jiǎn)單的入門級(jí)項(xiàng)目,核心

    2024年02月16日
    瀏覽(34)
  • IMX6ull SPI 協(xié)議

    IMX6ull SPI 協(xié)議

    1.1 SPI SPI 全稱是 Serial Perripheral Interface,也就是 串行外圍設(shè)備接口 。 SPI 是 Motorola 公司推出的一種同步串行接口 技術(shù),是一種高速、 全雙工的同步通信總線 , SPI 時(shí)鐘頻率相比 I2C 要高很多,最高可以工作 在 上百 MH z。 SPI 以主從方式工作,通常是有一個(gè)主設(shè)備和一個(gè)或多

    2024年02月12日
    瀏覽(26)
  • 【IMX6ULL驅(qū)動(dòng)開發(fā)學(xué)習(xí)】03.設(shè)置IMX6ULL開發(fā)板與虛擬機(jī)在同一網(wǎng)段(設(shè)置開發(fā)板靜態(tài)IP)

    【IMX6ULL驅(qū)動(dòng)開發(fā)學(xué)習(xí)】03.設(shè)置IMX6ULL開發(fā)板與虛擬機(jī)在同一網(wǎng)段(設(shè)置開發(fā)板靜態(tài)IP)

    為什么要設(shè)置IMX6ULL與虛擬機(jī)通信? 因?yàn)橐言谔摂M機(jī)下編譯的文件傳到IMX6ULL開發(fā)板上運(yùn)行 設(shè)置好同一網(wǎng)段,可以互ping后,可以參考這篇博客,實(shí)現(xiàn)開發(fā)板與虛擬機(jī)的文件互傳 IMX6ULL開發(fā)板與虛擬機(jī)互傳文件 一、設(shè)置windows有線網(wǎng)卡 二、配置虛擬機(jī)雙網(wǎng)卡(原本有一個(gè)NAT網(wǎng)卡

    2024年02月07日
    瀏覽(48)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包