Qt/C++音視頻開發58-逐幀播放/上一幀下一幀/切換播放進度/實時解碼

一、前言

逐幀播放是近期增加的功能,之前也一直思考過這個功能該如何實現,對于mdk/qtav等內核組件,可以直接用該組件提供的接口實現即可,而對于ffmpeg,需要自己處理,如果有緩存的數據的話,可以通過在緩存中的數據往前移動往后移動即可。這樣就要求做一個比較大的緩存隊列,占用一定的內存是肯定的。為了在現有代碼基礎上能夠最快最穩定最小代碼量實現逐幀播放功能,一個思路就是在播放完一幀后立馬暫停,只有當用戶單擊了下一幀,就繼續播放一幀,解碼線程那邊會自動判斷音視頻同步線程中緩存的數據包數量,超過一定數量則會暫停解碼,通過驗證此策略是完全可行的,每次播放一幀就暫停。但是這個也有個問題,就是不支持往回播放一幀,因為播放完成后就已經把之前的數據釋放清空了,如果一定要往后播放,只能切換進度,這樣才會重新讀取數據解碼。通過對比其他播放器發現vlc也是只能往前播放一幀,不支持回退逐幀播放,可能也是遇到了一樣的困難。等后期有更好的辦法再考慮重構。

對于一些沒有提供逐幀播放api接口的sdk比如qmediaplayer,可以通過設置進度來模擬實現逐幀播放,但是確切的說未必是逐幀就是。比如可以獲取到fps,就是1s內播放多少張圖片,這樣就可以根據fps計算出每一張圖片占用的進度時間,比如fps=25就是一張圖片40ms,意味著逐幀播放函數每次將進度+40即可,試下來也還行,基本上看下來是逐幀播放的。

二、效果圖

在這里插入圖片描述

三、體驗地址

  1. 國內站點:https://gitee.com/feiyangqingyun
  2. 國際站點:https://github.com/feiyangqingyun
  3. 個人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 體驗地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf 文件名:bin_video_demo。

四、功能特點

4.1. 基礎功能

  1. 支持各種音頻視頻文件格式,比如mp3、wav、mp4、asf、rm、rmvb、mkv等。
  2. 支持本地攝像頭設備和本地桌面采集,支持多設備和多屏幕。
  3. 支持各種視頻流格式,比如rtp、rtsp、rtmp、http、udp等。
  4. 本地音視頻文件和網絡音視頻文件,自動識別文件長度、播放進度、音量大小、靜音狀態等。
  5. 文件可以指定播放位置、調節音量大小、設置靜音狀態等。
  6. 支持倍速播放文件,可選0.5倍、1.0倍、2.5倍、5.0倍等速度,相當于慢放和快放。
  7. 支持開始播放、停止播放、暫停播放、繼續播放。
  8. 支持抓拍截圖,可指定文件路徑,可選抓拍完成是否自動顯示預覽。
  9. 支持錄像存儲,手動開始錄像、停止錄像,部分內核支持暫停錄像后繼續錄像,跳過不需要錄像的部分。
  10. 支持無感知切換循環播放、自動重連等機制。
  11. 提供播放成功、播放完成、收到解碼圖片、收到抓拍圖片、視頻尺寸變化、錄像狀態變化等信號。
  12. 多線程處理,一個解碼一個線程,不卡主界面。

