一、前言
音視頻的播放、關閉、暫停、繼續這幾個基本功能,絕大部分人都是信手拈來的搞定,關于音量調節還是稍微饒了下彎彎,最開始打算采用各個系統的api來處理,坐下來發現不大好,系統的支持不完美,比如有些api限定了win7,而xp確沒有,而且這玩意控制的是全域的音量,不好,大部分時候需要控制的是當前播放的媒體的音量,估計vlc和mpv這類播放器在處理聲音的時候也有過如此的場景分析,后面還測驗過用ffmpeg的filter濾鏡代碼控制音頻資料的分貝值,比較繁瑣,代碼量也大,不方便初學者學習,最后靈機一動去找QAudioOutput的函式看下有沒有volume的函式,果真有臥槽,原來自帶了,對Qt的愛慕之情又猛增了幾十分,這里要注意的是QAudioOutput的音量值引數是0-1的范圍double型別,而不是像vlc等播放器是0-100的值,所以需要自行轉換,
如果搞定了音量的控制,那靜音的設定當然分分鐘啦,無非就是記住之前的音量,然后將音量設定0,取消靜音的時候自動設定音量為最后記住的音量值即可,
二、功能特點
- 多執行緒實時播放視頻流+本地視頻+USB攝像頭等,
- 支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位,
- 多執行緒顯示影像,不卡主界面,
- 自動重連網路攝像頭,
- 可設定邊框大小即偏移量和邊框顏色,
- 可設定是否繪制OSD標簽即標簽文本或圖片和標簽位置,
- 可設定兩種OSD位置和風格,
- 可設定是否保存到檔案以及檔案名,
- 可直接拖曳檔案到ffmpegwidget控制元件播放,
- 支持h265視頻流+rtmp等常見視頻流,
- 可暫停播放和繼續播放,
- 支持存盤單個視頻檔案和定時存盤視頻檔案,
- 自定義頂部懸浮條,發送單擊信號通知,可設定是否啟用,
- 可設定畫面拉伸填充或者等比例填充,
- 可設定解碼是速度優先、質量優先、均衡處理,
- 可對視頻進行截圖(原始圖片)和截屏,
- 錄像檔案存盤支持裸流和MP4檔案,
- 音視頻完美同步,采用外部時鐘同步策略,
- 支持seek定位播放位置,
- 支持qsv、dxva2、d3d11va等硬解碼,
- 支持opengl繪制視頻資料,極低CPU占用,
- 支持安卓和嵌入式linux,交叉編譯即可,
三、效果圖

四、相關站點
- 國內站點:https://gitee.com/feiyangqingyun/QWidgetDemo
- 國際站點:https://github.com/feiyangqingyun/QWidgetDemo
- 個人主頁:https://blog.csdn.net/feiyangqingyun
- 知乎主頁:https://www.zhihu.com/people/feiyangqingyun/
- 體驗地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652
五、核心代碼
bool FFmpegThread::getMute()
{
return (getVolume() == 0);
}
int volume = 0;
void FFmpegThread::setMute(bool mute)
{
//先記住之前的音量以便重新設定
if (mute) {
volume = getVolume();
setVolume(0);
} else {
setVolume(volume);
}
}
int FFmpegThread::getVolume()
{
if (this->isRunning()) {
#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
return audioOutput->volume() * 100;
#endif
} else {
return 0;
}
}
void FFmpegThread::setVolume(int volume)
{
if (this->isRunning()) {
#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
//查閱手冊說范圍值是 0.0 - 1.0
audioOutput->setVolume((float)volume / 100.0);
#endif
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/131849.html
標籤:其他
上一篇:EMG信號的低通巴特沃斯濾波器
下一篇:MySql百萬資料0秒篩選查詢
