本篇內(nèi)容主要講解“Qt ffmpeg解碼處理方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Qt ffmpeg解碼處理方法是什么”吧!
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供老河口網(wǎng)站建設(shè)、老河口做網(wǎng)站、老河口網(wǎng)站設(shè)計、老河口網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、老河口企業(yè)網(wǎng)站模板建站服務(wù),10年老河口做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
采用ffmpeg解碼,是所有視頻監(jiān)控開發(fā)人員必備的技能,繞不過去的一個玩意,甚至可以說是所有音視頻開發(fā)人員的必備技能。FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機(jī)程序。它包括了目前領(lǐng)先的音/視頻編碼庫libavcodec。 FFmpeg是在 Linux 下開發(fā)出來的,但它可以在包括 Windows 在內(nèi)的大多數(shù)操作系統(tǒng)中編譯。這個項目是由 Fabrice Bellard 發(fā)起的,現(xiàn)在由 Michael Niedermayer 主持??梢暂p易地實現(xiàn)多種視頻格式之間的相互轉(zhuǎn)換,例如可以將攝錄下的視頻avi等轉(zhuǎn)成現(xiàn)在視頻網(wǎng)站所采用的flv格式。
關(guān)于ffmpeg解碼,網(wǎng)上搜索到的代碼絕對是一大堆一大堆,而且很多都講得很詳細(xì),解碼的函數(shù)流程圖非常清晰,關(guān)于ffmpeg這塊的學(xué)習(xí)本人推薦雷神的博客,分析的相當(dāng)細(xì)致,我在很久以前剛用Qt+ffmpeg解碼的時候,參考的就是雷神的例子,當(dāng)然這些demo其實在ffmpeg的開發(fā)包dev下的examples也是非常詳細(xì)的,只不過沒有什么分析過程,參考雷神的博客可以看到很多分析過程。
本人總結(jié)的解碼過程:
注冊解碼庫相關(guān)(av_register_all、avformat_network_init等)
初始化各種參數(shù)比如緩存大小等(av_dict_set)
打開視頻流或者文件(avformat_alloc_context、avformat_open_input)
獲取流信息(avformat_find_stream_info)
獲取視頻流并初始化視頻解碼器(av_find_best_stream、avcodec_find_decoder)
獲取音頻流并初始化音頻解碼器(av_find_best_stream、avcodec_find_decoder、avcodec_open2)
預(yù)分配幀內(nèi)存(av_frame_alloc)
循環(huán)讀取音視頻幀(av_read_frame、av_packet_unref)
解碼視頻(avcodec_decode_video2或者avcodec_send_packet、avcodec_receive_frame)
解碼音頻(avcodec_decode_audio4)
處理結(jié)束釋放資源(sws_freeContext、av_frame_free、av_free)
多線程實時播放視頻流和本地視頻。
支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位。
多線程顯示圖像,不卡主界面。
自動重連網(wǎng)絡(luò)攝像頭。
可設(shè)置邊框大小即偏移量和邊框顏色。
可設(shè)置是否繪制OSD標(biāo)簽即標(biāo)簽文本或圖片和標(biāo)簽位置。
可設(shè)置兩種OSD位置和風(fēng)格。
可設(shè)置是否保存到文件以及文件名。
可直接拖曳文件到ffmpegwidget控件播放。
支持h365視頻流+rtmp等常見視頻流。
可暫停播放和繼續(xù)播放。
支持回調(diào)模式和句柄兩種模式。
支持線程讀取進(jìn)度等信息和事件回調(diào)兩種處理模式。
自動將當(dāng)前播放位置和音量大小是否靜音以信號發(fā)出去。
提供接口設(shè)置播放位置和音量及設(shè)置靜音。
支持存儲單個視頻文件和定時存儲視頻文件。
自定義頂部懸浮條,發(fā)送單擊信號通知,可設(shè)置是否啟用。
支持qsv、dxva2、d3d11va等硬解碼。
支持opengl繪制視頻數(shù)據(jù),極低CPU占用。
支持嵌入式linux。
bool FFmpegThread::init() { //判斷該攝像機(jī)是否能聯(lián)通 if (checkConn && isRtsp) { if (!checkUrl(url, checkTime)) { return false; } } //初始化參數(shù) this->initOption(); //初始化輸入 if (!initInput()) { return false; } //初始化視頻 if (!initVideo()) { return false; } //初始化音頻 if (!initAudio()) { return false; } //初始化幀 this->initFrame(); //輸出視頻信息 //av_dump_format(formatCtx, 0, url.toStdString().data(), 0); //qDebug() << TIMEMS << "init ffmpeg finsh"; return true; } void FFmpegThread::initOption() { //在打開碼流前指定各種參數(shù)比如:探測時間/超時時間/最大延時等 //設(shè)置緩存大小,1080p可將值調(diào)大 av_dict_set(&options, "buffer_size", "8192000", 0); //以tcp方式打開,如果以udp方式打開將tcp替換為udp av_dict_set(&options, "rtsp_transport", transport.toLatin1().constData(), 0); //設(shè)置超時斷開連接時間,單位微秒,3000000表示3秒 av_dict_set(&options, "stimeout", "3000000", 0); //設(shè)置最大時延,單位微秒,1000000表示1秒 av_dict_set(&options, "max_delay", "1000000", 0); //自動開啟線程數(shù) av_dict_set(&options, "threads", "auto", 0); //設(shè)置USB攝像機(jī)分辨率 if (url.startsWith("video")) { QString size = QString("%1x%2").arg(videoWidth).arg(videoHeight); av_dict_set(&options, "video_size", size.toLatin1().constData(), 0); } } bool FFmpegThread::initInput() { //實例化格式處理上下文 formatCtx = avformat_alloc_context(); //先判斷是否是本地設(shè)備(video=設(shè)備名字符串),打開的方式不一樣 int result = -1; if (url.startsWith("video")) { #if defined(Q_OS_WIN) AVInputFormat *ifmt = av_find_input_format("dshow"); #elif defined(Q_OS_LINUX) AVInputFormat *ifmt = av_find_input_format("video4linux2"); #elif defined(Q_OS_MAC) AVInputFormat *ifmt = av_find_input_format("avfoundation"); #endif result = avformat_open_input(&formatCtx, url.toStdString().data(), ifmt, &options); } else { result = avformat_open_input(&formatCtx, url.toStdString().data(), NULL, &options); } if (result < 0) { qDebug() << TIMEMS << "open input error" << url; return false; } //釋放設(shè)置參數(shù) if (options != NULL) { av_dict_free(&options); } //獲取流信息 result = avformat_find_stream_info(formatCtx, NULL); if (result < 0) { qDebug() << TIMEMS << "find stream info error"; return false; } return true; }
到此,相信大家對“Qt ffmpeg解碼處理方法是什么”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
分享文章:Qtffmpeg解碼處理方法是什么
文章源于:http://chinadenli.net/article14/jhhpge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、品牌網(wǎng)站建設(shè)、搜索引擎優(yōu)化、微信小程序、Google、動態(tài)網(wǎng)站
聲明:本網(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)