4.2. 特色功能

  1. 同時支持多種解碼內核,包括qmedia內核(Qt4/Qt5/Qt6)、ffmpeg內核(ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5/ffmpeg6)、vlc內核(vlc2/vlc3)、mpv內核(mpv1/mp2)、mdk內核、海康sdk、easyplayer內核等。
  2. 非常完善的多重基類設計,新增一種解碼內核只需要實現極少的代碼量,就可以應用整套機制,極易拓展。
  3. 同時支持多種畫面顯示策略,自動調整(原始分辨率小于顯示控件尺寸則按照原始分辨率大小顯示,否則等比縮放)、等比縮放(永遠等比縮放)、拉伸填充(永遠拉伸填充)。所有內核和所有視頻顯示模式下都支持三種畫面顯示策略。
  4. 同時支持多種視頻顯示模式,句柄模式(傳入控件句柄交給對方繪制控制)、繪制模式(回調拿到數據后轉成QImage用QPainter繪制)、GPU模式(回調拿到數據后轉成yuv用QOpenglWidget繪制)。
  5. 支持多種硬件加速類型,ffmpeg可選dxva2、d3d11va等,vlc可選any、dxva2、d3d11va,mpv可選auto、dxva2、d3d11va,mdk可選dxva2、d3d11va、cuda、mft等。不同的系統環境有不同的類型選擇,比如linux系統有vaapi、vdpau,macos系統有videotoolbox。
  6. 解碼線程和顯示窗體分離,可指定任意解碼內核掛載到任意顯示窗體,動態切換。
  7. 支持共享解碼線程,默認開啟并且自動處理,當識別到相同的視頻地址,共享一個解碼線程,在網絡視頻環境中可以大大節約網絡流量以及對方設備的推流壓力。國內頂尖視頻廠商均采用此策略。這樣只要拉一路視頻流就可以共享到幾十個幾百個通道展示。
  8. 自動識別視頻旋轉角度并繪制,比如手機上拍攝的視頻一般是旋轉了90度的,播放的時候要自動旋轉處理,不然默認是倒著的。
  9. 自動識別視頻流播放過程中分辨率的變化,在視頻控件上自動調整尺寸。比如攝像機可以在使用過程中動態配置分辨率,當分辨率改動后對應視頻控件也要做出同步反應。
  10. 音視頻文件無感知自動切換循環播放,不會出現切換期間黑屏等肉眼可見的切換痕跡。
  11. 視頻控件同時支持任意解碼內核、任意畫面顯示策略、任意視頻顯示模式。
  12. 視頻控件懸浮條同時支持句柄、繪制、GPU三種模式,非絕對坐標移來移去。
  13. 本地攝像頭設備支持指定設備名稱、分辨率、幀率進行播放。
  14. 本地桌面采集支持設定采集區域、偏移值、指定桌面索引、幀率、多個桌面同時采集等。
  15. 錄像文件同時支持打開的視頻文件、本地攝像頭、本地桌面、網絡視頻流等。
  16. 瞬間響應打開和關閉,無論是打開不存在的視頻或者網絡流,探測設備是否存在,讀取中的超時等待,收到關閉指令立即中斷之前的操作并響應。
  17. 支持打開各種圖片文件,支持本地音視頻文件拖曳播放。
  18. 視頻流通信方式可選tcp/udp,有些設備可能只提供了某一種協議通信比如tcp,需要指定該種協議方式打開。
  19. 可設置連接超時時間(視頻流探測用的超時時間)、讀取超時時間(采集過程中的超時時間)。
  20. 支持逐幀播放,提供上一幀/下一幀函數接口,可以逐幀查閱采集到的圖像。
  21. 音頻文件自動提取專輯信息比如標題、藝術家、專輯、專輯封面,自動顯示專輯封面。
  22. 視頻響應極低延遲0.2s左右,極速響應打開視頻流0.5s左右,專門做了優化處理。
  23. 支持H264/H265編碼(現在越來越多的監控攝像頭是H265視頻流格式)生成視頻文件,內部自動識別切換編碼格式。
  24. 支持用戶信息中包含特殊字符(比如用戶信息中包含+#@等字符)的視頻流播放,內置解析轉義處理。
  25. 支持濾鏡,各種水印及圖形效果,支持多個水印和圖像,可以將OSD標簽信息和各種圖形信息寫入到MP4文件。
  26. 支持視頻流中的各種音頻格式,AAC、PCM、G.726、G.711A、G.711Mu、G.711ulaw、G.711alaw、MP2L2等都支持,推薦選擇AAC兼容性跨平臺性最好。
  27. 內核ffmpeg采用純qt+ffmpeg解碼,非sdl等第三方繪制播放依賴,gpu繪制采用qopenglwidget,音頻播放采用qaudiooutput。
  28. 內核ffmpeg和內核mdk支持安卓,其中mdk支持安卓硬解碼,性能非常兇殘。
  29. 可以切換音視頻軌道,也就是節目通道,可能ts文件帶了多個音視頻節目流,可以分別設置要播放哪一個,可以播放前設置好和播放過程中動態設置。
  30. 可以設置視頻旋轉角度,可以播放前設置好和播放過程中動態設置。
  31. 視頻控件懸浮條自帶開始和停止錄像切換、聲音靜音切換、抓拍截圖、關閉視頻等功能。
  32. 音頻組件支持聲音波形值數據解析,可以根據該值繪制波形曲線和柱狀聲音條,默認提供了聲音振幅信號。
  33. 標簽和圖形信息支持三種繪制方式,繪制到遮罩層、繪制到圖片、源頭繪制(對應信息可以存儲到文件)。
  34. 通過傳入一個url地址,該地址可以帶上通信協議、分辨率、幀率等信息,無需其他設置。
  35. 保存視頻到文件支持三種策略,自動處理、僅限文件、全部轉碼,轉碼策略支持自動識別、轉264、轉265,編碼保存支持指定分辨率縮放或者等比例縮放。比如對保存文件體積有要求可以指定縮放后再存儲。
  36. 支持加密保存文件和解密播放文件,可以指定秘鑰文本。
  37. 支持電子放大,在懸浮條切換到電子放大模式,在畫面上選擇需要放大的區域,選取完畢后自動放大,再次切換放大模式可以復位。
  38. 各組件中極其詳細的打印信息提示,尤其是報錯信息提示,封裝的統一打印格式。針對現場復雜的設備環境測試極其方便有用,相當于精確定位到具體哪個通道哪個步驟出錯。
  39. 同時提供了簡單示例、視頻播放器、多畫面視頻監控、監控回放、逐幀播放、多屏渲染等單獨窗體示例,專門演示對應功能如何使用。
  40. 代碼框架和結構優化到最優,性能強悍,持續迭代更新升級。
  41. 源碼支持Qt4、Qt5、Qt6,兼容所有版本。

4.3. 視頻控件

  1. 可動態添加任意多個osd標簽信息,標簽信息包括名字、是否可見、字號大小、文本文字、文本顏色、背景顏色、標簽圖片、標簽坐標、標簽格式(文本、日期、時間、日期時間、圖片)、標簽位置(左上角、左下角、右上角、右下角、居中、自定義坐標)。
  2. 可動態添加任意多個圖形信息,這個非常有用,比如人工智能算法解析后的圖形區域信息直接發給視頻控件即可。圖形信息支持任意形狀,直接繪制在原始圖片上,采用絕對坐標。
  3. 圖形信息包括名字、邊框大小、邊框顏色、背景顏色、矩形區域、路徑集合、點坐標集合等。
  4. 每個圖形信息都可指定三種區域中的一種或者多種,指定了的都會繪制。
  5. 內置懸浮條控件,懸浮條位置支持頂部、底部、左側、右側。
  6. 懸浮條控件參數包括邊距、間距、背景透明度、背景顏色、文本顏色、按下顏色、位置、按鈕圖標代碼集合、按鈕名稱標識集合、按鈕提示信息集合。
  7. 懸浮條控件一排工具按鈕可自定義,通過結構體參數設置,圖標可選圖形字體還是自定義圖片。
  8. 懸浮條按鈕內部實現了錄像切換、抓拍截圖、靜音切換、關閉視頻等功能,也可以自行在源碼中增加自己對應的功能。
  9. 懸浮條按鈕對應實現了功能的按鈕,有對應圖標切換處理,比如錄像按鈕按下后會切換到正在錄像中的圖標,聲音按鈕切換后變成靜音圖標,再次切換還原。
  10. 懸浮條按鈕單擊后都用名稱唯一標識作為信號發出,可以自行關聯響應處理。
  11. 懸浮條空白區域可以顯示提示信息,默認顯示當前視頻分辨率大小,可以增加幀率、碼流大小等信息。
  12. 視頻控件參數包括邊框大小、邊框顏色、焦點顏色、背景顏色(默認透明)、文字顏色(默認全局文字顏色)、填充顏色(視頻外的空白處填充黑色)、背景文字、背景圖片(如果設置了圖片優先取圖片)、是否拷貝圖片、縮放顯示模式(自動調整、等比縮放、拉伸填充)、視頻顯示模式(句柄、繪制、GPU)、啟用懸浮條、懸浮條尺寸(橫向為高度、縱向為寬度)、懸浮條位置(頂部、底部、左側、右側)。

五、相關代碼

void VideoThread::step(bool backward)
{//本身沒有逐幀播放接口/按照幀率計算的間隔來跳轉播放進度實現//如果子類實現了step函數則會執行子類的代碼if (getIsFile() && playStep) {int offset = 1000 / 25;if (frameRate > 0) {offset = 1000 / frameRate;}qint64 position = this->getPosition();position = (backward ? (position - offset) : (position + offset));this->setPosition(position);}
}void HaiKangThread::step(bool backward)
{if (port >= 0 && videoType != VideoType_Rtsp && playStep) {if (backward) {//測試下來發現往回看不行PlayM4_OneByOneBack(port);} else {PlayM4_OneByOne(port);}}
}void MdkThread::step(bool backward)
{if (getIsFile() && playStep) {mdkPlayer->seek(backward, 1);}
}void MpvThread::step(bool backward)
{if (mpvPlayer && getIsFile() && playStep) {command(QVariantList() << (backward ? "frame-back-step" : "frame-step"));}
}void QtavThread::step(bool backward)
{if (getIsFile() && playStep) {if (backward) {avPlayer->stepBackward();} else {avPlayer->stepForward();}}
}void VlcThread::step(bool backward)
{if (vlcPlayer && getIsFile() && playStep) {if (backward) {} else {libvlc_media_player_next_frame(vlcPlayer);}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/206762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/206762.shtml
英文地址,請注明出處:http://en.pswp.cn/news/206762.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Rust的eBFP框架Aya(一) - Linux內核網絡基礎

前言 在我的Rust入門及實戰系列文章中已經說明&#xff0c; Rust是一門內存安全的高性能編程語言&#xff0c;從它的這些優秀特性來看&#xff0c;就是一門專為系統開發而誕生的語言。至于很多使用Rust來進行web開發的行為&#xff0c;不能說它們不好&#xff0c;只能說是殺雞…

2017下半年軟工(橋接模式)

題目——橋接模式&#xff08;抽象調用實現部分&#xff09; package org.example.橋接模式;/*** 橋接模式的核心思想是將抽象部分與它的實現部分分離&#xff0c;使它們可以獨立變化&#xff0c;就是說你在實現部分&#xff1a;WinImp、LinuxImp基礎上還能加上RedHatImp&#…

03-微服務架構構建之微服務拆分

文章目錄 前言一、微服務拆分的原則二、微服務拆分的時機三、微服務拆分的方法總結 前言 微服務架構是將一個單體應用程序拆分為一個個獨立且保持松耦合的服務的一種架構方式&#xff0c;每個服務有著獨立的數據庫并且能獨立運行部署。微服務架構的構建過程中&#xff0c;第一…

偷竊別人的密碼

在工作中都用到virtual machine吧&#xff0c;同事之間還互相借用機器&#xff0c;或者不借用但憑借自己的域賬號能登錄任意機器&#xff0c;而且每個域賬號都有sudo權限&#xff1f; 那你要小心了&#xff01; 因為我可以輕易記錄下每個ssh登錄到我機器&#xff0c;或者我在…

uniapp 輸入框輸入時,會將內容頂上去的解決方案

// 設置頁面最小高度 export const setPageMinHeight () > {return {position: relative,min-height: uni.getSystemInfoSync().windowHeight px} }頁面使用&#xff1a; import {setPageMinHeight} from "/utils/uniUtil";data() {return {minHeight: setPag…

Unity 狀態系統

狀態系統 原理食用方法Demo 原理 #mermaid-svg-lUbxJ8eMP3KqrEhY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lUbxJ8eMP3KqrEhY .error-icon{fill:#552222;}#mermaid-svg-lUbxJ8eMP3KqrEhY .error-text{fill:#55…

官方officevisio在線安裝包

在線安裝包&#xff0c;在線就是要有網絡環境&#xff0c;你能搜到這篇博客&#xff0c;就初步具備網絡環境 visio在線安裝包.zip官方版下載丨最新版下載丨綠色版下載丨APP下載-123云盤 在線安裝包如下&#xff0c;雙擊執行安裝即可&#xff0c;可供選擇的64/32位 軟件的激活與…

netty使用

支持協議 TCP/UDPHTTP/HTTPSWebSocketSPDY/HTTP2MQTT/CoAP 服務端 常用類 ServerBootstrap 服務端配置類 //設置線程組、parentGroup處理連接、childGroup處理I/O group(EventLoopGroup parentGroup, EventLoopGroup childGroup) //Channel通過何種方式獲取新的連接(NioSe…

【擴散模型】ControlNet從原理到實戰

ControlNet從原理到實戰 ControlNet原理ControlNet應用于大型預訓練擴散模型ControlNet訓練過程ControlNet示例1 ControlNet與Canny Edge2. ControlNet與Depth3. ControlNet與M-LSD Lines4. ControlNet與HED Boundary ControlNet實戰Canny Edge實戰Open Pose 小結參考資料 Cont…

Linux系統上RabbitMQ安裝教程

一、安裝前環境準備 Linux&#xff1a;CentOS 7.9 RabbitMQ Erlang 1、系統內須有C等基本工具 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xz socat2、下載安裝包 1&#xff09;首先&a…

[linux] kaggle 數據集用linux下載

你可以通過以下步驟獲取Kaggle的下載鏈接并在Linux中進行下載&#xff1a; 首先&#xff0c;確保你已經安裝了Python和Kaggle API。如果沒有安裝&#xff0c;你可以通過以下命令安裝&#xff1a; pip install kaggle 接著&#xff0c;你需要在Kaggle網站上獲取API Token。登錄…

時間相關類

內容 JDK7時間相關類JDK8時間相關類 第一章 Date類 1.1 Date概述 java.util.Date類 表示特定的瞬間&#xff0c;精確到毫秒。 繼續查閱Date類的描述&#xff0c;發現Date擁有多個構造函數&#xff0c;只是部分已經過時&#xff0c;我們重點看以下兩個構造函數 public Dat…

【PyTorch】 暫退法(dropout)

文章目錄 1. 理論介紹2. 實例解析2.1. 實例描述2.2. 代碼實現2.2.1. 主要代碼2.2.2. 完整代碼2.2.3. 輸出結果 1. 理論介紹 線性模型泛化的可靠性是有代價的&#xff0c;因為線性模型沒有考慮到特征之間的交互作用&#xff0c;由此模型靈活性受限。泛化性和靈活性之間的基本權…

Docker構建自定義鏡像

創建一個docker-demo的文件夾,放入需要構建的文件 主要是配置Dockerfile文件 第一種配置方法 # 指定基礎鏡像 FROM ubuntu:16.04 # 配置環境變量&#xff0c;JDK的安裝目錄 ENV JAVA_DIR/usr/local# 拷貝jdk和java項目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo…

Java基礎50題: 21.實現一個方法printArray, 以數組為參數,循環訪問數組中的每個元素,打印每個元素的值.

概述 實現一個方法printArray, 以數組為參數,循環訪問數組中的每個元素,打印每個元素的值. 代碼 public static void printArray(int[] array) {for (int i 0; i < array.length; i) {System.out.println(array[i] " ");}System.out.println();}public static…

【數據結構c實現】順序表實現

文章目錄 線性表線性表的順序實現結點結構結點初始化增配空間Inc打印順序表show_list線性表長度length尾部插入push_back頭部插入push_front尾部刪除pop_back頭部刪除pop_front按位置插入insert_pos按值查找find按位置刪除delete_pos按值刪除delete_val排序sort(冒泡&#xff1…

云上業務DDoS與CC攻擊防護實踐

案例背景&#xff1a;DDoS攻擊來勢洶洶&#xff0c;云上業務面臨威脅 某網絡科技有限公司&#xff0c;SaaS化創業公司&#xff0c;業務基于云上開展。其業務主要為各大網站提供安全驗證服務&#xff0c;且市場占有率較高&#xff0c;服務客戶遍布金融、直播、教育、電商等多個領…

【日常總結】mybatis-plus WHERE BINARY 中文查不出來

目錄 一、場景 二、問題 三、原因 四、解決方案 五、拓展&#xff08;全表全字段修改字符集一鍵更改&#xff09; 準備工作&#xff1a;做好整個庫備份 1. 全表一鍵修改 Stage 1&#xff1a;運行如下查詢 Stage 2&#xff1a;復制sql語句 Stage 3&#xff1a;執行即可…

100. 相同的樹(Java)

目錄 解法&#xff1a; 官方解法&#xff1a; 方法一&#xff1a;深度優先搜索 復雜度分析 時間復雜度&#xff1a; 空間復雜度&#xff1a; 方法二&#xff1a;廣度優先搜索 復雜度分析 時間復雜度&#xff1a; 空間復雜度&#xff1a; 給你兩棵二叉樹的根節點 p 和…

L1-028:判斷素數

題目描述 本題的目標很簡單&#xff0c;就是判斷一個給定的正整數是否素數。 輸入格式&#xff1a; 輸入在第一行給出一個正整數N&#xff08;≤ 10&#xff09;&#xff0c;隨后N行&#xff0c;每行給出一個小于231的需要判斷的正整數。 輸出格式&#xff1a; 對每個需要判斷的…