Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 精品在线99,日韩在线视频网站,在线看片你懂的

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          網站該如何做好首屏的打開加載速度優化?

          網站該如何做好首屏的打開加載速度優化?

          有的搜索引擎排名與網站的加載速度或多或少有些關系,而這次百度閃電算法來了,將網站首屏打開速度被列入優化排名行列,并明確指定打開時間為2秒,那么我們在如何做好網頁首屏的打開速度呢?

          要做好網站速度優化,就必須要做好軟件和硬件兩個方面,從網站程序以及頁面設計本身解決網頁資源的加載,然后就是服務器本身需要有足夠的帶寬及處理資源,下面子凡就依次來與大家探討。

          首先我們打開一個網頁看到的都只是前端,所以我們看到一個頁面背后的支持就是HTML代碼,其中就包含了各種網頁標簽,其中包括網站優化中的TKD,載入的渲染資源:javascript、css,已經頁面內容:圖片、音頻、視頻等。

          一、代碼的足夠簡潔

          減少代碼冗余,保持簡潔的代碼風格,這是作為一個網頁程序員的必修,能同樣實現一個效果的能用css就盡量不用js,能用兩行代碼解決問題的就別寫三行,這是最基礎的一點。

          二、減少資源載入

          這里子凡所說的資源主要是指js、css文件,因為我知道現在很多的前端開發設計人員喜歡用各種開源的特效或者別人做好的效果,其中包括為了給網站添加幾個圖標就引入一個開源的圖標字體庫,為了某個特效又在引入幾個js和css文件,這無形之中就為網站加重了“份量”。

          三、圖片使用懶加載,視頻或音頻禁止自動播放

          還記得子凡曾在淚雪博客寫過關于“圖片懶加載是否會影響網站SEO優化”的文章,其中就說到過如何合理的使用圖片懶加載技術提升用戶體驗而不影響網站優化,因為懶加載是為了防止頁面一被打開就立即載入圖片,這樣就會占用網絡帶寬,從而影響網站的打開速度以及網站首屏的請求,所以非正文圖片都是可以做懶加載的。

          圖片是每個網站基本都少不了的東西,但是對于做視頻、音頻的站點來說,如果打開頁面就自動播放,占用的網站帶寬資源都更多了,所以這也是一個網站打開速度優化的一個小知識。

          四、使用CDN加速靜態資源

          關于使用CDN加速是否影響網站優化的文章子凡也曾有過討論,子凡對于網站整體做CDN加速還是有些不太認同,但是對于將網站靜態資源做CDN加速鏡像或者緩存優化卻是非常認同的,例如將網站的js、css、圖片等文件做CDN加速是更有利于整個網站的加載和打開速度的。

          五、提升頁面渲染速度

          1. 將CSS樣式寫在頭部樣式表中,減少由CSS文件網絡請求造成的渲染阻塞。

          2. 將JavaScript放到文檔末尾,或使用async方式加載,避免JS執行阻塞渲染。

          3. 對非文字元素(如圖片,視頻)指定寬高,避免瀏覽器重排重繪。

          六、服務器本身的速度優化

          1. 啟用服務器Gzip壓縮功能;

          2. 開啟數據庫查詢及頁面緩存功能(如果是直接生成靜態頁面的網站可忽略);

          3. 升級或者保證服務器足夠的網絡帶寬;

          4. 開啟網站緩存,充分利用本地緩存。

          同樣隨著網絡安全的重視程度,如果你的網站已經安裝SSL證書啟用了HTTPS協議,那么你可以開啟HTTPS/2或者SPDY這個功能,可以在某些程度上加速網站的打開。

          總結

          雖然百度“閃電算法”是正對移動搜索排名的算法,而子凡上述的所有知識點都是通用的,并沒有移動端或電腦端的區分,寫得不算非常詳細,子凡只是將這些非常容易出現的問題或者被忽略的問題按照自己的思路寫出來了,雖然語句都寫得非常簡單,但是要真的操作起來,如果你不懂網頁代碼或者服務器,操作起來可能也會是已經非常困難的事情。

          最后最后子凡還想給自己的 Fanly MIP 主題打個廣告,如果你使用WordPress程序,并且重視百度這次的閃電算法,你可以使用子凡開發的這個MIP主題和插件,因為主題和插件都提供免費版本,所以大家可以非常方便的接入,當然你也可以支持子凡或者想要更好的服務可以購買我的收費版本。

          好啦,如果你看這里,本文從標題到正文,再到最后的廣告你都已經閱讀完畢。see you。。。

          除非注明,否則均為淚雪博客原創文章,轉載請以鏈接形式標明本文地址

          本文鏈接:https://zhangzifan.com/website-speed-seo.html

          放內存中的音樂

              QFile read("./music/Nevada.mp3");
              if (!read.open(QIODevice::ReadOnly))
              {
                  qDebug() << "文件打開失敗,請重試~";
              }
              //下面用的對象,必須動態申請,不然構造函數執行完畢,局部變量內存會被釋放
              QByteArray *data=new QByteArray(read.readAll());
              read.close();
          
              QBuffer *buffer=new QBuffer(data,this);
              if (!buffer->open(QIODevice::ReadWrite))
              {
                  qDebug() << "buffer error";
              }
              //qDebug() << data;
              QMediaPlayer *player=new QMediaPlayer(this);
              player->setMedia(QMediaContent(),buffer);
              player->play();

          播放內存中的視頻

              QMediaPlayer *player=new QMediaPlayer(this);
              player->setMedia(QUrl("./music/MMD.mp4"));
              player->play();
          ?
              QVideoWidget* videowidget=new QVideoWidget(this);
              player->setVideoOutput(videowidget);

          vs中如果提示編譯器堆空間不足,則打開vcxproj工程文件,在PropertyGroup中添加如下代碼

          <PropertyGroup Label="Globals">
              <!-- 資源文件加載,防止編譯器堆空間不足 -->
               <PreferredToolArchitecture>x64</PreferredToolArchitecture> 
          </PropertyGroup>

          【領QT開發教程學習資料,點擊下方鏈接免費領取↓↓,先碼住不迷路~】

          點擊→領取「鏈接」

          音視頻播放

          播放音頻

          在Qt中,要想使計算機發出響聲,最簡單的方法是調用QApplication : : beep()靜態函數。而Qt Multimedia模塊中提供了多個類來實現不同層次的音頻輸入,輸出和處理。

          QSound

          QSound類提供了播放.wav聲音文件的方法。

          Qt 提供了 GUI 應用程序中最常用的音頻操作:異步播放聲音文件。 使用靜態 play() 函數最容易做到這一點:

           QSound::play("mysounds/bells.wav");

          或者,首先從聲音文件創建一個 QSound 對象,然后調用 play() 槽:

            QSound bells("mysounds/bells.wav");
            bells.play();

          在這兩種情況下,文件可能是本地文件或資源中的文件。

          一旦創建了 QSound 對象,就可以查詢它的 fileName() 和 loops() 總數(即聲音播放的次數)。 可以使用 setLoops() 函數更改重復次數。 播放聲音時,loopsRemaining() 函數返回剩余的重復次數。 使用 isFinished() 函數來確定聲音是否播放完畢。

          使用 QSound 對象播放的聲音可能會比靜態 play() 函數使用更多的內存,但它也可能播放得更快(取決于底層平臺的音頻設施)。

          如果您需要更好地控制播放聲音,請考慮 QSoundEffect 或 QAudioOutput 類。

          Public Functions

          QSound(const QString &filename, QObject *parent=nullptr)
          virtual ~QSound()
          QString fileName() const
          bool isFinished() const
          int loops() const
          int loopsRemaining() const
          void setLoops(int number)

          Slots

          void play()
          void stop()

          Static Public Members

          void play(const QString &filename)

          QSoundEffect

          QSoundEffect類提供了一種播放低延遲聲音效果的方法 。

          這個類允許你以較低的延遲方式播放未壓縮的音頻文件(通常是WAV文件),并且適用于“反饋”類型的聲音,以響應用戶的動作(例如虛擬鍵盤聲音,彈出對話框的正面或負面反饋,或游戲聲音)。 如果低延遲不重要,可以考慮使用QMediaPlayer類,因為它支持更廣泛的媒體格式,并且資源消耗更少。

          看個例子:

          QSoundEffect effect;
          effect.setSource(QUrl::fromLocalFile("F:/MyCode/QtObjectCode/QtCourse/soundeffect/video_call.wav"));
          effect.setLoopCount(QSoundEffect::Infinite);
          effect.setVolume(0.8f);
          effect.play();

          通常應該重用音效,這樣可以提前完成所有解析和準備工作,并且只在必要時觸發。 這有助于降低延遲音頻播放。

          class MyGame
          {
          public:
            MyGame(): m_videoCall(this)
            {
                m_videoCall.setSource(QUrl::fromLocalFile("video_call.wav"));
                m_videoCall.setVolume(0.25f);
          ?
                // Set up click handling etc.
                connect(clickSource, &QPushButton::clicked, &m_videoCall, &QSoundEffect::play);
            }
          private:
            QSoundEffect m_videoCall;
          }

          由于QSoundEffect需要更多的資源來實現較低的延遲播放,平臺可能會限制同時播放聲音效果的數量。

          【領QT開發教程學習資料,點擊下方鏈接免費領取↓↓,先碼住不迷路~】

          點擊→領取「鏈接」

          Public Functions

          • 設置
          //設置源(wav文件路徑)
          void setSource(const QUrl &url)
          //設置循環次數  
          void setLoopCount(int loopCount)
          //設置靜音
          void setMuted(bool muted)
          //設置音量0~1之間
          void setVolume(qreal volume)
          • 判斷
          //音效是否加載完畢
          bool isLoaded() const
          //是否是靜音    
          bool isMuted() const
          //是否正在播放    
          bool isPlaying() const

          Slots

          void play() //播放
          void stop() //停止

          Signals

          void categoryChanged()
          void loadedChanged()
          void loopCountChanged()
          void loopsRemainingChanged()
          void mutedChanged()
          void playingChanged()
          void sourceChanged()
          void statusChanged()
          void volumeChanged()

          枚舉

          QSoundEffect::Status

          枚舉

          描述

          QSoundEffect::Null

          未設置源或源為空。

          QSoundEffect::Loading

          SoundEffect 正在嘗試加載源。

          QSoundEffect::Ready

          源已加載并準備好播放。

          QSoundEffect::Error

          運行過程中出現錯誤,例如加載源失敗。

          QMediaPlayer

          QMediaPlayer類是一個高級媒體播放類。 它可以用來播放歌曲、電影和網絡廣播等內容。 要播放的內容被指定為QMediaContent對象,可以將其視為附加了附加信息的主要或規范URL。 當提供QMediaContent時,可以開始播放。

          QMediaPlayer player;
          player.setMedia(QUrl::fromLocalFile("F:/MyCode/QtObjectCode/QtCourse/soundeffect/That-Girl.mp3"));
          player.setVolume(50);
          player.play();

          QVideoWidget可以與QMediaPlayer一起用于視頻渲染,QMediaPlaylist用于訪問播放列表功能。

          QVideoWidget wid;
          wid.show();
          ?
          QMediaPlaylist playList;
          playList.addMedia(QUrl::fromLocalFile("F:/MyCode/QtObjectCode/QtCourse/soundeffect/That-Girl.mp3"));
          playList.addMedia(QUrl::fromLocalFile("F:/MyCode/QtObjectCode/QtCourse/soundeffect/干坤坤.mp4"));
          ?
          QMediaPlayer player;
          player.setPlaylist(&playList);
          //player.setMedia(QUrl::fromLocalFile("F:/MyCode/QtObjectCode/QtCourse/soundeffect/That-Girl.mp3"));
          player.setVolume(50);
          playList.next();
          player.setVideoOutput(&wid);
          player.play();

          Public Functions

          //該值是當前媒體的總播放時間,以毫秒為單位。 該值可能在QMediaPlayer對象的生命周期中發生變化,并且可能在初始回放開始時不可用,請連接到durationChanged()信號來接收狀態通知。  
          qint64 duration() const
          //將QVideoWidget視頻輸出附加到媒體播放器。  
          void setVideoOutput(QVideoWidget *output)
          void setVideoOutput(QGraphicsVideoItem *output)
          void setVideoOutput(QAbstractVideoSurface *surface)  

          Public Slots

          //暫停播放當前源
          void pause()    
          //開始或恢復播放當前源    
          void play()
          //設置當前媒體源。 使用mediaStatusChanged()和error()信號,以便在加載媒體和加載過程中發生錯誤時得到通知      
          void setMedia(const QMediaContent &media, QIODevice *stream=nullptr)
          //設置靜音    
          void setMuted(bool muted)
          //設置倍速播放
          void setPlaybackRate(qreal rate)
          //設置播放列表    
          void setPlaylist(QMediaPlaylist *playlist)
          //設置播放位置,以媒體開始后的毫秒數為單位。 位置的周期性變化將用信號positionChanged()表示,更新間隔可以用QMediaObject的方法setNotifyInterval()設置。    
          void setPosition(qint64 position)
          //此屬性保存當前播放音量。  播放音量是線性縮放的,從0(靜音)到100(全音量)。默認為100      
          void setVolume(int volume)
          //停止播放,并將播放位置重置到開始    
          void stop()

          Signals

          //表示當前播放內容已更改為media。  
          void currentMediaChanged(const QMediaContent &media)
          //表示內容的持續時間已更改為持續時間,以毫秒表示。  
          void durationChanged(qint64 duration)    
          //產生了錯誤
          void error(QMediaPlayer::Error error)
          //表示媒體來源已轉變為media。      
          void mediaChanged(const QMediaContent &media)
          //表示當前媒體的狀態已經改變    
          void mediaStatusChanged(QMediaPlayer::MediaStatus status)
          //靜音狀態改變  
          void mutedChanged(bool muted)
          //播放速率改變
          void playbackRateChanged(qreal rate)
          //播放位置改變    
          void positionChanged(qint64 position)
          //表示播放器對象的狀態已經改變。  
          void stateChanged(QMediaPlayer::State state)
          //音量改變
          void volumeChanged(int volume)

          枚舉

          (enum QMediaPlayer::Error)媒體播放器產生的具體錯誤。

          枚舉

          描述

          MediaPlayer::NoError

          沒有錯誤發生

          QMediaPlayer::ResourceError

          無法解析媒體源

          QMediaPlayer::FormatError

          媒體資源的格式不受(完全)支持。 重新播放是可能的,但沒有音頻或視頻組件。

          QMediaPlayer::NetworkError

          網絡錯誤

          QMediaPlayer::AccessDeniedError

          沒有播放媒體資源的適當權限。

          QMediaPlayer::ServiceMissingError

          找不到有效的播放服務,無法繼續播放。

          (enum QMediaPlayer::Flag)播放標志。

          枚舉

          描述

          QMediaPlayer::LowLatency

          該播放器預計將用于簡單的音頻格式,播放沒有明顯的延遲。 這種回放服務可以用于蜂鳴聲、鈴聲等。

          QMediaPlayer::StreamPlayback

          該播放器預計將播放基于QIODevice的流。 如果傳遞給QMediaPlayer構造器,將選擇支持流回放的服務。

          QMediaPlayer::VideoSurface

          期望播放器能夠呈現為QAbstractVideoSurface輸出。

          (enum QMediaPlayer::MediaStatus)定義媒體播放器當前媒體的狀態。

          枚舉

          描述

          QMediaPlayer::UnknownMediaStatus

          無法確定媒體的狀態。

          QMediaPlayer::NoMedia

          沒有當前的媒體。 播放器處于停止狀態。

          QMediaPlayer::LoadingMedia

          當前媒體正在加載中。 播放器可能處于任何狀態。

          QMediaPlayer::LoadedMedia

          已加載當前媒體。 播放器處于停止狀態。

          QMediaPlayer::StalledMedia

          由于緩沖不足或其他一些臨時中斷,當前媒體的播放已停止。 播放器處于PlayingState或PausedState

          QMediaPlayer::BufferingMedia

          播放器正在緩沖數據,但緩沖了足夠的數據以供播放。 播放器處于PlayingState或PausedState。

          QMediaPlayer::BufferedMedia

          播放器已經完全緩沖了當前的媒體。 播放器處于PlayingState或PausedState。

          QMediaPlayer::EndOfMedia

          播放已經結束。 播放器處于停止狀態。

          QMediaPlayer::InvalidMedia

          當前媒體無法播放。 播放器處于停止狀態。

          (enum QMediaPlayer::State)媒體播放器的當前狀態。

          枚舉

          描述

          QMediaPlayer::StoppedState

          播放停止狀態

          QMediaPlayer::PlayingState

          播放進行狀態

          QMediaPlayer::PausedState

          播放暫停狀態

          QMediaPlaylist

          QMediaPlaylist類提供了要播放的媒體內容列表。

          QMediaPlaylist旨在與其他媒體對象一起使用,如QMediaPlayer。

          QMediaPlaylist允許訪問服務固有的播放列表功能(如果可用的話),否則它提供本地內存播放列表實現。

            playlist=new QMediaPlaylist;
            playlist->addMedia(QUrl("http://example.com/movie1.mp4"));
            playlist->addMedia(QUrl("http://example.com/movie2.mp4"));
            playlist->addMedia(QUrl("http://example.com/movie3.mp4"));
            playlist->setCurrentIndex(1);
          ?
            player=new QMediaPlayer;
            player->setPlaylist(playlist);
          ?
            videoWidget=new QVideoWidget;
            player->setVideoOutput(videoWidget);
            videoWidget->show();
          ?
            player->play();

          根據播放列表源代碼的實現,大多數播放列表更改操作可以是異步的。

          【領QT開發教程學習資料,點擊下方鏈接免費領取↓↓,先碼住不迷路~】

          點擊→領取「鏈接」

          Public Functions

          • 構造與析構
          QMediaPlaylist(QObject *parent=nullptr)
          virtual ~QMediaPlaylist()
          • 添加/移除/清空媒體
          bool addMedia(const QMediaContent &content)
          bool addMedia(const QList<QMediaContent> &items)
              
          bool insertMedia(int pos, const QMediaContent &content)
          bool insertMedia(int pos, const QList<QMediaContent> &items)    
              
          bool removeMedia(int pos)
          bool removeMedia(int start, int end)
          
          bool clear()
          • 保存/加載播放列表
          bool save(const QUrl &location, const char *format=nullptr)
          bool save(QIODevice *device, const char *format)
          
          void load(const QNetworkRequest &request, const char *format=nullptr)
          void load(const QUrl &location, const char *format=nullptr)
          void load(QIODevice *device, const char *format=nullptr)
          • 獲取播放內容
          int currentIndex() const
          QMediaContent currentMedia() const
          
          QMediaContent media(int index) const
          int nextIndex(int steps=1) const 
          int previousIndex(int steps=1) const
              
          int mediaCount() const
          • 操作播放列表
          bool moveMedia(int from, int to)
          void setPlaybackMode(QMediaPlaylist::PlaybackMode mode)
          • 其他
          QMediaPlaylist::Error error() const
          QString errorString() const
              
          bool isEmpty() const
          bool isReadOnly() const

          slots

          void next()
          void previous()
          void setCurrentIndex(int playlistPosition)
          void shuffle()

          signals

          void currentIndexChanged(int position)
          void currentMediaChanged(const QMediaContent &content)
          void loadFailed()
          void loaded()
          void mediaAboutToBeInserted(int start, int end)
          void mediaAboutToBeRemoved(int start, int end)
          void mediaChanged(int start, int end)
          void mediaInserted(int start, int end)
          void mediaRemoved(int start, int end)
          void playbackModeChanged(QMediaPlaylist::PlaybackMode mode)

          枚舉

          (enum QMediaPlaylist::Error)QMediaPlaylist錯誤碼。

          枚舉

          描述

          QMediaPlaylist::NoError

          沒有錯誤

          QMediaPlaylist::FormatError

          格式錯誤

          QMediaPlaylist::FormatNotSupportedError

          格式不支持

          QMediaPlaylist::NetworkError

          網絡錯誤

          QMediaPlaylist::AccessDeniedError

          訪問錯誤(拒絕訪問)

          (enum QMediaPlaylist::PlaybackMode)描述了播放列表中的播放順序。

          枚舉

          描述

          QMediaPlaylist::CurrentItemOnce

          單曲播放一次

          QMediaPlaylist::CurrentItemInLoop

          單曲循環

          QMediaPlaylist::Sequential

          順序播放(列表播放完結束)

          QMediaPlaylist::Loop

          列表循環(列表播放完,從頭開始繼續播放)

          QMediaPlaylist::Random

          隨機播放

          QMediaContent

          QMediaContent類提供對與媒體內容相關的資源的訪問。

          QMediaContent在多媒體框架內用作媒體內容的邏輯句柄。 一個QMediaContent對象包含一個QNetworkRequest,它提供了內容的URL。

          非空QMediaContent將始終具有對通過request()方法可用的內容的引用。

          另外,QMediaContent可以表示播放列表,并包含指向有效QMediaPlaylist對象的指針。 在這種情況下URL是可選的,可以是空的,也可以指向播放列表的URL。

          Public Functions

          QMediaContent(QMediaPlaylist *playlist, const QUrl &contentUrl=QUrl(), bool takeOwnership=false)
          QMediaContent(const QMediaContent &other)
          QMediaContent(const QNetworkRequest &request)
          QMediaContent(const QUrl &url)
          QMediaContent()
          QMediaContent &operator=(const QMediaContent &other)
          ~QMediaContent()
          bool isNull() const
          QMediaPlaylist *playlist() const
          QNetworkRequest request() const
          bool operator!=(const QMediaContent &other) const
          bool operator==(const QMediaContent &other) const

          視頻播放

          QMediaPlayer

          QMediaPlayer類可用來播放視頻,只不過需要搭配專門的視頻顯示控件來使用。

          • 針對視頻播放的函數
          void setVideoOutput(QVideoWidget *output)
          void setVideoOutput(QGraphicsVideoItem *output)
              
          //當前媒體的視頻是否可用,如果可用,可以使用QVideoWidget類來查看視頻。
          bool isVideoAvailable() const    

          QVideoWidget

          • 需包含模塊multimediawidgets

          QVideoWidget類提供了一個小部件,用于呈現由媒體對象生成的視頻。

          將 QVideoWidget 附加到 QMediaObject 允許它顯示該媒體對象的視頻或圖像輸出。 QVideoWidget 通過在其構造函數中傳遞指向 QMediaObject 的指針附加到媒體對象,并通過銷毀 QVideoWidget 來分離。

            player=new QMediaPlayer;
          ?
            playlist=new QMediaPlaylist(player);
            playlist->addMedia(QUrl("http://example.com/myclip1.mp4"));
            playlist->addMedia(QUrl("http://example.com/myclip2.mp4"));
          ?
            videoWidget=new QVideoWidget;
            player->setVideoOutput(videoWidget);
          ?
            videoWidget->show();
            playlist->setCurrentIndex(1);
            player->play();

          注意:一次只能將一個顯示輸出附加到媒體對象。

          Public Functions

          QVideoWidget(QWidget *parent=nullptr)
          virtual ~QVideoWidget()
              
          Qt::AspectRatioMode aspectRatioMode() const
          int brightness() const      //亮度
          int contrast() const        //對比度
          int hue() const             //色調
          bool isFullScreen() const   //是否全屏
          int saturation() const      //飽和度

          Slots

          //設置視頻縮放時,寬度和高度的變化模式
          void setAspectRatioMode(Qt::AspectRatioMode mode)
          //調整顯示視頻的亮度。有效亮度值范圍在 -100 到 100 之間,默認值為 0。    
          void setBrightness(int brightness)
          //調整顯示的視頻的對比度。有效對比度值范圍在-100到100之間,默認值為0。     
          void setContrast(int contrast)
          //調整顯示視頻的色調。有效的色調值范圍在 -100 到 100 之間,默認值為 0。    
          void setHue(int hue)
          //調整顯示視頻的飽和度。 有效的飽和度值范圍在-100到100之間,默認值是0。
          void setSaturation(int saturation)    
          //設置窗口全屏顯示    
          void setFullScreen(bool fullScreen)

          Signals

          //亮度改變
          void brightnessChanged(int brightness)
          //對比度改變    
          void contrastChanged(int contrast)
          //是否全屏狀態改變    
          void fullScreenChanged(bool fullScreen)
          //飽和度改變    
          void saturationChanged(int saturation)
          //色調改變    
          void hueChanged(int hue)    

          https://www.cnblogs.com/lxuechao/p/12677357.html

          攝像機

          QCameraInfo

          QCameraInfo 類提供有關相機設備的一般信息。

          QCameraInfo 允許您查詢系統上當前可用的相機設備。

          靜態函數 defaultCamera() 和 availableCameras() 為您提供所有可用相機的列表。

          此示例打印所有可用相機的名稱:

           const QList<QCameraInfo> cameras=QCameraInfo::availableCameras();
           for (const QCameraInfo &cameraInfo : cameras)
               qDebug() << cameraInfo.deviceName();

          一個QCameraInfo可以用來構造一個QCamera。 下面的例子實例化所有可用相機設備中第一個相機設備QCamera:

            const QList<QCameraInfo> cameras=QCameraInfo::availableCameras();
            camera=new QCamera(cameras.first());

          你也可以使用QCameraInfo來獲得一個相機設備的一般信息,例如描述,在系統上的物理位置,或相機傳感器的方向。

           QCamera myCamera;
            QCameraInfo cameraInfo(myCamera);
          ?
            if (cameraInfo.position()==QCamera::FrontFace)
                qDebug() << "攝像頭位于硬件系統的正面。";
            else if (cameraInfo.position()==QCamera::BackFace)
                qDebug() << "攝像頭位于硬件系統的背面。";
          ?
            qDebug() << "相機傳感器方向是 " << cameraInfo.orientation() << " 度.";

          QCamera

          QCamera類為系統攝像機設備提供接口。

          QCamera可以與QCameraViewfinder一起使用,用于取景器顯示,QMediaRecorder用于視頻錄制,QCameraImageCapture用于圖像拍攝。

          你可以使用QCameraInfo列出可用的相機并選擇使用哪一個。

          Public Functions

          • 設置捕獲模式
          QCamera::CaptureModes captureMode() const
          void setCaptureMode(QCamera::CaptureModes mode)
          • 設置取景器
          void setViewfinder(QVideoWidget *viewfinder)
          void setViewfinder(QGraphicsVideoItem *viewfinder)

          枚舉

          QCamera::CaptureMode

          捕獲模式

          枚舉

          描述

          QCamera::CaptureViewfinder

          取景器模式,只是簡單的顯示

          QCamera::CaptureStillImage

          幀捕獲模式,比如:拍照

          QCamera::CaptureVideo

          視頻捕獲模式,比如:錄制視頻

          者:Mino



          1.針對加載webView中的資源時加快加載的速度優化(主要是針對圖片)

          原因:html代碼下載到WebView后,webkit開始解析網頁各個節點,發現有外部樣式文件或者外部腳本文件時,會異步發起網絡請求下載文件,但如果在這之前也有解析到image節點,那勢必也會發起網絡請求下載相應的圖片。在網絡情況較差的情況下,過多的網絡請求就會造成帶寬緊張,影響到css或js文件加載完成的時間,造成頁面空白loading過久。

          解決方法:告訴WebView先不要自動加載圖片,等頁面finish后再發起圖片加載。

          //設置是否開啟密碼保存功能,不建議開啟,默認已經做了處理,存在盜取密碼的危險
          WebView.setSavePassword(false);


          2.WebView硬件加速導致頁面渲染閃爍

          原因:4.0以上的系統我們開啟硬件加速后,WebView渲染頁面更加快速,拖動也更加順滑。但有個副作用就是,當WebView視圖被整體遮住一塊,然后突然恢復時(比如使用SlideMenu將WebView從側邊滑出來時),這個過渡期會出現白塊同時界面閃爍。

          解決方法:是在過渡期前將WebView的硬件加速臨時關閉,過渡期后再開啟。

          /**
           * 請求網絡出現error
           * @param view                              view
           * @param errorCode                         錯誤
           * @param description                       description
           * @param failingUrl                        失敗鏈接
           */
          @Override
          public void onReceivedError(WebView view, int errorCode, String description, String
                  failingUrl) {
              super.onReceivedError(view, errorCode, description, failingUrl);
              if (errorCode==404) {
                  //用javascript隱藏系統定義的404頁面信息
                  String data="Page NO FOUND!";
                  view.loadUrl("javascript:document.body.innerHTML=\"" + data + "\"");
              } else {
                  if (webListener!=null){
                      webListener.showErrorView();
                  }
              }
          }
          
          // 向主機應用程序報告Web資源加載錯誤。這些錯誤通常表明無法連接到服務器。
          // 值得注意的是,不同的是過時的版本的回調,新的版本將被稱為任何資源(iframe,圖像等)
          // 不僅為主頁。因此,建議在回調過程中執行最低要求的工作。
          // 6.0 之后
          @Override
          public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
              super.onReceivedError(view, request, error);
              if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.M) {
                  X5WebUtils.log("服務器異常"+error.getDescription().toString());
              }
              //ToastUtils.showToast("服務器異常6.0之后");
              //當加載錯誤時,就讓它加載本地錯誤網頁文件
              //mWebView.loadUrl("file:///android_asset/errorpage/error.html");
              if (webListener!=null){
                  webListener.showErrorView();
              }
          }
          
          /**
           * 這個方法主要是監聽標題變化操作的
           * @param view  view
           * @param title 標題
           */
          @Override
          public void onReceivedTitle(WebView view, String title) {
              super.onReceivedTitle(view, title);
              if (title.contains("404") || title.contains("網頁無法打開")){
                  if (webListener!=null){
                      webListener.showErrorView();
                  }
              } else {
                  // 設置title
              }
          }


          3.可以提前顯示加載進度條

          原因:WebView.loadUrl("url") 不會立馬就回調 onPageStarted 或者 onProgressChanged 因為在這一時間段,WebView 有可能在初始化內核,也有可能在與服務器建立連接,這個時間段容易出現白屏,白屏用戶體驗是很糟糕的。

          解決方法:提前顯示進度條雖然不是提升性能 , 但是對用戶體驗來說也是很重要的一點。

          /**
           * 在加載資源時通知主機應用程序發生SSL錯誤
           * 作用:處理https請求
           * @param view   view
           * @param handler  handler
           * @param error   error
           */
          @Override
          public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
              super.onReceivedSslError(view, handler, error);
              if (error!=null){
                  String url=error.getUrl();
              }
              //https忽略證書問題
              if (handler!=null){
                  //表示等待證書響應
                  handler.proceed();
                  // handler.cancel();      //表示掛起連接,為默認方式
                  // handler.handleMessage(null);    //可做其他處理
              }
          }


          4.WebView密碼明文存儲漏洞優化

          原因:WebView 默認開啟密碼保存功能 mWebView.setSavePassword(true),如果該功能未關閉,在用戶輸入密碼時,會彈出提示框,詢問用戶是否保存密碼,如果選擇”是”,密碼會被明文保到 /data/data/com.package.name/databases/webview.db 中,這樣就有被盜取密碼的危險。

          解決方法:通過 WebSettings.setSavePassword(false) 關閉密碼保存提醒功能。

          @Override
          protected void onDestroy() {
              try {
                  //有音頻播放的web頁面的銷毀邏輯
                  //在關閉了Activity時,如果Webview的音樂或視頻,還在播放。就必須銷毀Webview
                  //但是注意:webview調用destory時,webview仍綁定在Activity上
                  //這是由于自定義webview構建時傳入了該Activity的context對象
                  //因此需要先從父容器中移除webview,然后再銷毀webview:
                  if (webView !=null) {
                      ViewGroup parent=(ViewGroup) webView.getParent();
                      if (parent !=null) {
                          parent.removeView(webView);
                      }
                      webView.removeAllViews();
                      webView.destroy();
                      webView=null;
                  }
              } catch (Exception e) {
          
              }
              super.onDestroy();
          }


          5.自定義加載異常error的狀態頁面,比如下面這些方法中可能會出現error

          原因:當WebView加載頁面出錯時(一般為404 NOT FOUND,Android WebView會默認顯示一個出錯界面。當WebView加載出錯時,會在WebViewClient實例中的onReceivedError(),還有onReceivedTitle方法接收到錯誤。

          解決方法:自定義錯誤頁面樣式。

          @Override
          public void onPageStarted(WebView view, String url, Bitmap favicon) {
              super.onPageStarted(view, url, favicon);
              String host=Uri.parse(url).getHost();
              if (!BuildConfig.IS_DEBUG) {
                  if (Arrays.binarySearch(domainList, host) < 0) {
                      //不在白名單內,非法網址,這個時候給用戶強烈而明顯的提示
                  } else {
                      //合法網址
                  }
              }
          }


          6. WebView加載證書錯誤

          原因:webView加載一些別人的url時候,有時候會發生證書認證錯誤的情況。

          解決方法:要將正常的呈現頁面給用戶,我們需要忽略證書錯誤,需要調用WebViewClient類的onReceivedSslError方法,調用handler.proceed()來忽略該證書錯誤。

           //在onResume里面設置setJavaScriptEnabled(true)。
              @Override
              protected void onResume() {
                  super.onResume();
                  if (mWebView !=null) {
                  mWebView.getSettings().setJavaScriptEnabled(true);
                  }
              }
          //在onStop里面設置setJavaScriptEnabled(false);
              @Override
              protected void onStop() {
                  super.onStop();
                  if (mWebView !=null) {
                  mWebView.getSettings().setJavaScriptEnabled(false)
                 }
            }


          7.WebView音頻播放銷毀后還有聲音

          原因:WebView頁面中播放了音頻,退出Activity后音頻仍然在播放。

          解決方法:需要在Activity的onDestory()中從父容器中移除WebView。

          @Override
          protected void onDestroy() {
              try {
                  //有音頻播放的web頁面的銷毀邏輯
                  //在關閉了Activity時,如果Webview的音樂或視頻,還在播放。就必須銷毀Webview
                  //但是注意:webview調用destory時,webview仍綁定在Activity上
                  //這是由于自定義webview構建時傳入了該Activity的context對象
                  //因此需要先從父容器中移除webview,然后再銷毀webview:
                  if (webView !=null) {
                      ViewGroup parent=(ViewGroup) webView.getParent();
                      if (parent !=null) {
                          parent.removeView(webView);
                      }
                      webView.removeAllViews();
                      webView.destroy();
                      webView=null;
                  }
              } catch (Exception e) {
          
              }
              super.onDestroy();
          }


          8.如何設置白名單操作

          原因:客戶端內的WebView都是可以通過客戶端的某個schema打開的,而要打開頁面的URL很多都并不寫在客戶端內,而是可以由URL中的參數傳遞過去的。上面4.0.5 使用scheme協議打開鏈接風險已經說明了scheme使用的危險性。

          解決方法:設置運行訪問的白名單,或者當用戶打開外部鏈接前給用戶強烈而明顯的提示。設置白名單操作其實和過濾廣告是一個意思,這里你可以放一些合法的網址允許訪問。

          @Override
          public void onPageStarted(WebView view, String url, Bitmap favicon) {
              super.onPageStarted(view, url, favicon);
              String host=Uri.parse(url).getHost();
              if (!BuildConfig.IS_DEBUG) {
                  if (Arrays.binarySearch(domainList, host) < 0) {
                      //不在白名單內,非法網址,這個時候給用戶強烈而明顯的提示
                  } else {
                      //合法網址
                  }
              }
          }


          9.Android后臺無法釋放js導致發熱耗電

          原因:有些手機你如果webView加載的html里,有一些js一直在執行比如動畫之類的東西,如果此刻webView 掛在了后臺這些資源是不會被釋放用戶也無法感知。導致一直占有cpu 耗電特別快。

          解決方法:WebView在后臺的時候,會調用onStop方法,即此時關閉js交互,回到前臺調用onResume再開啟js交互。

           //在onResume里面設置setJavaScriptEnabled(true)。
              @Override
              protected void onResume() {
                  super.onResume();
                  if (mWebView !=null) {
                  mWebView.getSettings().setJavaScriptEnabled(true);
                  }
              }
          //在onStop里面設置setJavaScriptEnabled(false);
              @Override
              protected void onStop() {
                  super.onStop();
                  if (mWebView !=null) {
                  mWebView.getSettings().setJavaScriptEnabled(false)
                 }
            }


          10.WebView加載網頁不顯示圖片

          原因:WebView從Lollipop(5.0)開始webView默認不允許混合模式, https當中不能加載http資源, 而開發的時候可能使用的是https的鏈接,但是鏈接中的圖片可能是http的,所以顯示圖片失敗。

          解決方案:需要設置開啟。


          主站蜘蛛池模板: 亚洲一区精品无码| 亚洲一区二区三区免费在线观看| 国产成人无码精品一区在线观看| 亚洲av成人一区二区三区在线观看 | 国产一区二区电影| 无码丰满熟妇浪潮一区二区AV| 亚洲日韩精品一区二区三区| 香蕉久久AⅤ一区二区三区| 中文字幕乱码亚洲精品一区| 国产高清一区二区三区| 国产伦精品一区二区三区| 久久无码一区二区三区少妇| 国产成人AV区一区二区三| 女人18毛片a级毛片一区二区| 精品深夜AV无码一区二区老年| 精品无码一区在线观看| 2021国产精品一区二区在线| 免费无码毛片一区二区APP| 日本一区二区免费看| 久久久精品人妻一区亚美研究所| 国产免费一区二区三区不卡| 亚洲国产精品一区二区第四页| 精品人妻少妇一区二区三区| 国精品无码A区一区二区| 成人国产一区二区三区| 中文人妻无码一区二区三区| 久久久久人妻精品一区蜜桃| 久久久综合亚洲色一区二区三区| 精品日韩亚洲AV无码一区二区三区| 日本一区二区在线播放| 亚洲AV日韩综合一区| 欧洲精品码一区二区三区免费看| 国产一区风间由美在线观看| 亚洲第一区在线观看| 国产免费一区二区三区在线观看| 麻豆AV一区二区三区久久| 亚洲无码一区二区三区| 国产一区二区三区无码免费| 波多野结衣一区二区三区aV高清| 亚洲成AV人片一区二区密柚| 亚洲AV无码一区二区三区牛牛|