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

Qt音視頻開(kāi)發(fā)44-本地?cái)z像頭推流(支持分辨率/幀率等設(shè)置/實(shí)時(shí)性極高)

這篇具有很好參考價(jià)值的文章主要介紹了Qt音視頻開(kāi)發(fā)44-本地?cái)z像頭推流(支持分辨率/幀率等設(shè)置/實(shí)時(shí)性極高)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、前言

本地?cái)z像頭推流和本地桌面推流類(lèi)似,無(wú)非就是采集的設(shè)備源頭換成了本地?cái)z像頭設(shè)備而不是桌面,其他代碼完全一樣。采集本地?cái)z像頭實(shí)時(shí)視頻要注意的是如果設(shè)置分辨率和幀率,一定要是設(shè)備本身就支持的,如果不支持那就歇菜,比如設(shè)備本身最大分辨率到1280x720,你主動(dòng)設(shè)置要采集1080x720分辨率的圖像,那是采集不到的,會(huì)失敗的,如果默認(rèn)不設(shè)置,一般會(huì)采用640x480分辨率以及25幀率去采集。采集本地?cái)z像頭設(shè)備命令行是 ffmpeg -f dshow -i video=“USB Video Device”:audio=“麥克風(fēng) (USB Audio Device)” -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtsp rtsp://192.168.0.110:6907/stream ,可以指定帶上麥克風(fēng),這樣音視頻都有。

采集大致步驟:

  • 查找格式 av_find_input_format,參數(shù) dshow/v4l2/avfoundation
  • 打開(kāi)桌面 avformat_open_input,參數(shù) video=USB Video Device
  • 查找視頻流 av_find_best_stream
  • 查找解碼器 avcodec_find_decoder
  • 打開(kāi)解碼器 avcodec_open2
  • 循環(huán)讀取 av_read_frame
  • 解碼視頻 avcodec_send_packet/avcodec_receive_frame
  • 關(guān)閉釋放 avcodec_free_context/avformat_close_input

推流大致步驟:

  • 創(chuàng)建輸出 avformat_alloc_output_context2
  • 創(chuàng)建視頻流 avformat_new_stream
  • 打開(kāi)輸出 avio_open,參數(shù)填推流完整地址
  • 寫(xiě)入開(kāi)始符 avformat_write_header
  • 寫(xiě)入幀數(shù)據(jù) av_interleaved_write_frame
  • 關(guān)閉釋放 avio_close/avformat_free_context

二、效果圖

Qt音視頻開(kāi)發(fā)44-本地?cái)z像頭推流(支持分辨率/幀率等設(shè)置/實(shí)時(shí)性極高)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-449684.html

三、體驗(yàn)地址

  1. 國(guó)內(nèi)站點(diǎn):https://gitee.com/feiyangqingyun
  2. 國(guó)際站點(diǎn):https://github.com/feiyangqingyun
  3. 個(gè)人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 體驗(yàn)地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf 文件名:bin_video_push。

四、相關(guān)代碼

void FFmpegThread::initInputFormat()
{
    //本地?cái)z像頭/桌面錄屏
    if (videoType == VideoType_Camera) {
#if defined(Q_OS_WIN)
        //ifmt = av_find_input_format("vfwcap");
        ifmt = av_find_input_format("dshow");
#elif defined(Q_OS_LINUX)
        //可以打開(kāi)cheese程序查看本地?cái)z像頭(如果是在虛擬機(jī)中需要設(shè)置usb選項(xiàng)3.1)
        //ifmt = av_find_input_format("v4l2");
        ifmt = av_find_input_format("video4linux2");
#elif defined(Q_OS_MAC)
        ifmt = av_find_input_format("avfoundation");
#endif
    } else if (videoType == VideoType_Desktop) {
#if defined(Q_OS_WIN)
        ifmt = av_find_input_format("gdigrab");
#elif defined(Q_OS_LINUX)
        ifmt = av_find_input_format("x11grab");
#elif defined(Q_OS_MAC)
        ifmt = av_find_input_format("avfoundation");
#endif
    }
}

