内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Qtfmpeg保存裸流怎么實(shí)現(xiàn)

這篇文章主要介紹“Qt fmpeg保存裸流怎么實(shí)現(xiàn)”,在日常操作中,相信很多人在Qt fmpeg保存裸流怎么實(shí)現(xiàn)問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Qt fmpeg保存裸流怎么實(shí)現(xiàn)”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供鄲城網(wǎng)站建設(shè)、鄲城做網(wǎng)站、鄲城網(wǎng)站設(shè)計(jì)、鄲城網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、鄲城企業(yè)網(wǎng)站模板建站服務(wù),十年鄲城做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

一、前言

最開始做的ffmpeg保存視頻文件,就是直接保存的裸流數(shù)據(jù),裸流數(shù)據(jù)一般是H264格式的數(shù)據(jù),這種數(shù)據(jù)文件可以用部分播放器播放,由于不是標(biāo)準(zhǔn)的格式,很多播放器其實(shí)不支持的,需要安裝對(duì)應(yīng)的解碼器才行。后面發(fā)現(xiàn)安裝好K-Lite解碼器后,連系統(tǒng)自帶的播放器都可以正常播放H264視頻流文件,而且如果同步保存了同名文件的aac音頻文件放在同目錄下的話,聲音都能正常同步播放,可能這是播放器做的處理吧。

直接保存裸流基本上沒有什么難度,大致流程就是先打開文件,然后在循環(huán)解碼的地方直接將解碼好的數(shù)據(jù)write到文件即可,如果采用的是定時(shí)存儲(chǔ)的話,那就開個(gè)定時(shí)器,到了點(diǎn)就先關(guān)閉文件,然后重新打開新的名字的文件,這里要注意的是,rtmp視頻流的話,需要添加pps sps等信息,所以在每幀寫入文件前,要先用AVBitStreamFilter采用h364_mp4toannexb處理下才行。

二、功能特點(diǎn)

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

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

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

  4. 自動(dòng)重連網(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. 支持存儲(chǔ)單個(gè)視頻文件和定時(shí)存儲(chǔ)視頻文件。

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

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

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

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

  17. 錄像文件存儲(chǔ)支持裸流和MP4文件。

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

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

  20. 支持嵌入式linux,交叉編譯即可。

三、效果圖

Qt fmpeg保存裸流怎么實(shí)現(xiàn)

四、核心代碼

void FFmpegThread::initSave()
{
    if (!saveFile) {
        return;
    }

    //如果存儲(chǔ)間隔大于0說明需要定時(shí)存儲(chǔ)
    if (saveInterval > 0) {
        QString dirName = QString("%1/%2").arg(savePath).arg(QDATE);
        newDir(dirName);
        fileName = QString("%1/%2_%3.mp4").arg(dirName).arg(fileFlag).arg(STRDATETIME);
        emit sig_startSave();
    }

    if (saveMp4) {
        saveVideoMp4(fileName);
    } else {
        saveVideoH264(fileName);
    }
}

void FFmpegThread::startSave()
{
    timerSave->start(saveInterval * 1000);
}

void FFmpegThread::stopSave()
{
    //停止存儲(chǔ)文件以及存儲(chǔ)定時(shí)器
    closeVideo();
    if (timerSave->isActive()) {
        timerSave->stop();
    }
}

void FFmpegThread::saveVideo()
{
    if (!saveFile) {
        return;
    }

    //重新設(shè)置文件名稱
    QString dirName = QString("%1/%2").arg(savePath).arg(QDATE);
    newDir(dirName);
    fileName = QString("%1/%2_%3.mp4").arg(dirName).arg(fileFlag).arg(STRDATETIME);

    if (saveMp4) {
        saveVideoMp4(fileName);
    } else {
        saveVideoH264(fileName);
    }
}

void FFmpegThread::closeVideo()
{
    if (!saveFile) {
        return;
    }

    if (saveMp4) {
        if (formatOut != NULL) {
            //寫入結(jié)束標(biāo)識(shí)
            av_write_trailer(formatOut);
            avcodec_close(formatOut->streams[0]->codec);
            av_freep(&formatOut->streams[0]->codec);
            av_freep(&formatOut->streams[0]);
            avio_close(formatOut->pb);
            av_free(formatOut);
            initSaveOk = false;
            formatOut = NULL;
        }
    } else {
        if (fileVideo.isOpen()) {
            fileVideo.close();
        }

        if (fileAudio.isOpen()) {
            fileAudio.close();
        }
    }
}

void FFmpegThread::saveVideoH264(const QString &fileName)
{
    QMutexLocker locker(&mutex);
    closeVideo();
    if (videoStreamIndex >= 0) {
        fileVideo.setFileName(fileName);
        fileVideo.open(QFile::WriteOnly);
    }

    //存在音頻文件則同時(shí)保存音頻文件
    if (audioStreamIndex >= 0 && playAudio) {
        QString audioName = fileName;
        audioName = audioName.replace(QFileInfo(audioName).suffix(), "aac");
        fileAudio.setFileName(audioName);
        fileAudio.open(QFile::WriteOnly);
    }
}

到此,關(guān)于“Qt fmpeg保存裸流怎么實(shí)現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

網(wǎng)站名稱:Qtfmpeg保存裸流怎么實(shí)現(xiàn)
鏈接地址:http://www.rwnh.cn/article28/psgicp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、服務(wù)器托管、App設(shè)計(jì)網(wǎng)站收錄、電子商務(wù)動(dòng)態(tài)網(wǎng)站

廣告

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

成都網(wǎng)站建設(shè)公司
华亭县| 和田县| 泸州市| 略阳县| 墨玉县| 廊坊市| 通州区| 岳池县| 木里| 马边| 元谋县| 汤阴县| 侯马市| 德保县| 遂溪县| 汤阴县| 佛坪县| 尉氏县| 阿坝| 东兰县| 长丰县| 靖安县| 晋中市| 筠连县| 泰顺县| 铜鼓县| 大厂| 安西县| 抚宁县| 广丰县| 新邵县| 弋阳县| 漯河市| 昌邑市| 安达市| 沅陵县| 延庆县| 乐清市| 吉安市| 安阳县| 秭归县|