Qt/C++原創推流工具/支持多種流媒體服務/ZLMediaKit/srs/mediamtx等

一、前言

1.1 功能特點

  1. 支持各種本地視頻文件和網絡視頻文件。
  2. 支持各種網絡視頻流,網絡攝像頭,協議包括rtsp、rtmp、http。
  3. 支持將本地攝像頭設備推流,可指定分辨率和幀率等。
  4. 支持將本地桌面推流,可指定屏幕區域和幀率等。
  5. 自動啓動流媒體服務程序,默認mediamtx(原rtsp-simple-server),可選用srs、EasyDarwin、LiveQing、ZLMediaKit等。
  6. 可實時切換預覽視頻文件,可切換視頻文件播放進度,切換到哪裏就推流到哪裏。
  7. 推流的清晰度和質量可調。
  8. 可動態添加文件、目錄、地址。
  9. 視頻文件自動循環推流,如果視頻源是視頻流,在掉線後會自動重連。
  10. 網絡視頻流自動重連,重連成功自動繼續推流。
  11. 網絡視頻流實時性極高,延遲極低,延遲時間大概在100ms左右。
  12. 極低CPU佔用,4路主碼流推流只需要佔用0.2%CPU。理論上常規普通PC機器推100路毫無壓力,主要性能瓶頸在網絡。
  13. 推流可選推流到rtsp/rtmp兩種,推流後的數據支持直接rtsp/rtmp/hls/webrtc四種方式訪問,可以直接瀏覽器打開看實時畫面。
  14. 可以推流到外網服務器,然後通過手機、電腦、平板等設備播放對應的視頻流。
  15. 每個推流都可以手動指定唯一標識符(方便拉流/用戶無需記憶複雜的地址),沒有指定則按照策略隨機生成hash值。
  16. 自動生成測試網頁直接打開播放,可以看到實時效果,自動按照數量對應宮格顯示。
  17. 推流過程中可以在表格中切換對應推流項,實時預覽正在推流的視頻,並可以切換視頻文件的播放進度。
  18. 音視頻同步推流,符合264/265/aac格式的自動原數據推流,不符合的自動轉碼再推流(會佔用一定CPU)。
  19. 轉碼策略支持三種,自動處理(符合要求的原數據/不符合的轉碼),僅限文件(文件類型的轉碼視頻),所有轉碼。
  20. 表格中實時顯示每一路推流的分辨率和音視頻數據狀態,灰色表示沒有輸入流,黑色表示沒有輸出流,綠色表示原數據推流,紅色表示轉碼後的數據推流。
  21. 自動重連視頻源,自動重連流媒體服務器,保證啓動後,推流地址和打開地址都實時重連,只要恢復後立即連上繼續採集和推流。
  22. 提供循環推流示例,一個視頻源同時推流到多個流媒體服務器,比如打開一個視頻同時推流到抖音/快手/B站等,可以作爲錄播推流,列表循環,非常方便實用。
  23. 根據不同的流媒體服務器類型,自動生成對應的rtsp/rtmp/hls/flv/ws-flv/webrtc地址,用戶可以直接複製該地址到播放器或者網頁中預覽查看。
  24. 編碼視頻格式可以選擇自動處理(源頭是264就264/源頭是265就265),轉H264(強制轉264),轉H265(強制轉265)。
  25. 支持Qt4/Qt5/Qt6任意版本,支持任意系統(windows/linux/macos/android/嵌入式linux等)。

1.2 使用步驟

  1. 選擇或者填寫推流的前綴地址,建議默認即可。
  2. 單擊添加文件或者目錄,選擇要加入推流的音視頻文件,添加成功以後會自動羅列在表格中。
  3. 單擊添加地址,可以從下拉框中選擇或者填寫,下拉選項中是一些格式模板,比如本地攝像頭、本地桌面、電視臺、網絡攝像機等。
  4. 單擊啓動服務按鈕,會變成停止服務字樣表示啓動服務成功。
  5. 在啓動服務後支持動態添加地址、移除地址、清空地址。如果處於啓動服務中,添加後會立即推流。
  6. 從表格中選中一行,會自動將播放地址填寫到右下角,同時也會自動拷貝到剪切板。
  7. 一次推流可以分多種不同的地址訪問,右下角總共有四種地址,第一種是rtsp開頭的視頻流地址,可以用各種播放器打開;第二種是rtmp開頭的視頻流地址,可以用各種播放器打開;第三種是hls(m3u8)格式的地址,一般用於網頁瀏覽器顯示;第四種是webrtc格式的地址,一般用於瀏覽器或者部分支持該格式的播放器。
  8. 將地址粘貼到瀏覽器地址欄回車即可查看視頻流,地址也可以用播放器打開。
  9. 單擊停止服務按鈕會停止所有服務,在啓動服務後支持動態添加文件、移除文件、清空文件。
  10. 在添加的時候可以手動填寫唯一標識(obs中的推流碼,其實就是推流地址後的一串字符,很多流媒體服務會規定一個地址給你推流),沒有填寫則按照規則自動生成(切記這個唯一標識推流碼一定要在添加前寫好,他是在添加的時候設置進去的)。
  11. 可以在表格中選中某行,實時預覽對應的推流的畫面,如果是文件,會自動顯示對應的播放進度和總時長,可以切換進度條拉動播放進度,推流那邊也會自動切換到當前的進度畫面。
  12. 如果選擇的是rtmp推流地址,則H265格式會自動轉換成H264的格式推流,rtsp推流地址直接支持H265格式視頻數據。
  13. 默認hls/m3u8地址提供的是直接網頁瀏覽器地址欄輸入可以直接打開播放的,如果想要播放器直接播放的那種,格式在原來的地址後面加上 /index.m3u8,比如 http://127.0.0.1:8888/test/index.m3u8 。播放器播放hls地址延遲很大,可能在10s左右,不推薦用這個地址,推薦網頁用webrtc,播放器用rtsp。

