您好,登錄后才能下訂單哦!
本篇內容主要講解“Qt ffmpeg播放器怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Qt ffmpeg播放器怎么使用”吧!
用ffmpeg來實現自己的播放器,這是一直以來的一個目標,之前的難點卡在音視頻同步以及如何播放聲音這兩點(盡管之前已經進行過不少的嘗試和探索,但是問題還是挺多,比如音視頻同步不完美,有些文件正常而有些文件不準,聲音播放采用的sdl總感覺多了個依賴怪怪的,而且很多初學者也反映希望采用Qt自身的類來播放),近期正好把這兩個難點一一攻破了,音視頻同步采用的外部時鐘同步,聲音播放采用的Qt自帶的QAudioOutput(并沒有采用sdl,省去學習sdl開源庫的成本),播放器的demo如期進行。有時候做項目,如果將各個難點擊破以后,接下來都是順理成章水到渠成的事情,速度會非常快,這也是我經常用的策略。
最簡單基本播放器具備的功能:
播放、關閉、暫停、繼續。
音量調節、靜音設置。
進度調節、定位播放。
總時長、已播放時長。
音頻、視頻、本地文件、視頻流。
前面幾篇文章寫了音視頻同步、音頻播放、音量設置、靜音設置,這里就差一個進度調節、定位播放的處理了,ffmpeg內置了av_seek_frame函數負責定位播放幀,總共4個參數,含義分別如下:
參數1 AVFormatContext *s 表示處理媒體對象的上下文。
參數2 int stream_index 表示流的索引,填-1表示自動默認流索引。
參數3 int64_t timestamp 表示要定位的時間,單位是微妙,如果傳入的是秒則需要 * AV_TIME_BASE。
參數4 int flags 表示如何定位和查找使用的策略,建議選擇AVSEEK_FLAG_BACKWARD,其余參數容易花屏。
返回值 >= 0 表示成功。
多線程實時播放視頻流+本地視頻+USB攝像頭等。
支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位。
多線程顯示圖像,不卡主界面。
自動重連網絡攝像頭。
可設置邊框大小即偏移量和邊框顏色。
可設置是否繪制OSD標簽即標簽文本或圖片和標簽位置。
可設置兩種OSD位置和風格。
可設置是否保存到文件以及文件名。
可直接拖曳文件到ffmpegwidget控件播放。
支持h365視頻流+rtmp等常見視頻流。
可暫停播放和繼續播放。
支持存儲單個視頻文件和定時存儲視頻文件。
自定義頂部懸浮條,發送單擊信號通知,可設置是否啟用。
可設置畫面拉伸填充或者等比例填充。
可設置解碼是速度優先、質量優先、均衡處理。
可對視頻進行截圖(原始圖片)和截屏。
錄像文件存儲支持裸流和MP4文件。
音視頻完美同步,采用外部時鐘同步策略。
支持seek定位播放位置。
支持qsv、dxva2、d3d11va等硬解碼。
支持opengl繪制視頻數據,極低CPU占用。
支持安卓和嵌入式linux,交叉編譯即可。
uint FFmpegThread::getLength() { return duration * 1000; } uint FFmpegThread::getPosition() { return 0; } void FFmpegThread::setPosition(int position) { if (this->isRunning() && !isRtsp && !isUsbCamera) { pause(); QThread::msleep(100); videoSync->clear(); audioSync->clear(); int64_t timestamp = ((double)position / 1000.0) * AV_TIME_BASE; av_seek_frame(formatCtx, -1, timestamp, AVSEEK_FLAG_BACKWARD); next(); } } void FFmpegThread::play() { //通過標志位讓線程執行初始化 isPlay = true; isPause = false; } void FFmpegThread::pause() { //只對本地文件起作用 playAudio = false; if (!isRtsp && !isUsbCamera && !isPause) { isPause = true; } } void FFmpegThread::next() { //只對本地文件起作用 playAudio = true; if (!isRtsp && !isUsbCamera && isPause) { isPause = false; videoSync->reset(); audioSync->reset(); } } void FFmpegThread::stop() { //通過標志位讓線程停止 stopped = true; } void FFmpegThread::snap() { //通過標志位來截圖 句柄模式才需要 if (!callback) { isSnap = true; } }
到此,相信大家對“Qt ffmpeg播放器怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。