《Akamai:了解 OTT 中一致性的價值白皮書(11頁).pdf》由會員分享,可在線閱讀,更多相關《Akamai:了解 OTT 中一致性的價值白皮書(11頁).pdf(11頁珍藏版)》請在三個皮匠報告上搜索。
1、白皮書 /Ada SegmentTemplate timescale=1000000 duration=6000000 availabilityTimeOffset=5.979 initialtion=1551938403/init-stream$RepresentationID$.m4s media=1551938403/chunk-stream_t_$RepresentationID$-$Number%05d$.m4s start SegmentTemplate timescale=1000000 duration=6000000 availabilityTimeOffset=5.967
2、initialization=1551938403/init-stream$RepresentationID$.m4s media=1551938403/chunk-stream_t_$RepresentationID$-$Number%05d$.m4s start AdaptationSet contentType=audio segmentAlignment=true bitstreamSwitc /Ada Per AdaptationSet contentType=audio segmentAlignment=true bitstreamSwitc /Ada AdaptationSet2
3、019 年 5 月了解 OTT 視頻交付中一致性的價值白皮書log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPoll-Channel:=mak
4、e(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChan-nel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan
5、ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprin
6、tf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Han-dleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Cha
7、nnel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessa
8、ge struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case
9、 msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff
10、?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,ht
11、ml.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeo
12、ut:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);log.Fa-tal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;str-conv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:
13、=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:worker-Active=true;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:
14、workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.Handle-Func(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=str-conv.ParseInt(r.Form
15、Value(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control mes-sage issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Handle-Func(/status,func(w http.ResponseWriter,r*http.Reque
16、st)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/ht
17、tp;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=-st
18、atusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Reque
19、st)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Cont
20、rol message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);els
21、e fmt.Fprint(w,INACTIVE);return;case Quality.Insight.Innovation.20 Years at the Edge.1了解 OTT 視頻交付中一致性的價值執行摘要隨著視頻行業繼續從廣播技術過渡到通過 IP 交付,需要優先確保大規模交付高質量的視頻流,并且不會出現中斷。對于向消費者交付內容的所有公司而言,如果做不到這一點,他們的廣告和訂閱收入將受到明顯的影響。然而,OTT 服務提供商面臨著一項挑戰,即滿足觀眾日益增長的、在任何設備上獲得高質量視頻體驗的期望。研究證實,觀眾期望視頻能夠迅速啟動并順暢播放。重新緩沖會降低觀眾對內容的參與度,并導致
22、觀眾放棄流媒體,甚至放棄服務。然而,視頻交付供應鏈十分復雜,很難找到緩沖的根本原因。OTT 服務提供商必須確保與技術合作伙伴合作,幫助他們提供 穩定一致的視頻體驗。劣質視頻體驗會影響最終效益。Akamai 估計,對于一個領先的美國網絡而言,每次播放如果平均出現一次重新緩沖,可能會導致超過 80,000 美元的廣告收入損失。它還會導致訂閱用戶放棄服務。另一方面,一家 SVD 提供商通過提高視頻質量將客戶流失率降低了 90%。尋求提高視頻體驗質量的 OTT 服務正面臨著許多障礙,包括舊的交付基礎設施和直播流媒體的增長,以及需要為進一步的投資找到理由。但是,提高 OTT 視頻質量是勢在必行,不容商量
23、的事情。如果企業想要保留訂閱用戶和廣告商并增加收入,則必須提高 OTT 視頻質量。OTT 有這個潛力 大規模交付視頻,其質量甚至比當前的廣播技術更高。log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerComplete
24、Chan:=make(chan bool);statusPoll-Channel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChan-nel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-workerComplet
25、eChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.
26、FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Han-dleFunc(/status,func(w http.ResponseWriter,r*http.Re
27、quest)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net
28、/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=
29、-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Re
30、quest)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,C
31、ontrol message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);
32、else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);log.Fa-tal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;str-conv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=
33、make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:worker-Active=true;go doStuff(msg,workerCo
34、mpleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.Handle-Func(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.Pa
35、rseForm();count,err:=str-conv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control mes-sage issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Handle-Func(/s
36、tatus,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337
37、,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,stat
38、us-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/
39、admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(t
40、arget),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result
41、:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case Quality.Insight.Innovation.20 Years at the Edge.2了解 OTT 視頻交付中一致性的價值簡介:視頻質量問題 Akamai 是用于保護和交付數字體驗的智能邊緣平臺,其請求媒體和科技領域的調查和戰略咨詢公司 MTM 調查有關 IP 交付視頻流質量的行業觀點。行業高管認為衡量和交付高質量視頻流的挑戰是什么?視頻質量對他們的最終效益有何 影響?MTM 對話一系列高端視頻分發商的高管,以更好地了解
42、當前趨勢和動態,并探索他們對于視頻質量對商業成功的重要性的看法。電視行業向觀眾交付內容的方式正在經歷巨大轉變。傳統的廣播技術仍然主導著當前的交付基礎設施(和行業收入),但是,OTT 服務已在成功交付點播和直播線性內容,這加速了向 IP 交付的過渡。這種轉變正在影響新的和傳統的業務,包括付費電視平臺、內容品牌和傳統廣播公司。這種過渡存在一個關鍵驅動因素,即消費者對于他們在訪問想要查看的內容時所采用的方式、時間和地點以及他們接收的視頻流的質量所抱有的期望。根據 Netflix 自己的調查,觀眾現在在觀看 Netflix 內容時,大部分(70%)使用的是電視1,即便如此,Netflix 和 Hulu
43、 等付費點播服務已經改變了消費者的期望?,F在,消費者期望通過 IP 提供的視頻體驗能夠與傳統廣播技術提供的視頻體驗媲美,甚至超過傳統廣播技術提供的體驗。這對提供內容服務的公司來說是一個難題。要在視頻質量方面滿足期望,對復雜的視頻供應鏈提出了重大要求,對企業而言,風險很高:消費者對視頻質量下降的容忍度較低,而用戶轉而選擇其他供應商的風險較高。獲得客戶(和內容)是一項昂貴的業務,因此,對于負責確保觀眾獲得最佳視頻體驗的技術團隊而言,保留率是需要優先考慮的因素。但是,如何衡量視頻質量呢?衡量質量時的重要指標是什么?未能提供一致質量對業務有何影響?觀眾對視頻質量的期望是如何演變的?這些期望對付費視頻服
44、務的交付帶來了哪些技術和商業挑戰?本文介紹了當前與付費 OTT 視頻服務在不斷發展的美國市場中的視頻質量問題有關的一些重要行業趨勢和動態。Akamai 向訪談計劃的所有參與者致謝,并歡迎客戶和行業利益相關者提供進一步的討論和意見。1 Recode(2018),“您可以在任何所需的屏幕上觀看 Netflix 內容?!笨蓮拇颂幵诰€獲取“您只有一到兩次機會來引起某人的注意。如果未能做到,您會失去潛在的觀眾,因為還存在其他眾多的娛樂機會可供消費者選擇?!币患叶嗲缽V播公司的戰略與創新副總裁log.Fatal(http.ListenAndServe(:1337,nil);package main;imp
45、ort(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPoll-Channel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for se
46、lect case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChan-nel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.Resp
47、onseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-ms
48、g;fmt.Fprintf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Han-dleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fm
49、t.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage
50、);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:
51、=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=st
52、rconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.Respon
53、seWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);log.Fa-tal(http.Lis
54、tenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;str-conv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(c
55、ontrolChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:worker-Active=true;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)
56、http.Handle-Func(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=str-conv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTar
57、get:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control mes-sage issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Handle-Func(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second)
58、;select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main
59、()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go do
60、Stuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.S
61、plit(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););
62、http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case Quality.Insight.Innovation.20 Years at the Edge.3了
63、解 OTT 視頻交付中一致性的價值如此,雖然提供高質量視頻體驗的重要性日益得到認可,但仍然難以對其進行定義或衡量。目前,沒有明確的行業標準來評估最終用戶體驗到的視頻流質量。但是,存在一個 KPI,它是從 UX 角度衡量質量的主要指標:緩沖(更具體地說,重新緩沖),即觀眾接收視頻流,但視頻隨后停止,視頻必須重新緩沖后面的內容?!爸匦戮彌_比 重新緩沖持續時間與播放視頻的實際持續 時間之比 是我們要衡量的指標,也是我們每月向 CEO 報告的指標?!币患掖笮蛷V播公司的高級經理?!叭绻麅热菔怯蓪I發行商制作的,則存在一種期望 就像 Netflix 帶來的期望那樣,視頻以 10 到 15 Mbps 的速度
64、傳輸 無論在何處觀看視頻,它都應該具有高質量?!币患叶嗲缽V播公司的戰略與創新副總裁OTT 服務提供商必須滿足日益增長的視頻質量期望在競爭日益激烈的市場中,付費視頻提供商正在尋求各種方法來使其 OTT 服務脫穎而出。他們的選擇包括投資內容、提供極具競爭力的定價、增強用戶體驗(UX)以及關注一致的流媒體質量。但是,對于最后一項的要求日益嚴格:盡管log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage st
65、ruct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPoll-Channel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:
66、=-controlChan-nel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They
67、probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control message issued for Target%s,count%d,html.Escap
68、eString(r.FormValue(target),count););http.Han-dleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt
69、.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan cha
70、n bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMe
71、ssage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err
72、.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-req
73、Chan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);log.Fa-tal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;str-c
74、onv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPoll
75、Channel:respChan-workerActive;case msg:=-controlChannel:worker-Active=true;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.Handle-Func(/admin,func(w http.ResponseWriter,r*http.Request)/*Do
76、es anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=str-conv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control mes-s
77、age issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Handle-Func(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.
78、Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(c
79、han bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:worker
80、Active=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(c
81、ount),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqC
82、han:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case Quality.Insight.Innovation.20 Years at the Edge.4了解 OTT 視頻交付中一致性的價值避免或盡量減少重新緩沖是大多數服務提供商的優先事項,他們認識到了重新緩沖事件與觀眾參與度之間的直接關系。觀
83、眾對重新緩沖的耐心很少,如果問題仍然存在,他們可能會放棄流媒體,甚至放棄服務。在 Sensum 為 Akamai 開展的 2017 年研究中,進一步證明了重新緩沖與觀眾參與度之間的這種關系2。這展示了 使用了各種復雜的經驗調查技術 觀看不受重新緩沖中斷的高保真視頻流的觀眾為什么會投入更多情感參與故事情節,并花更長時間觀看這些內容。此外,重新緩沖最少的高質量視頻體驗對品牌認知和觀眾推薦特定服務的傾向產生了積極影響。視頻開始時間是另一個明顯影響觀眾體驗的領域。它反映了一個共同主題,即消費者正在尋求獲得視頻流的一致性,而不是優先考慮峰值質量?!拔艺J為消費者在看到視頻第一幀所需時間方面的期望有所改變,
84、而在實際圖像方面的期望則沒有改變。頁面加載速度、視頻開始所需的時間、廣告(這三個領域的質量非常重要)而且它們都與第一幀相關?!币患掖笮碗娨暰W絡的首席技術官。相比避免觀眾服務中斷,其他 KPI(例如視頻流期間比特率發生變化的次數)則被認為沒有那么重要。要實現這一目標,需要對人員和技術進行投資(高管現在認為這些因素對于任何付費 OTT 服務至關重要)。Akamai 隨后進行了進一步的研究,以了解在流媒體視頻方面,什么才能稱得上“良好”。它委托 Eurofins 測試了感知質量(PQ)(觀眾實際看到的視頻保真度)如何受到一系列因素的影響,包括視頻設備或播放器、查看的內容類型、編碼配置文件以及用戶通常
85、遇到的網絡條件。結果表明,即使內容和網絡條件相同,向不同設備交付高清圖像所需的比特率也存在很大差異??傊?,調查表明,需要了解設備之間的關系、視頻吞吐量的一致性以及內容類型和網絡條件,以便確保觀眾獲得最佳的視頻體驗。2 Akamai(2017),“新研究:OTT 視頻流體驗質量與觀眾的忠誠度和服務提供商的成功直接相關,”可從此處在線獲取“任何業務都要付出獲取成本 流媒體也是如此。您有義務使這種體驗盡可能清晰和順暢”一家多渠道廣播公司的戰略與創新副總裁“我們看到的是,如果客戶多次看到緩沖,則會出現客戶參與度下降的情況。我們的目標是將此數據保持在 0.5%以下。當重新緩沖小于 0.5%時,客戶將完成
86、 90%的播放會話。一旦重新緩沖達到 0.5-1%,則此數據開始 下降 80%。一旦重新緩沖達到 1%,您會看到完成率下降至 50%?!币患掖笮蛷V播公司的高級經理。log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerC
87、ompleteChan:=make(chan bool);statusPoll-Channel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChan-nel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-worker
88、CompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.Pars
89、eInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Han-dleFunc(/status,func(w http.ResponseWriter,r*
90、http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;
91、log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case res
92、pChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*
93、http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-pri
94、ntf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,A
95、CTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);log.Fa-tal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;str-conv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlCh
96、annel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:worker-Active=true;go doStuff(msg,w
97、orkerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.Handle-Func(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,
98、:);r.ParseForm();count,err:=str-conv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control mes-sage issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Handle-
99、Func(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServ
100、e(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChann
101、el,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.Handl
102、eFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.Form
103、Value(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case
104、 result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case Quality.Insight.Innovation.20 Years at the Edge.5了解 OTT 視頻交付中一致性的價值“當您看電視時,您看不到電視節目和廣告之間的不協調,因此,我們下一步要做的是讓 OTT 更加自然。一家大型廣播公司的高級經理多個技術因素會影響視頻質量 盡管緩沖對用戶體驗的影響現在越來越為人所理解,但找出原因仍然是一個技術難題。問題的根源可能來自冗長而復雜的視頻供應鏈中的任何部分,包括
105、ISP、CDN、用戶的聯網設備和瀏覽器、他們的 Wi-Fi 設置、可用帶寬、網絡流量或內容本身的時間和空間質量?!敖桓兑曨l是一個復雜的過程,該過程可能包含許多漏洞和機會?!币患叶嗲缽V播公司的戰略與創新副總裁對于包含廣告的 OTT 服務,將廣告添加到視頻流中(尤其是通過客戶端廣告插播的方式)也可能產生影響用戶體驗的視頻重新啟動問題。OTT 服務提供商必須快速響應整個視頻交付生態系統中的各種問題。為此,他們應找到擁有資源、經驗和能力來幫助他們提供穩定一致的視頻體驗的 技術合作伙伴。隨著觀眾群體變得越來越復雜,內容分發商還應確保與技術型用戶進行適當交流,尤其是在出現任何問題時。當客戶深入關注視頻質
106、量時,SVD 提供商必須通過博客文章和用戶社區互動來確保他們是坦誠和善于溝通的?!拔覀儗嶋H上遇到過一個事件,當時,我們正在試驗轉碼,而用戶表示不滿,因為這影響到了比特率。我們道歉并強調,這不是在試圖降低質量或節省成本。我們有一位觀眾深諳技術,他與我們的工程人員進行了辯論。您別無選擇,只能參與?!币患乙曨l聚合商的首席執行官。log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target
107、 string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPoll-Channel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlCh
108、an-nel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably sh
109、ould.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control message issued for Target%s,count%d,html.EscapeString(r.F
110、ormValue(target),count););http.Han-dleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,T
111、IMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);wor
112、kerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statu
113、sPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();r
114、eturn;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeou
115、t:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);log.Fa-tal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;str-conv;strings
116、;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:res
117、pChan-workerActive;case msg:=-controlChannel:worker-Active=true;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.Handle-Func(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone a
118、ctually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=str-conv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control mes-sage issued
119、for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Handle-Func(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,IN
120、ACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);s
121、tatusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=stat
122、us;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64
123、);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(c
124、han bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case Quality.Insight.Innovation.20 Years at the Edge.6了解 OTT 視頻交付中一致性的價值視頻質量影響最終效益為了嘗試量化重新緩沖造成的業務影響,Akamai 對每增加一次重新緩沖所導致的廣告收入損失進行了建模。它研究
125、了一個領先的美國網絡的在線視頻流量,該網絡在 2017 年 6 月至 2018 年 6 月期間的播放次數達到 3.7 億?;?Media Analytics 工具捕獲的視頻 QoE 數據組成的大型存儲庫,Akamai 觀察到了重新緩沖事件和用戶放棄率之間的直接關系。假設(根據 Akamai 的數據)每次重新緩沖導致的放棄率為 1%,在平均播放時間剛剛超過 8 分鐘的情況下,單次重新緩沖將導致損失 496,417 小時,或相當于 1070 萬次廣告展示(假設每小時廣告時間為 11 分鐘,平均廣告時長為 30 秒)。假設 CPM(每英里成本)為 8 美元,則單次重新緩沖可能導致收入損失 85,5
126、00 美元。重新緩沖也會對訂閱收入產生負面影響。從事付費視頻服務的高管發現視頻質量和用戶保留率之間存在明顯的聯系。對于競爭激烈的市場中基于訂閱的服務,提供一致的視頻質量水平的能力不僅會對用戶參與度產生明顯影響,還會對企業的最終效益產生明顯影響?,F在,在提高視頻質量方面進行投資的公司看到了切實的商業利益。損失的額外收入+85,800 美元損失的額外 廣告展示次數+10,700,000損失的額外觀看時間+496,417放棄的額外播放次數+3,700,000展示:針對重新緩沖對廣播公司廣告收入的影響進行建模來源:Akamai 使用 Media Analytics、Nielsen、eMarketer
127、的數據得出的估算值“質量和用戶保留率之間是否存在關聯?可以證明存在關聯。根據客戶的說法,我們最初開始時,客戶流失的頭號原因是視頻質量和緩沖問題?,F在此因素已改進了 90%。隨著我們的改進,它從頭號問題變得無關緊要?!币患?SVOD 服務提供商的首席運營官在播放量達到 370,000,000 次(2017 年 6 月 15 日到 2018 年 6 月 15 日)的美國網絡上出現一次重新緩沖會對收入產生什么影響?每次播放的 平均重新緩沖次數+1 重新緩沖放棄率+1%log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;ht
128、ml;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPoll-Channel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case
129、respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChan-nel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter
130、,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fpri
131、ntf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Han-dleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w
132、,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCo
133、mpleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erC
134、ompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.Pars
135、eInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r
136、*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);log.Fa-tal(http.ListenAndServ
137、e(:1337,nil);package main;import(fmt;html;log;net/http;str-conv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChan
138、nel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:worker-Active=true;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.Handl
139、e-Func(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=str-conv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.Form
140、Value(target),Count:count;cc-msg;fmt.Fprintf(w,Control mes-sage issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Handle-Func(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select ca
141、se result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlC
142、hannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,
143、workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Hos
144、t,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Handl
145、eFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case Quality.Insight.Innovation.20 Years at the Edge.7了解 OTT 視頻交付
146、中一致性的價值了解觀眾的偏好及其對技術的態度對于有效利用 OTT 視頻服務盈利至關重要。觀眾在價格、靈活性、選擇和體驗之間作出權衡,而購買高價值付費電視服務的訂閱用戶對于質量問題的容忍度最低。對于更便宜(或免費)的服務或用戶生成的視頻,觀眾目前對于視頻質量比較寬容。但這種容忍度不可能長期維持??紤]到觀眾使用的不同設備和帶寬場景,向多個觀眾提供相同級別的質量仍然是一項挑戰。一家付費內容分發商的應對方法是:將客戶劃分為價格敏感型和質量敏感型類別。它提供不同版本的服務,在質量上有所不同。創建針對不同視頻質量級別提供不同價位的分層解決方案并非適合所有發行商。它會帶來運營復雜性,并且需要復雜的營銷策略。
147、但是,如果服務能夠識別足夠大的潛在價值訂閱用戶群體,則可以采用此方案。例如,對于那些投資重金購買 4K 電視機的觀眾而言,質量可能比價格更重要?!耙曨l的交付流程比以往更加復雜,而觀眾期待獲得電視般的質量?!币患叶嗲缽V播公司的戰略與創新副總裁“對于每月 150 美元的服務,緩沖顯然是不可接受的。對于 9.99 美元的 OTT 服務,緩沖是一件令人討厭的事,但人們更有可能接受它?!备呒壱曨l技術顧問“買得起高質量屏幕的用戶可能對價格不敏感,但對質量非常敏感?!币患?SVOD 服務提供商的首席運營官“我們根據提供給觀眾的視頻質量劃分價位。我們涵蓋了所有不同的市場 從新興的 4K 到有限的帶寬?!币患?/p>
148、 SVOD 服務提供商的首席運營官log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPoll-Channel:=make(chan chan b
149、ool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChan-nel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessag
150、e,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Erro
151、r();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Han-dleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;
152、timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Tar
153、get string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-contro
154、lChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probabl
155、y should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeStri
156、ng(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint
157、(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);log.Fa-tal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;str-conv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bo
158、ol);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:worker-Active=true;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=
159、status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.Handle-Func(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=str-conv.ParseInt(r.FormValue(count),
160、10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control mes-sage issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Handle-Func(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=m
161、ake(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;st
162、rings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=-statusPollChann
163、el:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does any
164、one ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message i
165、ssued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(
166、w,INACTIVE);return;case Quality.Insight.Innovation.20 Years at the Edge.8了解 OTT 視頻交付中一致性的價值主要挑戰包括交付基礎設施、向直播的轉型和投資 觀眾希望接收高質量視頻流(例如以 4K 形式提供的視頻流),并且分發商也愿意提供高質量視頻流。但是,高管發現存在一個巨大的障礙,使美國觀眾無法充分享受 IP 交付的視頻。由于當前的限制,導致能夠向亞洲用戶提供 4K 視頻的服務在美國無法實現。直播 OTT 視頻需求的增長為分發該內容并借此盈利的企業帶來了更多潛在挑戰。OTT 內容與點播觀看的關聯正在逐漸過時,這源于直播和
167、線性 IP 交付內容的興起(比如新聞和體育節目)。OTT 服務正越來越普遍地用于通過 IP 交付的高調直播活動??紤]到該內容及其相關廣告資源的價值,風險很高;順利實現預期目標的機會通常稍縱即逝。在這種情況下,服務提供商需要他們的技術合作伙伴在后臺提供高級支持,以確保最終用戶獲得最佳體驗?!白詈?,瓶頸在于交付基礎設施。在美國市場,平均互聯網速度一年增長不到 1%。我們擁有最老舊的光纖基礎設施。在亞洲,速度每年會翻倍。只有 30%的客戶擁有可充分享受 4K 質量的帶寬,這不是 CDN 的問題,而是交付基礎設施的問題?!币患?SVOD 服務提供商的首席運營官“這對我們的業務產生了影響,因為我們的電影
168、類型適合這種 4K 質量。但是,我們缺乏最后一英里的基礎設施來將這一圖像傳輸到消費者的屏幕上。更容易滿足非美國觀眾的需求 由于帶寬更高、更普遍,交付完全不成問題?!币患?SVOD 服務提供商的首席運營官log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan Cont
169、rolMessage);workerCompleteChan:=make(chan bool);statusPoll-Channel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChan-nel:workerActive=true;go doStuff(msg,workerCompleteChan);c
170、ase status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();coun
171、t,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.Han-dleFunc(/status,func(w htt
172、p.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package ma
173、in;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,status-PollChannel);
174、for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w htt
175、p.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:cou
176、nt;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if re
177、sult fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);log.Fa-tal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;str-conv;strings;time);type ControlMessage struct Target string;Count int64;f
178、unc main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:worker-Active=tr
179、ue;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.Handle-Func(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=st
180、rings.Split(r.Host,:);r.ParseForm();count,err:=str-conv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control mes-sage issued for Target%s,count%d,html.EscapeString(r.FormValue(target),co
181、unt););http.Handle-Func(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal
182、(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go
183、 admin(controlChannel,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan c
184、han bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlM
185、essageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.
186、Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case Quality.Insight.Innovation.20 Years at the Edge.9了解 OTT 視頻交付中一致性的價值將視頻交付擴展到大規模的直播觀眾仍然是這一挑戰的關鍵環節。對于劇集內容,觀看該流媒體的觀眾數量通??赡茌^少,但對于體育和新聞內容,觀眾數量開始增加,所有觀眾都期待獲得一致、高質量的體驗?!皩τ谛侣勈录?NHL 決賽,當每個人同時單擊開始時,這是一個
187、艱難的時刻。一百萬個客戶同時按下播放 這就是麻煩的地方?!币患掖笮蛷V播公司的高級經理 然而,雖然許多視頻分發商了解一致性對業務模式的重要性,但他們仍然必須找到理由對基礎設施進行投資。在加大對獨家和原創內容的投資的壓力下,還需要找到投資技術的理由,從而以盡可能高的質量交付內容。對于那些還要提供傳統付費電視的公司,IP 交付的服務肯定會與線性廣播端競爭資源,這可能會導致出現困難:“缺乏投資 的理由始終是:我們從數字端獲得的盈利始終比不上線性電視直播。這只是因為,線性電視直播存在的時間更長?!币患叶嗲缽V播公司的戰略與創新副總裁“對于一個大型大學籃球錦標賽,我們在 22 個平臺上進行直播,其中每個平
188、臺都必須提供良好的體驗,而且您必須創建軟件集以滿足所有的流媒體和統計數據需求。由于時間有限,您有兩天的時間來直播所有球隊的比賽。在這兩天內,您應確保所有廣告正確無誤,流媒體情況正常,如果您沒有做到這一點,您會損失大量收入?!币患叶嗲缽V播公司的戰略與創新副總裁log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()c
189、ontrolChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPoll-Channel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChan-nel:workerActive=true;go doSt
190、uff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They probably should.*/hostTokens:=strings.Split
191、(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.H
192、an-dleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenA
193、ndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(contro
194、lChannel,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http
195、.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Er-ror();return;msg:=ControlMessageTarget:
196、r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqChan;timeout:=time.After(time.Second);selec
197、t case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);log.Fa-tal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;str-conv;strings;time);type ControlMessage struc
198、t Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan bool);workerActive:=false;go admin(controlChannel,statusPollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-co
199、ntrolChannel:worker-Active=true;go doStuff(msg,workerCompleteChan);case status:=-workerCompleteChan:workerActive=status;func admin(cc chan ControlMessage,statusPollChannel chan chan bool)http.Handle-Func(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone actually read this stuff?They pro
200、bably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=str-conv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.Error();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.Fprintf(w,Control mes-sage issued for Target%s,count%d,html.Escape
201、String(r.FormValue(target),count););http.Handle-Func(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPoll-Channel-reqChan;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case-timeout:fmt.
202、Fprint(w,TIMEOUT););log.Fatal(http.ListenAndServe(:1337,nil);package main;import(fmt;html;log;net/http;strconv;strings;time);type ControlMessage struct Target string;Count int64;func main()controlChannel:=make(chan ControlMessage);workerCompleteChan:=make(chan bool);statusPollChannel:=make(chan chan
203、 bool);workerActive:=false;go admin(controlChannel,status-PollChannel);for select case respChan:=-statusPollChannel:respChan-workerActive;case msg:=-controlChannel:workerActive=true;go doStuff(msg,workerCompleteChan);case status:=-work-erCompleteChan:workerActive=status;func admin(cc chan ControlMes
204、sage,statusPollChannel chan chan bool)http.HandleFunc(/admin,func(w http.ResponseWriter,r*http.Request)/*Does anyone ac-tually read this stuff?They probably should.*/hostTokens:=strings.Split(r.Host,:);r.ParseForm();count,err:=strconv.ParseInt(r.FormValue(count),10,64);if err!=nil fmt.Fprintf(w,err.
205、Er-ror();return;msg:=ControlMessageTarget:r.FormValue(target),Count:count;cc-msg;fmt.F-printf(w,Control message issued for Target%s,count%d,html.EscapeString(r.FormValue(target),count););http.HandleFunc(/status,func(w http.ResponseWriter,r*http.Request)reqChan:=make(chan bool);statusPollChannel-reqC
206、han;timeout:=time.After(time.Second);select case result:=-reqChan:if result fmt.Fprint(w,ACTIVE);else fmt.Fprint(w,INACTIVE);return;case Quality.Insight.Innovation.20 Years at the Edge.了解 OTT 視頻交付中一致性的價值Akamai 為全球的大型企業提供安全的數字化體驗。Akamai 的智能邊緣平臺涵蓋了從企業到云端的一切,從而確??蛻艏捌錁I務獲得快速、智能且安全的體驗。全球頂級品牌依靠 Akamai 敏捷的解
207、決方案擴展其多云架構的功能,從而實現競爭優勢。Akamai 使決策、應用程序和體驗更貼近用戶,幫助用戶遠離攻擊和威脅。Akamai 一系列的邊緣安全、Web 和移動性能、企業訪問和視頻交付解決方案均可由優質客戶服務、分析和全天候監控提供支持。如需了解全球頂級品牌信賴 Akamai 的原因,請訪問 ,或者掃描下方二維碼,關注我們的微信公眾號。您可 訪問 https:/ 查找全球聯系信息。發布時間:2019 年 5 月。MTM 是一家專門面向媒體、科技和廣告行業的國際調查和戰略咨詢公司。MTM 幫助世界各地的客戶了解并應對數字化驅動的變革,為新的風險投資、業務發展以及組織變革和轉型提供卓越的消費者
208、調查、行業分析、戰略建議和支持。有關更多信息,請訪問 “我們通常會進行原始 4K 質量的放映 這看起來絕對令人驚嘆。我們的目標是向美國消費者提供這種質量的視頻?!币患?SVOD 服務提供商的首席運營官“您如果了解消費模式以及觀眾與 OTT 品牌的關系,您就會發現觀眾的期望是無窮無盡。我最大的建議是,盡量聘用合適的人員并做出正確的投資?!币患叶嗲缽V播公司的戰略與創新副總裁“在未來 5-10 年后,所有交付都將通過 IP 進行。美國的每一家運營商都在努力進行全面轉型,以便實現 100%基于 IP 的交付?!备呒壱曨l技術顧問但是,隨著行業向 IP 過渡,提高 OTT 視頻質量勢在必行 傳統廣播技術
209、仍然占據了付費電視收入的主導地位,該技術可以大規模高效地提供高質量的視頻體驗。但是,行業高管們現在清楚地認識到,行業正在向 IP 交付的視頻過渡。傳統發行商正開始調整他們的思維模式以適應這一新的現實。高管承認,目前 IP 內容的視頻體驗并不完美,特別是對于直播體育賽事和高速動作內容而言(在這些內容中,刷新率是一個問題)。但他們相信,隨著基礎設施的改進,這類體驗將變得更出色。事實上,他們認為,OTT 有這個潛力大規模交付視頻,其質量甚至比當前的廣播技術更高。在基礎設施允許的情況下,OTT 服務可提取比編碼廣播更加純凈的圖像。如果未能在提高視頻質量方面進行投資,即一致性和峰值質量,將影響視頻分發商從訂閱用戶和廣告商那里創造收入的能力。此外,行業的發展方向(不僅僅在于消費者的需求)也表明了未來的機遇所在。掃碼關注獲取最新 CDN 前沿資訊