Qtffmpeg安卓版怎么實(shí)現(xiàn)

本篇內(nèi)容主要講解“Qt ffmpeg安卓版怎么實(shí)現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Qt ffmpeg安卓版怎么實(shí)現(xiàn)”吧!

創(chuàng)新互聯(lián)于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元玉門做網(wǎng)站,已為上家服務(wù),為玉門各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

一、前言

一直都想搞個(gè)安卓版本的視頻監(jiān)控程序,很早以前弄過一個(gè),采用的是早期的ffmpeg2的lib文件,對于現(xiàn)在眾多的網(wǎng)絡(luò)流媒體格式,支持有限,而且新的Qt編寫安卓程序,結(jié)構(gòu)上也變動了,新的安卓系統(tǒng)權(quán)限要求也和以前處理不一樣了,現(xiàn)在需要?jiǎng)討B(tài)授權(quán),以前是直接配置文件寫好需要哪些權(quán)限就行,所以近期特意全部重寫了一遍安卓版本的視頻監(jiān)控程序,內(nèi)核還是采用的ffmpeg,換成了最新的ffmpeg4版本,在ubuntu系統(tǒng)上用安卓編譯器編譯了對應(yīng)的lib文件,然后放到win上編寫Qt+安卓程序。

為了統(tǒng)一管理一個(gè)版本的ffmpeg視頻監(jiān)控內(nèi)核程序,直接在現(xiàn)有的程序上修改,增加了動態(tài)申請權(quán)限的代碼,同時(shí)對應(yīng)的進(jìn)度條和復(fù)選框等指示器放大,方便選中,通道畫面限定默認(rèn)4個(gè),可以自行增加畫面數(shù)量,一開始測試保存截圖和視頻文件的時(shí)候,發(fā)現(xiàn)死活不成功,后面動態(tài)權(quán)限申請成功以后,把把成功,這里搞了很久,原來對不一樣的安卓系統(tǒng)處理要求不一樣。新時(shí)代新技術(shù)層出不窮,迭代真是非常的快,想要保持活力看來還得不斷的學(xué)習(xí)及了解新技術(shù)新知識。一個(gè)有前途的程序員每天60%的時(shí)間要拿出來學(xué)習(xí)研究,40%用來應(yīng)付工作,這樣每兩年工資可翻一倍,而且最要命的是程序員也是要有一些天賦的,并非所有人都適合,大部分程序員把時(shí)間都扔在了業(yè)務(wù)邏輯之中,最后被淘汰!這也是35歲中年危機(jī)的主要原因。事實(shí)上有實(shí)力的程序員越老越值錢,扯遠(yuǎn)了!

二、功能特點(diǎn)

  1. 多線程實(shí)時(shí)播放視頻流+本地視頻+USB攝像頭等。

  2. 支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位。

  3. 多線程顯示圖像,不卡主界面。

  4. 自動重連網(wǎng)絡(luò)攝像頭。

  5. 可設(shè)置邊框大小即偏移量和邊框顏色。

  6. 可設(shè)置是否繪制OSD標(biāo)簽即標(biāo)簽文本或圖片和標(biāo)簽位置。

  7. 可設(shè)置兩種OSD位置和風(fēng)格。

  8. 可設(shè)置是否保存到文件以及文件名。

  9. 可直接拖曳文件到ffmpegwidget控件播放。

  10. 支持h365視頻流+rtmp等常見視頻流。

  11. 可暫停播放和繼續(xù)播放。

  12. 支持存儲單個(gè)視頻文件和定時(shí)存儲視頻文件。

  13. 自定義頂部懸浮條,發(fā)送單擊信號通知,可設(shè)置是否啟用。

  14. 可設(shè)置畫面拉伸填充或者等比例填充。

  15. 可設(shè)置解碼是速度優(yōu)先、質(zhì)量優(yōu)先、均衡處理。

  16. 可對視頻進(jìn)行截圖(原始圖片)和截屏。

  17. 錄像文件存儲支持裸流和MP4文件。

  18. 音視頻完美同步,采用外部時(shí)鐘同步策略。

  19. 支持seek定位播放位置。

  20. 支持qsv、dxva2、d3d11va等硬解碼。

  21. 支持opengl繪制視頻數(shù)據(jù),極低CPU占用。

  22. 支持安卓和嵌入式linux,交叉編譯即可。

三、效果圖

Qt ffmpeg安卓版怎么實(shí)現(xiàn) Qt ffmpeg安卓版怎么實(shí)現(xiàn) Qt ffmpeg安卓版怎么實(shí)現(xiàn)

四、核心代碼

#include "head.h"
#include "frmtab.h"

//動態(tài)設(shè)置權(quán)限
bool checkPermission(const QString &permission)
{
#ifdef Q_OS_ANDROID
#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
    QtAndroid::PermissionResult result = QtAndroid::checkPermission(permission);
    if (result == QtAndroid::PermissionResult::Denied) {
        QtAndroid::requestPermissionsSync(QStringList() << permission);
        result = QtAndroid::checkPermission(permission);
        if (result == QtAndroid::PermissionResult::Denied) {
            return false;
        }
    }
#endif
#endif
    return true;
}