bool FFmpegThread::initInput()
{
    //實(shí)例化格式處理上下文
    formatCtx = avformat_alloc_context();
    //設(shè)置超時(shí)回調(diào)(有些不存在的地址或者網(wǎng)絡(luò)不好的情況下要卡很久)
    formatCtx->interrupt_callback.callback = FFmpegHelper::avinterruptCallBackFun;
    formatCtx->interrupt_callback.opaque = this;

    //打開(kāi)輸入(通過(guò)標(biāo)志位控制回調(diào)那邊做超時(shí)判斷)
    //其他地方調(diào)用 formatCtx->url formatCtx->filename 可以拿到設(shè)置的地址(兩個(gè)變量值一樣)
    tryOpen = true;
    QByteArray urlData = VideoHelper::getRightUrl(videoType, videoUrl).toUtf8();
    int result = avformat_open_input(&formatCtx, urlData.data(), ifmt, &options);
    tryOpen = false;
    if (result < 0) {
        debug("打開(kāi)出錯(cuò)", "錯(cuò)誤: " + FFmpegHelper::getError(result));
        return false;
    }

    //根據(jù)自己項(xiàng)目需要開(kāi)啟下面部分代碼加快視頻流打開(kāi)速度
    //開(kāi)啟后由于值太小可能會(huì)出現(xiàn)部分視頻流獲取不到分辨率
    if (decodeType == DecodeType_Fastest && videoType == VideoType_Rtsp) {
        //接口內(nèi)部讀取的最大數(shù)據(jù)量(從源文件中讀取的最大字節(jié)數(shù))
        //默認(rèn)值5000000導(dǎo)致這里卡很久最耗時(shí)(可以調(diào)小來(lái)加快打開(kāi)速度)
        formatCtx->probesize = 50000;
        //從文件中讀取的最大時(shí)長(zhǎng)(單位為 AV_TIME_BASE units)
        formatCtx->max_analyze_duration = 5 * AV_TIME_BASE;
        //內(nèi)部讀取的數(shù)據(jù)包不放入緩沖區(qū)
        //formatCtx->flags |= AVFMT_FLAG_NOBUFFER;
        //設(shè)置解碼錯(cuò)誤驗(yàn)證過(guò)濾花屏
        //formatCtx->error_recognition |= AV_EF_EXPLODE;
    }

    //獲取流信息
    result = avformat_find_stream_info(formatCtx, NULL);
    if (result < 0) {
        debug("找流失敗", "錯(cuò)誤: " + FFmpegHelper::getError(result));
        return false;
    }

    //解碼格式
    formatName = formatCtx->iformat->name;
    //某些格式比如視頻流不做音視頻同步(響應(yīng)速度快)
    if (formatName == "rtsp" || videoUrl.endsWith(".sdp")) {
        useSync = false;
    }

    //設(shè)置了最快速度則不啟用音視頻同步
    if (decodeType == DecodeType_Fastest) {
        useSync = false;
    }

    //有些格式不支持硬解碼
    if (formatName.contains("rm") || formatName.contains("avi") || formatName.contains("webm")) {
        hardware = "none";
    }

    //本地?cái)z像頭設(shè)備解碼出來(lái)的直接就是yuv顯示不需要硬解碼
    if (videoType == VideoType_Camera || videoType == VideoType_Desktop) {
        useSync = false;
        hardware = "none";
    }

    //過(guò)低版本不支持硬解碼
#if (FFMPEG_VERSION_MAJOR < 3)
    hardware = "none";
#endif

    //獲取文件時(shí)長(zhǎng)(這里獲取到的是秒)
    double length = (double)formatCtx->duration / AV_TIME_BASE;
    duration = length * 1000;
    this->checkVideoType();

    //有時(shí)候網(wǎng)絡(luò)地址也可能是純音頻
    if (videoType == VideoType_FileHttp) {
        onlyAudio = VideoHelper::getOnlyAudio(videoUrl, formatName);
    }

    if (getIsFile()) {
        //文件必須要音視頻同步
        useSync = true;
        //發(fā)送文件時(shí)長(zhǎng)信號(hào)
        emit receiveDuration(duration > 0 ? duration : 0);
    }

    QString msg = QString("格式: %1 時(shí)長(zhǎng): %2 秒 加速: %3").arg(formatName).arg(duration / 1000).arg(hardware);
    debug("媒體信息", msg);
    return true;
}

五、功能特點(diǎn)

