亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt ffmpeg播放器怎么使用

發布時間:2021-12-15 10:19:51 來源:億速云 閱讀:161 作者:iii 欄目:互聯網科技

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

一、前言

用ffmpeg來實現自己的播放器,這是一直以來的一個目標,之前的難點卡在音視頻同步以及如何播放聲音這兩點(盡管之前已經進行過不少的嘗試和探索,但是問題還是挺多,比如音視頻同步不完美,有些文件正常而有些文件不準,聲音播放采用的sdl總感覺多了個依賴怪怪的,而且很多初學者也反映希望采用Qt自身的類來播放),近期正好把這兩個難點一一攻破了,音視頻同步采用的外部時鐘同步,聲音播放采用的Qt自帶的QAudioOutput(并沒有采用sdl,省去學習sdl開源庫的成本),播放器的demo如期進行。有時候做項目,如果將各個難點擊破以后,接下來都是順理成章水到渠成的事情,速度會非常快,這也是我經常用的策略。

最簡單基本播放器具備的功能:

  1. 播放、關閉、暫停、繼續。

  2. 音量調節、靜音設置。

  3. 進度調節、定位播放。

  4. 總時長、已播放時長。

  5. 音頻、視頻、本地文件、視頻流。

前面幾篇文章寫了音視頻同步、音頻播放、音量設置、靜音設置,這里就差一個進度調節、定位播放的處理了,ffmpeg內置了av_seek_frame函數負責定位播放幀,總共4個參數,含義分別如下:

  1. 參數1 AVFormatContext *s 表示處理媒體對象的上下文。

  2. 參數2 int stream_index 表示流的索引,填-1表示自動默認流索引。

  3. 參數3 int64_t timestamp 表示要定位的時間,單位是微妙,如果傳入的是秒則需要 * AV_TIME_BASE。

  4. 參數4 int flags 表示如何定位和查找使用的策略,建議選擇AVSEEK_FLAG_BACKWARD,其余參數容易花屏。

  5. 返回值 >= 0 表示成功。

二、功能特點

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

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

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

  4. 自動重連網絡攝像頭。

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

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

  7. 可設置兩種OSD位置和風格。

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

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

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

  11. 可暫停播放和繼續播放。

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

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

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

  15. 可設置解碼是速度優先、質量優先、均衡處理。

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

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

  18. 音視頻完美同步,采用外部時鐘同步策略。

  19. 支持seek定位播放位置。

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

  21. 支持opengl繪制視頻數據,極低CPU占用。

  22. 支持安卓和嵌入式linux,交叉編譯即可。

三、效果圖

Qt ffmpeg播放器怎么使用

五、核心代碼

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播放器怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

团风县| 陇南市| 甘肃省| 什邡市| 金川县| 会宁县| 化州市| 台州市| 阿荣旗| 正宁县| 遂平县| 海兴县| 陆河县| 文山县| 福安市| 雅江县| 三明市| 施秉县| 大埔区| 靖安县| 兴义市| 阿合奇县| 宁国市| 琼结县| 黔西| 大港区| 南汇区| 博兴县| 宁德市| 新密市| 徐汇区| 平阳县| 万荣县| 湟中县| 施甸县| 苍山县| 松阳县| 文化| 日喀则市| 宣汉县| 嘉定区|