日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、前言

采用ffmpeg解碼,是所有視頻監控開發人員必備的技能,繞不過去的一個玩意,甚至可以說是所有音視頻開發人員的必備技能。FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,并能將其轉化為流的開源計算機程序。它包括了目前領先的音/視頻編碼庫libavcodec。 FFmpeg是在 linux 下開發出來的,但它可以在包括 windows 在內的大多數操作系統中編譯。這個項目是由 Fabrice Bellard 發起的,現在由 Michael Niedermayer 主持。可以輕易地實現多種視頻格式之間的相互轉換,例如可以將攝錄下的視頻avi等轉成現在視頻網站所采用的flv格式。

關于ffmpeg解碼,網上搜索到的代碼絕對是一大堆一大堆,而且很多都講得很詳細,解碼的函數流程圖非常清晰,關于ffmpeg這塊的學習本人推薦雷神的博客,分析的相當細致,我在很久以前剛用Qt+ffmpeg解碼的時候,參考的就是雷神的例子,當然這些demo其實在ffmpeg的開發包dev下的examples也是非常詳細的,只不過沒有什么分析過程,參考雷神的博客可以看到很多分析過程。

本人總結的解碼過程:

1. 注冊解碼庫相關(av_register_all、avformat_network_init等)

2. 初始化各種參數比如緩存大小等(av_dict_set)

3. 打開視頻流或者文件(avformat_alloc_context、avformat_open_input)

4. 獲取流信息(avformat_find_stream_info)

5. 獲取視頻流并初始化視頻解碼器(av_find_best_stream、avcodec_find_decoder)

6. 獲取音頻流并初始化音頻解碼器(av_find_best_stream、avcodec_find_decoder、avcodec_open2)

7. 預分配幀內存(av_frame_alloc)

8. 循環讀取音視頻幀(av_read_frame、av_packet_unref)

9. 解碼視頻(avcodec_decode_video2或者avcodec_send_packet、avcodec_receive_frame)

10. 解碼音頻(avcodec_decode_audio4)

11. 處理結束釋放資源(sws_freeContext、av_frame_free、av_free)

## 二、功能特點

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

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

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

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

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

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

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

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

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

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

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

12. 支持回調模式和句柄兩種模式。

13. 支持線程讀取進度等信息和事件回調兩種處理模式。

14. 自動將當前播放位置和音量大小是否靜音以信號發出去。

15. 提供接口設置播放位置和音量及設置靜音。

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

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

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

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

20. 支持嵌入式linux。

## 三、效果圖

 

Qt音視頻開發6-ffmpeg解碼處理

 

 

## 四、相關站點

1. 國內站點:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo)

2. 國際站點:[https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)

3. 個人主頁:[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun)

4. 知乎主頁:[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/)

5. 體驗地址:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)

## 五、核心代碼

bool FFmpegThread::init()
{    //判斷該攝像機是否能聯通    if (checkConn && isRtsp) {
        if (!checkUrl(url, checkTime)) {
            return false;
        }    }    //初始化參數    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(){    //在打開碼流前指定各種參數比如:探測時間/超時時間/最大延時等    //設置緩存大小,1080p可將值調大
    av_dict_set(&options, "buffer_size", "8192000", 0);
    //以tcp方式打開,如果以udp方式打開將tcp替換為udp    av_dict_set(&options, "rtsp_transport", transport.toLatin1().constData(), 0);
    //設置超時斷開連接時間,單位微秒,3000000表示3秒
    av_dict_set(&options, "stimeout", "3000000", 0);
    //設置最大時延,單位微秒,1000000表示1秒
    av_dict_set(&options, "max_delay", "1000000", 0);
    //自動開啟線程數    av_dict_set(&options, "threads", "auto", 0);
    //設置USB攝像機分辨率    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();    //先判斷是否是本地設備(video=設備名字符串),打開的方式不一樣    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;
    }    //釋放設置參數    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;
}

分享到:
標簽:ffmpeg
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定