void initStyle()
{
    //復(fù)選框單選框滑塊等指示器大小
    QStringList list;
    int rbtnWidth = 20;
    int ckWidth = 18;
    list.append(QString("QRadioButton::indicator{width:%1px;height:%1px;}").arg(rbtnWidth));
    list.append(QString("QCheckBox::indicator,QGroupBox::indicator,QTreeWidget::indicator,QListWidget::indicator{width:%1px;height:%1px;}").arg(ckWidth));

    QString normalColor = "#E8EDF2";
    QString grooveColor = "#1ABC9C";
    QString handleColor = "#1ABC9C";
    int sliderHeight = 12;
    int sliderRadius = sliderHeight / 2;
    int handleWidth = (sliderHeight * 3) / 2 + (sliderHeight / 5);
    int handleRadius = handleWidth / 2;
    int handleOffset = handleRadius / 2;

    list.append(QString("QSlider::horizontal{min-height:%1px;}").arg(sliderHeight * 2));
    list.append(QString("QSlider::groove:horizontal{background:%1;height:%2px;border-radius:%3px;}")
                .arg(normalColor).arg(sliderHeight).arg(sliderRadius));
    list.append(QString("QSlider::add-page:horizontal{background:%1;height:%2px;border-radius:%3px;}")
                .arg(normalColor).arg(sliderHeight).arg(sliderRadius));
    list.append(QString("QSlider::sub-page:horizontal{background:%1;height:%2px;border-radius:%3px;}")
                .arg(grooveColor).arg(sliderHeight).arg(sliderRadius));
    list.append(QString("QSlider::handle:horizontal{width:%2px;margin-top:-%3px;margin-bottom:-%3px;border-radius:%4px;"
                        "background:qradialgradient(spread:pad,cx:0.5,cy:0.5,radius:0.5,fx:0.5,fy:0.5,stop:0.6 #FFFFFF,stop:0.8 %1);}")
                .arg(handleColor).arg(handleWidth).arg(handleOffset).arg(handleRadius));

    //偏移一個(gè)像素
    handleWidth = handleWidth + 1;
    list.append(QString("QSlider::vertical{min-width:%1px;}").arg(sliderHeight * 2));
    list.append(QString("QSlider::groove:vertical{background:%1;width:%2px;border-radius:%3px;}")
                .arg(normalColor).arg(sliderHeight).arg(sliderRadius));
    list.append(QString("QSlider::add-page:vertical{background:%1;width:%2px;border-radius:%3px;}")
                .arg(grooveColor).arg(sliderHeight).arg(sliderRadius));
    list.append(QString("QSlider::sub-page:vertical{background:%1;width:%2px;border-radius:%3px;}")
                .arg(normalColor).arg(sliderHeight).arg(sliderRadius));
    list.append(QString("QSlider::handle:vertical{height:%2px;margin-left:-%3px;margin-right:-%3px;border-radius:%4px;"
                        "background:qradialgradient(spread:pad,cx:0.5,cy:0.5,radius:0.5,fx:0.5,fy:0.5,stop:0.6 #FFFFFF,stop:0.8 %1);}")
                .arg(handleColor).arg(handleWidth).arg(handleOffset).arg(handleRadius));

    qApp->setStyleSheet(list.join(""));
}

int main(int argc, char *argv[])
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
#if (QT_VERSION > QT_VERSION_CHECK(5,4,0))
    //設(shè)置opengl模式 AA_UseDesktopOpenGL AA_UseSoftwareOpenGL AA_UseOpenGLES
    //QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
#endif
    QApplication a(argc, argv);

    App::setFont();
    App::setCode();
    App::ConfigFile = AppPath + "/video_ffmpeg.ini";
    App::readConfig();

    frmTab w;
#ifdef Q_OS_ANDROID
    //請求權(quán)限
    checkPermission("android.permission.READ_EXTERNAL_STORAGE");
    checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");

    QString strDir = AppPath + "/snap";
    QDir dir(strDir);
    if (!dir.exists()) {
        dir.mkpath(strDir);
    }

    initStyle();
    w.showMaximized();
#else
    w.resize(1100, 700);
    w.setWindowTitle(QString("qt+ffmpeg 示例 %1 %2").arg(App::Version).arg(App::TitleFlag));
    w.show();
    App::setFormInCenter(&w);
#endif

    return a.exec();
}

到此,相信大家對“Qt ffmpeg安卓版怎么實(shí)現(xiàn)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)頁題目:Qtffmpeg安卓版怎么實(shí)現(xiàn)
標(biāo)題來源:http://muchs.cn/article2/pjjcoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、Google自適應(yīng)網(wǎng)站、標(biāo)簽優(yōu)化、App設(shè)計(jì)軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)