5.1 文件推流

  1. 指定網(wǎng)卡和監(jiān)聽(tīng)端口,接收網(wǎng)絡(luò)請(qǐng)求推送音視頻等各種文件。
  2. 實(shí)時(shí)統(tǒng)計(jì)顯示每個(gè)文件對(duì)應(yīng)的訪問(wèn)數(shù)量、總訪問(wèn)數(shù)量、不同IP地址訪問(wèn)數(shù)量。
  3. 可指定多種模式,0-直接播放、1-下載播放。
  4. 實(shí)時(shí)打印顯示各種收發(fā)請(qǐng)求和應(yīng)答數(shù)據(jù)。
  5. 每個(gè)文件對(duì)應(yīng)MD5加密的唯一標(biāo)識(shí)符,用于請(qǐng)求地址后綴區(qū)分訪問(wèn)哪個(gè)文件。
  6. 支持各種瀏覽器(谷歌chromium/微軟edge/火狐firefox等)、各種播放器(vlc/mpv/ffplay/potplayer/mpchc等)打開(kāi)請(qǐng)求。
  7. 播放過(guò)程中可以任意切換播放進(jìn)度,支持倍速播放。
  8. 需要推流的文件名稱(chēng)歷史記錄自動(dòng)存儲(chǔ)和打開(kāi)加載應(yīng)用。
  9. 切換文件獲取訪問(wèn)地址,自動(dòng)拷貝地址到剪切板方便直接粘貼測(cè)試使用。
  10. 極低CPU占用,128路1080P同時(shí)推流不到1%CPU占用,異步發(fā)送數(shù)據(jù)機(jī)制。
  11. 純QTcpSocket通信,不依賴(lài)流媒體服務(wù)程序,核心源碼不到500行,注釋詳細(xì),功能完整。
  12. 支持Qt4/Qt5/Qt6任意版本,支持任意系統(tǒng)(windows/linux/macos/android/嵌入式linux等)。

5.2 網(wǎng)絡(luò)推流

  1. 支持各種本地視頻文件和網(wǎng)絡(luò)視頻文件。
  2. 支持各種網(wǎng)絡(luò)視頻流,網(wǎng)絡(luò)攝像頭,協(xié)議包括rtsp、rtmp、http。
  3. 支持將本地?cái)z像頭設(shè)備推流,可指定分辨率和幀率等。
  4. 支持將本地桌面推流,可指定屏幕區(qū)域和幀率等。
  5. 自動(dòng)啟動(dòng)流媒體服務(wù)程序,默認(rèn)mediamtx(原rtsp-simple-server),可選用srs、EasyDarwin、LiveQing、ZLMediaKit等。
  6. 可實(shí)時(shí)切換預(yù)覽視頻文件。
  7. 推流的清晰度和質(zhì)量可調(diào)。
  8. 可動(dòng)態(tài)添加文件、目錄、地址。
  9. 視頻文件自動(dòng)循環(huán)推流,如果視頻源是視頻流,在掉線后會(huì)自動(dòng)重連。
  10. 網(wǎng)絡(luò)視頻流自動(dòng)重連,重連成功自動(dòng)繼續(xù)推流。
  11. 網(wǎng)絡(luò)視頻流實(shí)時(shí)性極高,延遲極低,延遲時(shí)間大概在100ms左右。
  12. 推流后除了用rtmp地址訪問(wèn)以外,還支持直接hls/webrtc訪問(wèn),可以直接瀏覽器打開(kāi)看實(shí)時(shí)畫(huà)面。
  13. 支持Qt4/Qt5/Qt6任意版本,支持任意系統(tǒng)(windows/linux/macos/android/嵌入式linux等)。

