I.はじめに
オーディオとビデオの再生、クローズ、一時停止、継続の基本的な機能は、ほとんどの人が指先で操作できます。音量の調整については、まだ少し曲がっていません。最初は、各システムのAPIを使用して処理するつもりでした。座ってください。私はそれが良くないことを発見しました。システムサポートは完全ではありません。たとえば、一部のAPIはwin7を制限しますが、XPは制限しません。これはグローバルボリュームを制御しますが、良くありません。ほとんどの場合、現在再生中のメディアのボリュームを制御する必要があります。 vlcやmpvなどのプレーヤーも、サウンドを処理するときにこのようなシーン分析を行いました。後で、ffmpegのフィルターコードを使用してオーディオデータのデシベル値を制御することもテストしました。コードデータは扱いにくく、コード量も多いため、初心者には習得に不便です。ついに、ボリュームの関数があるかどうかを確認するために、QAudioOutputの関数を見つけようと思いました。これは実際にベルトから来たものであり、Qtへの愛着が10分の1増加しています。ここで注意すべき点は、QAudioOutputのボリュームの値です。パラメータは0-1の範囲のdoubleタイプであり、vlcのようなプレーヤーの0-100の値ではないため、自分で変換する必要があります。
ボリュームコントロールを取得する場合、ミュート設定はもちろん分です。前のボリュームを記憶するだけで、ボリュームを0に設定し、ミュートを解除すると、最後に記憶されたボリューム値に自動的に設定されます。
2.機能
- ビデオストリーム+ローカルビデオ+ USBカメラなどのマルチスレッドリアルタイム再生
- windows + linux + macをサポートし、ffmpeg3およびffmpeg4をサポートし、32ビットおよび64ビットをサポートします。
- メインインターフェイスにスタックされていないマルチスレッドディスプレイイメージ。
- Webカメラを自動的に再接続します。
- 境界線のサイズ、オフセット、境界線の色を設定できます。
- OSDラベルを描画するかどうか、つまりラベルテキストまたは画像とラベル位置を描画するかどうかを設定できます。
- 2つのOSD位置とスタイルを設定できます。
- ファイルに保存するかどうか、ファイル名を設定できます。
- ファイルを直接ffmpegwidgetコントロールにドラッグして再生できます。
- h265ビデオストリーム+ rtmpなどの一般的なビデオストリームをサポートします。
- 再生を一時停止して再開できます。
- 単一のビデオファイルのストレージとビデオファイルのタイミングストレージをサポートします。
- 上部のフローティングバーをカスタマイズし、クリック信号通知を送信して、それを有効にするかどうかを設定します。
- 画面のストレッチ塗りつぶしまたは同じ比率の塗りつぶしを設定できます。
- デコードを速度優先、品質優先、およびイコライゼーション処理に設定できます。
- スクリーンショット(元の写真)とビデオのスクリーンショットを撮ることができます。
- ビデオファイルストレージは、ベアストリームとMP4ファイルをサポートします。
- オーディオとビデオは、外部クロック同期戦略を使用して完全に同期されます。
- 再生位置の検索をサポートします。
- qsv、dxva2、d3d11vaなどのハードデコードをサポートします。
- OpenGLをサポートしてビデオデータを描画します。CPU使用率は非常に低くなります。
- Androidと組み込みLinuxをサポートし、クロスコンパイルするだけです。
3、レンダリング
4、関連サイト
- 国内サイト:https : //gitee.com/feiyangqingyun/QWidgetDemo
- 国際サイト:https : //github.com/feiyangqingyun/QWidgetDemo
- 個人ホームページ:https : //blog.csdn.net/feiyangqingyun
- Zhihuホームページ:https ://www.zhihu.com/people/feiyangqingyun/
- エクスペリエンスアドレス:https : //blog.csdn.net/feiyangqingyun/article/details/97565652
5、コアコード
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
}
}