景
如上圖,互聯網企業的國內業務肯定部署在國內,出海業務則一般部署在海外;具體部署區域,則一般根據用戶所在區域,選擇就近的區域。
源站部署到不同區域,選擇不同的機房,對于各地用戶來說,會帶來網絡距離及網絡線路質量的差異,從而對用戶的訪問響應時間也會產生一定差異。
網絡距離長及網絡線路質量差,則會給用戶帶來比較差的體驗,具體情況概括如下:
那么,下文介紹的就是我們常見的網絡加速方法。
ps:因為是要介紹的技術是通用技術,各家公有云都有自己的產品,所以在下文的介紹中,我為了避免重復的畫圖及描述,引用了各家公有云的文檔,在下文中有對應標示。
靜態加速
靜態加速,我們聽過最多的就是CDN,而且一般用的是CDN的靜態文件緩存加速功能。
CDN加速的核心就是就近訪問緩存:
CDN的加速原理(引用阿里云官網文檔):
阿里云CDN產品架構圖,其他公有云產品架構圖差不多。
節點分布(引用華為云官網文檔)
cdn加速類型(引用華為云官網文檔)
大文件下載加速
點播加速
web1.0時代,網站大部分是靜態內容,所以最開始的靜態加速就能滿足需求;隨著web2.0及移動互聯網時代的到來,網站中的動態請求占比逐漸提升。
那如果動態內容請求慢,是否有加速的辦法了?答案是有的,那就是動態加速。
如下圖,因為動態內容如果加了緩存,那么用戶訪問到的就不是最新的內容;
所以動態請求一般不做緩存加速的方案,而是通過優化邊緣節點到源站的回源鏈路的方式來加速;
cdn靜態緩存加速的邊緣節點一般是通過公網線路回源到源站;
動態加速網絡會把動態加速網絡中的所有邊緣節點互聯成一個私有網絡;
動態加速就是用戶就近訪問到邊緣節點后,通過這個私有網絡,智能選擇一條最優質量的線路回源,保證回源過程不會受到公網網絡的不確定因素的影響的方式來進行動態請求的加速;同時這個私有網絡也會進行一些長鏈接等協議優化的方式來加速。
ps:
全站加速,其實就是同時具備靜態加速和動態加速的能力。
CDN初代產品具有的能力就是靜態加速,隨著升級支持動態加速的功能,就變成了全站加速。
不同的云廠商產品規劃不同,有些云廠商會把全站加速單獨拿出來作為一個產品,有些云廠商則把全站加速集成到了CDN產品中。
全站加速的過程如下圖:
ps:不同云廠商的動態加速計費方式和靜態加速計費方式可能不一樣,需要注意計費方式不同帶來的成本不同的問題。
圖片來自華為云:
全球加速核心和全站加速中的動態加速的原理類似,大概如下:
應用場景(圖片來自華為云):
作者 | 鄒永紅 高級SRE專家
來源-微信公眾號:微鯉技術團隊
出處:https://mp.weixin.qq.com/s/mRshh-NjlkvsYd5f7dDPoA
. 使用內容分發網絡 (CDN)
內容交付網絡是分布在不同地理位置的一組 Web 服務器,這些服務器根據最終用戶的位置向其提供 Web 內容。當您在單個服務器上托管網站時,所有用戶請求都將發送到同一硬件。因此,處理每個請求所需的時間會增加。最重要的是,當用戶物理上遠離服務器時,加載時間會增加。使用 CDN,用戶請求將重定向到最近的服務器。因此,內容可以更快地交付給用戶,網站可以更快地工作。這是一種相當昂貴但非常有效地優化加載時間的方法。
2.將您的網站移動到更好的主機
有三種可能的托管類型:
共享主機
虛擬專用服務器(VPS)托管
專用服務器
世界各地最常用的托管類型是共享托管。這是在短時間內以低廉的費用使您的網站上線的最便宜的方式。選擇快速Web主機以確保更好的優化至關重要。使用共享主機,您可以與也使用此服務器的其他站點共享 CPU、磁盤空間和 RAM。這就是共享主機不如VPS或專用服務器快的主要原因。
虛擬專用服務器和專用服務器要快得多。VPS使用多個服務器進行內容分發。擁有VPS,您可以與其他用戶共享服務器,并擁有自己的虛擬服務器部分,您的配置不會影響其他客戶端。如果您的網站具有平均流量,或者您的電子商務網站在某些時期具有流量高峰,則VPS將是您的最佳解決方案。
最昂貴的托管選項是使用專用服務器,該服務器可以是您自己的物理服務器。在這種情況下,您需要支付服務器租金并雇用系統管理員來維護它。
3.優化網站上圖像的大小
每個人都喜歡引人注目的圖像。在成功的電子商務網站的情況下,圖像是至關重要的一部分。產品頁面上的大量照片,圖像,圖形可以提高參與度。圖像使用的消極方面是它們通常是大文件,會減慢網站的速度。
在不影響圖像質量的情況下減小圖像大小的最佳方法是使用ImageOptim,JPEGmini或Kraken等工具壓縮圖像。該過程可能需要一些時間,但這是值得的。減小圖像大小的另一種方法是使用 HTML 響應式圖像<機密>和<大小>屬性,這些屬性根據用戶顯示屬性調整圖像大小。
4. 減少插件數量
插件是每個網站的通用組件。它們添加了第三方建議的特定功能。不幸的是,安裝的插件越多,運行它們所需的資源就越多。因此,網站運行速度較慢,并且還會出現安全問題。隨著時間的流逝,插件的數量會增長,而其中一些插件可能不再使用。我們建議您檢查已安裝的所有插件并刪除不必要的插件。首先,在您的頁面上運行性能測試,以找出哪些插件正在減慢您的網站速度。網站速度不僅取決于安裝插件的數量,還取決于它們的質量。盡量避免加載大量腳本和樣式或生成大量數據庫查詢的插件。最好的解決方案是只保留必要的,并確保它們保持最新。
5. 盡量減少 JavaScript 和 CSS 文件的數量
如果您的網站包含大量JavaScript和CSS文件,則當您的網站訪問者想要訪問特定文件時,會導致大量HTTP請求。這些請求由訪問者的瀏覽器單獨處理,并減慢網站工作速度。如果你減少JavaScript和CSS文件的數量,這無疑會加快你的網站速度。嘗試將所有JavaScript分組為一個,并對所有CSS文件進行分組。這將減少 HTTP 請求的總數。有很多工具可以快速縮小HTML,CSS和JavaScript文件。例如,您可以使用WillPeavy,Script Minifier或Grunt工具。
6. 使用網站緩存
如果有很多用戶一次訪問頁面,服務器工作緩慢,需要更多時間才能將網頁交付給每個用戶。緩存是將網站的當前版本存儲在主機上并顯示此版本直到網站更新的過程。這意味著網頁不會為每個用戶一遍又一遍地呈現。緩存的網頁不需要每次都發送數據庫請求。
網站緩存的方法取決于開發網站的平臺。例如,對于WordPress,您可以使用以下插件:W3 Total Cache或W3 Super Cache。如果您使用VPS或專用服務器,您還可以在常規設置下設置緩存。對于共享服務器,網站緩存通常不可用。
7. 實施 Gzip 壓縮
Gzip壓縮是減小文件大小的有效方法。它最大限度地減少了HTTP請求并減少了服務器響應時間。Gzip 在將文件發送到瀏覽器之前會壓縮文件。在用戶端,瀏覽器解壓縮文件并顯示內容。此方法可以處理您網站上的所有文件。您可以通過添加一些代碼行或通過名為gzip的實用程序在您的網站上啟用Gzip。
8. 內容管理系統中的數據庫優化
數據庫優化是提高性能的有效方法。如果您使用包含復雜插件的內容管理系統(CMS),則數據庫大小會增加,您的網站運行速度會變慢。例如,WordPress CMS存儲評論,博客文章和其他占用大量數據存儲的信息。每個CMS都需要自己的優化措施,并且還具有許多特定的插件。例如,對于WordPress,您可以考慮WP-Optimize。
9. 減少網頁字體的使用
網頁字體在網站設計中變得非常流行。不幸的是,使用Web字體會對頁面呈現的速度產生負面影響。Web 字體向外部資源添加額外的 HTTP 請求。以下措施將幫助您減少網頁字體流量的大小:
使用現代格式WOFF2用于現代瀏覽器;
僅包括網站上使用的字符集;
僅選擇所需的樣式
10. 檢測 404 錯誤
404 錯誤表示“找不到頁面”。當頁面的訪問內容不再存在時,托管將向瀏覽器或搜索引擎提供此消息。為了檢測和更正404錯誤,您可以使用錯誤檢測工具和插件。正如我們所提到的,其他插件可能會對您的網站速度產生負面影響,因此我們建議您通過外部工具運行資源以進行錯誤檢測。例如,Xenu的Link偵探,Google Webmaster Tools(GWT)和404 RedirectEd Plugin For WordPress。
檢測到所有 404 錯誤后,您需要評估它們生成的流量。如果這些死鏈接不再帶來任何訪問,因此永遠不會消耗您的服務器資源,那么您可以保持原樣。如果這些頁面仍然有一些流量,請考慮為外部鏈接設置重定向并修復內部鏈接的鏈接地址。
11. 減少重定向
網站重定向會創建額外的 HTTP 請求,從而對性能產生負面影響。我們建議將它們保持在最低限度或完全消除它們。首先,您應該通過運行站點掃描來識別頁面上的所有重定向。您可以使用尖叫青蛙快速識別重定向。然后,您必須檢查它們是否用于必要的目的,并僅保留關鍵目的。
想在網頁中實現實時音頻變聲效果該如何實現呢,之前遇到這種處理音視頻的需求,可能會想到需要借助C代碼實現。但是現在隨著瀏覽器性能的提升、web API的豐富,通過瀏覽器原生的API也可以操作音頻數據實現很多復雜的效果,為web音頻開發提供了更多的選擇。下面介紹幾種采用原生Web Audio API實現變聲效果的過程中嘗試的幾種方案,感興趣的同學一起來了解下吧。
說明:本文討論范圍為變聲場景中的變速變調方案,有其它兩種場景:變速不變調、變調不變速需求的同學請移步參考鏈接或其它方案
開始之前先簡單了解下Web Audio API,Web Audio API提供了一組在web上操作音頻的API,可以使開發者自選音頻數據來源,為音頻添加效果,使聲音可視化,為聲音添加空間效果等功能。音頻的輸入流可以理解為一組buffer,來源可以是讀取音頻文件產生到內存中的AudioBufferSourceNode,也可以是來自HTML中audio標簽的MediaElementAudioSourceNode,也可以是來自音頻流(例如麥克風)的MediaStreamAudioSourceNode。例如,采集自己設備上的麥克風聲音連接到揚聲器:
// 創建音頻上下文
const audioContext=new AudioContext();
// 獲取設備麥克風流
stream=await navigator.mediaDevices
.getUserMedia({ audio: true})
.catch(function (error) {
console.log(error);
});
// 創建來自麥克風的流的聲音源
const sourceNode=audioContext.createMediaStreamSource(stream);
// 將聲音連接的揚聲器
sourceNode.connect(audioContext.destination);
就可以對著麥克風說話聽到自己的聲音了。對上述來源數據流的處理被設計成一個個的節點(Node),具有模塊化路由的特點,需要添加什么樣的效果添加什么樣的node,例如一個最常見的操作是通過把輸入的采樣數據放大來達到擴音器的作用(GainNode),示例代碼:
// 創建音頻上下文
const audioContext=new AudioContext();
// 創建一個增益Node
const gainNode=audioCtx.createGain();
// 獲取設備麥克風流
stream=await navigator.mediaDevices
.getUserMedia({ audio: true})
.catch(function (error) {
console.log(error);
});
// 創建來自麥克風的流的聲音源
const sourceNode=audioContext.createMediaStreamSource(stream);
// 將聲音經過gainNode處理
sourceNode.connect(gainNode);
// 將聲音連接的揚聲器
gainNode.connect(audioContext.destination);
// 設置聲音增益,放大聲音
gainNode.gain.value=2.0;
以上只是連接了聲音放大的node,如果想要增加其它效果,可以繼續往上添加node連接connect,例如濾波器(BiquadFilterNode)、立體聲控制(StereoPannerNode)、對信號進行扭曲(WaveShaperNode)等等。這種模塊化設計提供了靈活的創建動態效果和復合音頻的方法,是不是有種變魔法的感覺,哪里修改點哪里(添加Node)非常方便。例如,以下展示了一個利用 AudioContext 創建四項濾波器節點(Biquad filter node)的例子:
var audioCtx=new (window.AudioContext || window.webkitAudioContext)();
// 創建多個不同作用功能的node節點
var analyser=audioCtx.createAnalyser();
var distortion=audioCtx.createWaveShaper();
var gainNode=audioCtx.createGain();
var biquadFilter=audioCtx.createBiquadFilter();
var convolver=audioCtx.createConvolver();
// 將所有節點連接在一起
source=audioCtx.createMediaStreamSource(stream);
source.connect(analyser);
analyser.connect(distortion);
distortion.connect(biquadFilter);
biquadFilter.connect(convolver);
convolver.connect(gainNode);
gainNode.connect(audioCtx.destination);
// 控制雙二階濾波器
biquadFilter.type="lowshelf";
biquadFilter.frequency.value=1000;
biquadFilter.gain.value=25;
可以看到為聲音流添加處理效果就像穿項鏈一樣,一個接一個,最后得到最終效果,實現效果可以參考官方樣例voice-change-o-matic。一個簡單而典型的 web audio 流程如下:
首先回顧一下聲音的基礎知識,聲音是由物體振動產生的機械波,常接觸到的有以下三個特性:
這里說的變聲效果是改變聲音的音調,變聲效果根據不同的場景可以分為變速不變調、變調不變速以及變調又變速 3 種。變速是指把一個語音在時域上拉長或縮短,而聲音的采樣率、基頻以及共振峰都沒有發生變化。變調是指把語音的基因頻率降低或升高,共振峰做出相應的改變,采樣頻率不變。各種方案應用場景如下:
前兩種實現都要求對聲音知識領域有更深的了解,聲音時域、頻域,信號的傅里葉變換變化都要去重新去復習一下,學習成本比較高,這里使用第3種方式,比較好接入。要改變聲音的播放速率,Web Audio API中提供了AudioBufferSourceNode有playbackRate屬性,可以設置音頻的播放速率,使用音頻上下文AudioContext.createBufferSource獲得實例,示例代碼如下:
const play=()=> {
const audioSrc=ref("src/assets/sample_orig.mp3")
const url=audioSrc.value
const request=new XMLHttpRequest()
request.open('GET', url, true)
request.responseType='arraybuffer'
request.onload=function() {
const audioData=request.response
const audioCtx=new (window.AudioContext || window.webkitAudioContext)();
audioCtx.decodeAudioData(audioData, (audioBuffer)=> {
let source=audioCtx.createBufferSource();
source.buffer=audioBuffer;
// 改變聲音播放速率,2倍播放
source.playbackRate.value=2;
source.connect(audioCtx.destination);
source.start(0);
});
}
request.send()
}
可以調整source.playbackRate.value的值來改變音調,大于1提高音調,小于1降低音調。
雖然實現了變聲效果,但是這種方式只適合播放音頻文件,或者能獲取到完整音頻流的情況,對于獲取麥克風這種持續輸入的聲音流并不適用,類似的還有SoundTouchJS,它是某大佬實現的SoundTouch的JS版本,使用也是要獲取完整音頻的數據流,作者也做了相應的解釋,參考鏈接
如何處理麥克風獲取的實時音頻流呢,這里可以借助Web Audio API中的ScriptProcessorNode,它允許使用 JavaScript 生成、處理、分析音頻。處理流程圖如下:
利用它將實時音頻流數據處理一下,得到慢放或加速的聲音流數據。示例代碼如下:
const audioprocess=async ()=> {
const audioContext=new AudioContext();
// 采集麥克風輸入聲音流
let stream=await navigator.mediaDevices
.getUserMedia({ audio: true})
.catch(function (error) {
console.log(error);
});
const sourceNode=audioContext.createMediaStreamSource(stream);
const processor=audioContext.createScriptProcessor(4096, 1, 1);
processor.onaudioprocess=async event=> {
// 處理回調中拿到輸入聲音數據
const inputBuffer=event.inputBuffer;
// 創建新的輸出源
const outputSource=audioContext.createMediaStreamDestination();
const audioBuffer=audioContext.createBufferSource();
audioBuffer.buffer=inputBuffer;
// 設置聲音加粗,慢放0.7倍
audioBuffer.playbackRate.value=0.7
audioBuffer.connect(outputSource);
audioBuffer.start();
// 返回新的 MediaStream
const newStream=outputSource.stream;
const node=audioContext.createMediaStreamSource(newStream)
// 連接到揚聲器播放
node.connect(audioContext.destination)
};
// 添加處理節點
sourceNode.connect(processor);
processor.connect(audioContext.destination)
}
另外,還有一個利用Google開源jungle實現的改變音調的庫,并且還有各種混響效果,音頻可視化等炫酷功能,也是使用的Web Audio API實現,github鏈接地址放在這里了,有興趣也可以體驗下,畫面長這樣
以上就是對Web Audio API的簡單介紹和使用的分析,以及采用Web Audio API實現聲音簡單變聲效果的幾種實現,大家有哪些更好的實現方案歡迎評論區一起交流!
https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API
https://github.com/cwilso/Audio-Input-Effects
https://mdn.github.io/voice-change-o-matic/
https://github.com/cutterbl/SoundTouchJS
https://cloud.tencent.com/developer/news/818606
https://zhuanlan.zhihu.com/p/110278983
https://www.nxrte.com/jishu/3146.html
作者:付曉方
來源:微信公眾號:奇舞精選
出處:https://mp.weixin.qq.com/s/MuBqhyDUWbqU9p8e9LhdlQ
*請認真填寫需求信息,我們會在24小時內與您取得聯系。