到了這里,關(guān)于Qt音視頻開(kāi)發(fā)44-本地?cái)z像頭推流(支持分辨率/幀率等設(shè)置/實(shí)時(shí)性極高)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(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)文章

  • JavaCV音視頻開(kāi)發(fā)寶典:使用JavaCV讀取??灯脚_(tái)或海康網(wǎng)絡(luò)攝像頭sdk回調(diào)錄像回放視頻PS碼流并解析預(yù)覽圖像

    JavaCV音視頻開(kāi)發(fā)寶典:使用JavaCV讀取??灯脚_(tái)或海康網(wǎng)絡(luò)攝像頭sdk回調(diào)錄像回放視頻PS碼流并解析預(yù)覽圖像

    《JavaCV音視頻開(kāi)發(fā)寶典》專(zhuān)欄目錄導(dǎo)航 《JavaCV音視頻開(kāi)發(fā)寶典》專(zhuān)欄介紹和目錄 ? 上一章中《JavaCV音視頻開(kāi)發(fā)寶典:使用JavaCV讀取??灯脚_(tái)或海康網(wǎng)絡(luò)攝像頭sdk回調(diào)視頻TS流并解析預(yù)覽圖像》已經(jīng)詳細(xì)介紹了針對(duì)??礢DK實(shí)時(shí)視頻流回調(diào)的TS流解析實(shí)現(xiàn),并且也提到了PS流和

    2024年02月16日
    瀏覽(22)
  • JavaCV音視頻開(kāi)發(fā)寶典:使用javacv讀取GB28181、??荡笕A平臺(tái)和網(wǎng)絡(luò)攝像頭sdk回調(diào)視頻碼流并轉(zhuǎn)碼推流rtmp流媒體服務(wù)

    JavaCV音視頻開(kāi)發(fā)寶典:使用javacv讀取GB28181、??荡笕A平臺(tái)和網(wǎng)絡(luò)攝像頭sdk回調(diào)視頻碼流并轉(zhuǎn)碼推流rtmp流媒體服務(wù)

    《JavaCV音視頻開(kāi)發(fā)寶典》專(zhuān)欄目錄導(dǎo)航 《JavaCV音視頻開(kāi)發(fā)寶典》專(zhuān)欄介紹和目錄 本篇文章用于解決javacv接入h264/hevc裸流或者接入ps/ts流等字節(jié)流的非流媒體協(xié)議視頻源接入并推流到rtmp流媒體服務(wù)。 本篇文章適用于gb28181/海康大華網(wǎng)絡(luò)攝像機(jī)設(shè)備sdk對(duì)接以及??荡笕A等視頻平

    2023年04月09日
    瀏覽(35)
  • 使用ffmpeg調(diào)用電腦自帶的攝像頭和揚(yáng)聲器錄制音視頻

    使用ffmpeg調(diào)用電腦自帶的攝像頭和揚(yáng)聲器錄制音視頻

    1、打開(kāi)cmd,執(zhí)行 chcp 65001 ,修改cmd的編碼格式為utf8,避免亂碼 2、執(zhí)行指令 ffmpeg -list_devices true -f dshow -i dummy ,查看當(dāng)前window的音頻和視頻名稱(chēng) 3、打開(kāi)windows系統(tǒng)的\\\"打開(kāi)聲音設(shè)置\\\"–“麥克風(fēng)隱私設(shè)置”–\\\"允許應(yīng)用訪問(wèn)你的麥克風(fēng)\\\"點(diǎn)擊開(kāi)啟 錄制視頻: 錄制音頻: 錄制音視頻:

    2024年02月04日
    瀏覽(32)
  • 用Qt開(kāi)發(fā)的ffmpeg流媒體播放器,支持截圖、錄像,支持音視頻播放,支持本地文件播放、網(wǎng)絡(luò)流播放

    用Qt開(kāi)發(fā)的ffmpeg流媒體播放器,支持截圖、錄像,支持音視頻播放,支持本地文件播放、網(wǎng)絡(luò)流播放

    本工程qt用的版本是5.8-32位,ffmpeg用的版本是較新的5.1版本。它支持TCP或UDP方式拉取實(shí)時(shí)流,實(shí)時(shí)流我采用的是監(jiān)控?cái)z像頭的RTSP流。音頻播放采用的是QAudioOutput,視頻經(jīng)ffmpeg解碼并由YUV轉(zhuǎn)RGB后是在QOpenGLWidget下進(jìn)行渲染顯示。本工程的代碼有注釋?zhuān)梢酝ㄟ^(guò)本博客查看代碼或者

    2024年02月03日
    瀏覽(116)
  • Qt音視頻開(kāi)發(fā)45-音視頻類(lèi)結(jié)構(gòu)體參數(shù)的設(shè)計(jì)

    Qt音視頻開(kāi)發(fā)45-音視頻類(lèi)結(jié)構(gòu)體參數(shù)的設(shè)計(jì)

    視頻監(jiān)控內(nèi)核組件重構(gòu)和完善花了一年多時(shí)間,整個(gè)組件個(gè)人認(rèn)為設(shè)計(jì)的最好的部分就是各種結(jié)構(gòu)體參數(shù)的設(shè)計(jì),而且分門(mén)別類(lèi),有枚舉值,也有窗體相關(guān)的結(jié)構(gòu)體參數(shù),解碼相關(guān)的結(jié)構(gòu)體參數(shù),同時(shí)將部分常用的結(jié)構(gòu)體參數(shù)的獲取和設(shè)置單獨(dú)提供了函數(shù),參閱??荡笕A等大

    2024年02月05日
    瀏覽(29)
  • Qt/C++音視頻開(kāi)發(fā)46-音視頻同步保存到MP4

    用ffmpeg單獨(dú)做視頻保存不難,單獨(dú)做音頻保存也不難,難的是音視頻同步保存到MP4中,重點(diǎn)是音視頻要同步,其實(shí)這也不難,只要播放那邊音視頻同步后的數(shù)據(jù),寫(xiě)入到文件即可。最難的是在播放過(guò)程中不斷隨機(jī)的切換播放進(jìn)度,而且還會(huì)暫停播放、暫停錄制的情況出現(xiàn),這

    2024年02月17日
    瀏覽(38)
  • Qt音視頻開(kāi)發(fā)38-ffmpeg視頻暫停錄制的設(shè)計(jì)

    Qt音視頻開(kāi)發(fā)38-ffmpeg視頻暫停錄制的設(shè)計(jì)

    基本上各種播放器提供的錄制視頻接口,都是只有開(kāi)始錄制和結(jié)束錄制兩個(gè),當(dāng)然一般用的最多的也是這兩個(gè)接口,但是實(shí)際使用過(guò)程中,還有一種可能需要中途暫停錄制,暫停以后再次繼續(xù)錄制,將中間部分視頻不需要錄制,跳過(guò)這部分不需要的視頻,而且錄制的視頻文件

    2023年04月20日
    瀏覽(25)
  • Qt/C++音視頻開(kāi)發(fā)24-視頻顯示QOpenGLWidget方式(占用GPU)

    采用painter的方式繪制解碼后的圖片,方式簡(jiǎn)單易懂,巨大缺點(diǎn)就是占CPU,一個(gè)兩個(gè)通道還好,基本上CPU很低,但是到了16個(gè)64個(gè)通道的時(shí)候,會(huì)發(fā)現(xiàn)CPU也是很吃緊(當(dāng)然強(qiáng)勁的電腦配置另當(dāng)別論),這就需要考慮用opengl來(lái)繪制了,采用opengl走的GPU,會(huì)占用很少的CPU(一般是部

    2024年02月11日
    瀏覽(27)
  • Qt編寫(xiě)推流綜合應(yīng)用示例(文件推流/桌面推流/本地?cái)z像頭/網(wǎng)絡(luò)攝像頭/轉(zhuǎn)發(fā)推流/視頻分發(fā))

    Qt編寫(xiě)推流綜合應(yīng)用示例(文件推流/桌面推流/本地?cái)z像頭/網(wǎng)絡(luò)攝像頭/轉(zhuǎn)發(fā)推流/視頻分發(fā))

    1.1 文件推流 指定網(wǎng)卡和監(jiān)聽(tīng)端口,接收網(wǎng)絡(luò)請(qǐng)求推送音視頻等各種文件。 實(shí)時(shí)統(tǒng)計(jì)顯示每個(gè)文件對(duì)應(yīng)的訪問(wèn)數(shù)量、總訪問(wèn)數(shù)量、不同IP地址訪問(wèn)數(shù)量。 可指定多種模式,0-直接播放、1-下載播放。 實(shí)時(shí)打印顯示各種收發(fā)請(qǐng)求和應(yīng)答數(shù)據(jù)。 每個(gè)文件對(duì)應(yīng)MD5加密的唯一標(biāo)識(shí)符,

    2023年04月22日
    瀏覽(21)
  • 音視頻開(kāi)發(fā)系列(10):基于qt的音頻推流

    音視頻開(kāi)發(fā)系列(10):基于qt的音頻推流

    今天分享一下利用qt錄制音頻,然后再利用ffmpeg推流到nginx服務(wù)器,最后再利用vlc進(jìn)行拉流的demo。 首先介紹一下如何利用qt來(lái)進(jìn)行音頻的錄制,qt的音頻錄制主要利用qt的QAudioFormat先進(jìn)行音頻信息的配置。主要需要配置以下的信息: 然后使用QAudioDeviceInfo來(lái)獲取是否支持改設(shè)置

    2024年02月02日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包