成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Qtffmpeg控制播放怎么實現(xiàn)

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

創(chuàng)新互聯(lián)建站主營浉河網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā),浉河h5微信小程序定制開發(fā)搭建,浉河網(wǎng)站營銷推廣歡迎浉河等地區(qū)企業(yè)咨詢

一、前言

很多人在用ffmpeg做視頻流解碼的時候,都會遇到一個問題,如何暫停,如果打開的是本地視頻文件,暫停你只需要停止解碼即可,但是視頻流你會發(fā)現(xiàn)根本沒用,一旦你停止了解碼,下次重新解碼的時候,居然還是以前的圖片,他是從你最后暫停開始的地方重新解碼的,這就懵逼了,為啥呢?我個人的理解是視頻流這玩意,一旦你打開了,他就源源不斷涌過來,你不處理,他就越來越多,你必須要讀取他,從緩沖區(qū)拿走這些數(shù)據(jù)才行,所以如果想要暫停視頻流,正確的做法是照常解碼,只是不處理和繪制圖片就行,說白了其實就是偽暫停,看起來是暫停了,其實后臺還在不斷的解碼中。

用ffmpeg播放本地文件的時候,如果不加延時,你會發(fā)現(xiàn)刷刷幾秒鐘就播放完了,具體看電腦的性能,性能好的電腦也就幾秒鐘播放一個5分鐘的視頻,是不是會覺得很奇怪呢,怎么播放的這么快呢,其實ffmpeg解碼只管解碼,瘋狂解碼模式,使命的干,榨干你的CPU或者GPU資源(如果開啟了硬解碼則走GPU),解碼后的每一幀都帶有pts dts等信息,需要自己根據(jù)這些信息來做延時處理,比如還沒到下一幀的時候,你就延時一段時間再去解碼,至于延時多久有一個通用的計算方法,在打開流后記住開始的時間。然后解碼中取出對應(yīng)流(視頻流或者音頻流等)的基準時間time_base,調(diào)用av_rescale_q計算出pts時間,然后用av_gettime() - startTime得到當前的時間,用pts_time - now_time得到時間差值,如果是正數(shù),則這個時間就是需要延時的微秒數(shù),注意是微秒數(shù)而不是毫秒數(shù)哦,直接調(diào)用av_usleep來延時即可。

二、功能特點

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

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

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

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

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

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

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

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

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

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

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

  12. 支持存儲單個視頻文件和定時存儲視頻文件。

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

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

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

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

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

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

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

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

三、效果圖

四、核心代碼

void FFmpegWidget::updateImage(const QImage &image)
{
    //暫?;蛘卟豢梢?nbsp;rtsp視頻流需要停止繪制
    if (!this->property("isPause").toBool() && this->isVisible() && thread->isRunning()) {
        //拷貝圖片有個好處,當處理器比較差的時候,圖片不會產(chǎn)生斷層,缺點是占用時間
        //默認QImage類型是淺拷貝,可能正在繪制的時候,那邊已經(jīng)更改了圖片的上部分數(shù)據(jù)
        this->image = copyImage ? image.copy() : image;
        this->update();
    }
}

void FFmpegWidget::updateFrame(AVFrame *frame)
{
#ifdef opengl
    //暫?;蛘卟豢梢?nbsp;rtsp視頻流需要停止繪制
    if (!this->property("isPause").toBool() && (yuvWidget->isVisible() || nv12Widget->isVisible()) && thread->isRunning()) {
        //采用了硬件加速的直接用nv12渲染,否則采用yuv渲染
        if (thread->getHardware() == "none") {
            yuvWidget->setFrameSize(frame->width, frame->height);
            yuvWidget->updateTextures(frame->data[0], frame->data[1], frame->data[2], frame->linesize[0], frame->linesize[1], frame->linesize[2]);
        } else {
            nv12Widget->setFrameSize(frame->width, frame->height);
            nv12Widget->updateTextures(frame->data[0], frame->data[1], frame->linesize[0], frame->linesize[1]);
        }
    }
#endif
}

void FFmpegThread::delayTime(int streamIndex, AVPacket *packet)
{
    //視頻流不用延時
    if (isRtsp) {
        return;
    }

    //沒有視頻時長的文件和asf的本地文件采用另外的延時計算
    if (streamIndex == videoStreamIndex) {
        if (interval != 1 || videoTime < 0 || url.toLower().endsWith("asf")) {
            sleepVideo();
            return;
        }
    }

    qint64 offset_time = getDelayTime(streamIndex, packet);
    if (offset_time > 0) {
        av_usleep(offset_time);
    }
}

qint64 FFmpegThread::getDelayTime(int streamIndex, AVPacket *packet)
{
    AVRational time_base = formatCtx->streams[streamIndex]->time_base;
    AVRational time_base_q = {1, AV_TIME_BASE};
    int64_t pts_time = av_rescale_q(packet->pts, time_base, time_base_q);
    int64_t now_time = av_gettime() - startTime;
    int64_t offset_time = pts_time - now_time;
    return offset_time;
}

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

本文名稱:Qtffmpeg控制播放怎么實現(xiàn)
文章來源:http://jinyejixie.com/article6/ipjpog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)靜態(tài)網(wǎng)站、云服務(wù)器網(wǎng)頁設(shè)計公司、建站公司

廣告

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

網(wǎng)站優(yōu)化排名
凤凰县| 伊吾县| 茂名市| 威远县| 咸丰县| 绍兴市| 左云县| 新昌县| 垫江县| 藁城市| 潞城市| 长宁区| 文成县| 汝州市| 隆德县| 巨鹿县| 黎平县| 嘉黎县| 南木林县| 吉安市| 宣城市| 盱眙县| 安丘市| 肇州县| 辉县市| 阿克| 稻城县| 黔江区| 德钦县| 唐河县| 富平县| 山阴县| 津市市| 红桥区| 南陵县| 丹棱县| 永宁县| 深泽县| 和平区| 河曲县| 石家庄市|