1.3 格式說明

  1. 本地攝像頭推流,video=USB Video Device|1280x720|25,video=是固定前綴,USB Video Device是攝像頭的英文名字,可以在設備管理器中鼠標右鍵查看,1280x720表示分辨率,25表示採集幀率,不填寫分辨率默認按照640x480,不填寫幀率默認按照25。
  2. 本地桌面推流,desktop=desktop|800x600|25|0|0,desktop=是固定前綴,後面的desktop表示桌面,800x600是分辨率,25是幀率,後面的0|0表示開始的座標XY,形成一個矩形區域實時抓屏推流。不指定分辨率和XY表示當前屏幕整個屏幕。
  3. 多屏幕推流,要推流屏幕1則地址填desktop=desktop||25|0|0|0,要推流屏幕2則地址填desktop=desktop||25|0|0|1,分辨率可以不填,會自動以整個桌面分辨率爲準,末尾表示屏幕索引,從0開始。
  4. 指定窗口推流,desktop=title=MainWindow,MainWindow是對應窗口的標題名稱,由於窗口名稱可能重名,所以未必能找到合適的窗口,而且很多窗體不允許抓圖,此方案不推薦。
  5. 指定縮放推流,目前只對桌面推流啓用,desktop=desktop|800x600|25|0|0|-1|0.5 表示縮放50%推流,desktop=desktop|1920x1080|25|0|0|-1|640x480 表示按照640x480分辨率縮放推流,建議設置縮放百分比,這樣等比例縮放。
  6. 桌面推流如果採集的分辨率過大,建議降低幀率以便減少CPU佔用,比如設置成10即可,尤其是1080P以上的屏幕。
  7. 桌面推流可以添加多個不同分辨率推流,可以按照自己需要的分辨率拉流。
  8. 視頻流地址後面加上|tcp表示採用tcp協議通信,比如rtsp://192.168.0.108|tcp。
  9. 詳細格式說明參見 https://feiyangqingyun.gitee.io/qwidgetdemo/video_system/#07-視頻格式

1.4 代碼使用

  1. 將pri組件拷貝到你的項目下,pro中加一行引入推流組件include ($$PWD/../core_videopush/core_videopush.pri)。
  2. 如果是網絡推流則還需要引入ffmpeg等視頻組件,參見提供的源碼的pro中的寫法。
  3. 引入頭文件#include "ffmpegpushserver.h"。
  4. 編寫代碼實現網絡推流服務。
//實例化類
FFmpegPushServer *ffmpegPush = new FFmpegPushServer;
//設置推流地址
ffmpegPush->setPushUrl("rtmp://127.0.0.1");
//逐個添加要推流的地址(會返回唯一標識用於拉流/也可以指定唯一標識)
ffmpegPush->addUrl("f:/1.mp4", "test1");
ffmpegPush->addUrl("video=USB Video Device|1280x720|25", "test2");
ffmpegPush->addUrl("desktop=desktop|800x600|25|0|0", "test3");
ffmpegPush->addUrl("http://vfx.mtime.cn/Video/2021/11/16/mp4/211116131456748178.mp4", "test4");
ffmpegPush->addUrl("rtsp://admin:[email protected]:554/Streaming/Channels/101", "test5");
//獲取拉流地址(該地址是rtmp拉流地址/可以用播放器播放)
QString url = ffmpegPush->getPushUrl("f:/1.mp4");
//啓動推流服務
ffmpegPush->start();
//結束的時候停止
ffmpegPush->stop();

二、效果圖









三、體驗地址

  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_push。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章