《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、 等付费点播服务已经改变了消费者的期望。现在,消费者期望通过 IP 提供的视频体验能够与传统广播技术提供的视频体验媲美,甚至超过传统广播技术提供的体验。这对提供内容服务的公司来说是一个难题。要在视频质量方面满足期望,对复杂的视频供应链提出了重大要求,对企业而言,风险很高:消费者对视频质量下降的容忍度较低,而用户转而选择其他供应商的风险较高。获得客户(和内容)是一项昂贵的业务,因此,对于负责确保观众获得最佳视频体验的技术团队而言,保留率是需要优先考虑的因素。但是,如何衡量视频质量呢?衡量质量时的重要指标是什么?未能提供一致质量对业务有何影响?观众对视频质量的期望是如何演变的?这些期望对付费视频服
44、务的交付带来了哪些技术和商业挑战?本文介绍了当前与付费 OTT 视频服务在不断发展的美国市场中的视频质量问题有关的一些重要行业趋势和动态。Akamai 向访谈计划的所有参与者致谢,并欢迎客户和行业利益相关者提供进一步的讨论和意见。1 Recode(2018),“您可以在任何所需的屏幕上观看 Netflix 内容。”可从此处在线获取“您只有一到两次机会来引起某人的注意。如果未能做到,您会失去潜在的观众,因为还存在其他众多的娱乐机会可供消费者选择。”一家多渠道广播公司的战略与创新副总裁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 报告的指标。”一家大型广播公司的高级经理。“如果内容是由专业发行商制作的,则存在一种期望 就像 Netflix 带来的期望那样,视频以 10 到 15 Mbps 的速度
64、传输 无论在何处观看视频,它都应该具有高质量。”一家多渠道广播公司的战略与创新副总裁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。这展示了 使用了各种复杂的经验调查技术 观看不受重新缓冲中断的高保真视频流的观众为什么会投入更多情感参与故事情节,并花更长时间观看这些内容。此外,重新缓冲最少的高质量视频体验对品牌认知和观众推荐特定服务的倾向产生了积极影响。视频开始时间是另一个明显影响观众体验的领域。它反映了一个共同主题,即消费者正在寻求获得视频流的一致性,而不是优先考虑峰值质量。“我认为消费者在看到视频第一帧所需时间方面的期望有所改变,
84、而在实际图像方面的期望则没有改变。页面加载速度、视频开始所需的时间、广告(这三个领域的质量非常重要)而且它们都与第一帧相关。”一家大型电视网络的首席技术官。相比避免观众服务中断,其他 KPI(例如视频流期间比特率发生变化的次数)则被认为没有那么重要。要实现这一目标,需要对人员和技术进行投资(高管现在认为这些因素对于任何付费 OTT 服务至关重要)。Akamai 随后进行了进一步的研究,以了解在流媒体视频方面,什么才能称得上“良好”。它委托 Eurofins 测试了感知质量(PQ)(观众实际看到的视频保真度)如何受到一系列因素的影响,包括视频设备或播放器、查看的内容类型、编码配置文件以及用户通常
85、遇到的网络条件。结果表明,即使内容和网络条件相同,向不同设备交付高清图像所需的比特率也存在很大差异。总之,调查表明,需要了解设备之间的关系、视频吞吐量的一致性以及内容类型和网络条件,以便确保观众获得最佳的视频体验。2 Akamai(2017),“新研究:OTT 视频流体验质量与观众的忠诚度和服务提供商的成功直接相关,”可从此处在线获取“任何业务都要付出获取成本 流媒体也是如此。您有义务使这种体验尽可能清晰和顺畅”一家多渠道广播公司的战略与创新副总裁“我们看到的是,如果客户多次看到缓冲,则会出现客户参与度下降的情况。我们的目标是将此数据保持在 0.5%以下。当重新缓冲小于 0.5%时,客户将完成
86、 90%的播放会话。一旦重新缓冲达到 0.5-1%,则此数据开始 下降 80%。一旦重新缓冲达到 1%,您会看到完成率下降至 50%。”一家大型广播公司的高级经理。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 设置、可用带宽、网络流量或内容本身的时间和空间质量。“交付视频是一个复杂的过程,该过程可能包含许多漏洞和机会。”一家多渠道广播公司的战略与创新副总裁对于包含广告的 OTT 服务,将广告添加到视频流中(尤其是通过客户端广告插播的方式)也可能产生影响用户体验的视频重新启动问题。OTT 服务提供商必须快速响应整个视频交付生态系统中的各种问题。为此,他们应找到拥有资源、经验和能力来帮助他们提供稳定一致的视频体验的 技术合作伙伴。随着观众群体变得越来越复杂,内容分发商还应确保与技术型用户进行适当交流,尤其是在出现任何问题时。当客户深入关注视频质
106、量时,SVD 提供商必须通过博客文章和用户社区互动来确保他们是坦诚和善于沟通的。“我们实际上遇到过一个事件,当时,我们正在试验转码,而用户表示不满,因为这影响到了比特率。我们道歉并强调,这不是在试图降低质量或节省成本。我们有一位观众深谙技术,他与我们的工程人员进行了辩论。您别无选择,只能参与。”一家视频聚合商的首席执行官。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 美元。重新缓冲也会对订阅收入产生负面影响。从事付费视频服务的高管发现视频质量和用户保留率之间存在明显的联系。对于竞争激烈的市场中基于订阅的服务,提供一致的视频质量水平的能力不仅会对用户参与度产生明显影响,还会对企业的最终效益产生明显影响。现在,在提高视频质量方面进行投资的公司看到了切实的商业利益。损失的额外收入+85,800 美元损失的额外 广告展示次数+10,700,000损失的额外观看时间+496,417放弃的额外播放次数+3,700,000展示:针对重新缓冲对广播公司广告收入的影响进行建模来源:Akamai 使用 Media Analytics、Nielsen、eMarketer
127、的数据得出的估算值“质量和用户保留率之间是否存在关联?可以证明存在关联。根据客户的说法,我们最初开始时,客户流失的头号原因是视频质量和缓冲问题。现在此因素已改进了 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 电视机的观众而言,质量可能比价格更重要。“视频的交付流程比以往更加复杂,而观众期待获得电视般的质量。”一家多渠道广播公司的战略与创新副总裁“对于每月 150 美元的服务,缓冲显然是不可接受的。对于 9.99 美元的 OTT 服务,缓冲是一件令人讨厌的事,但人们更有可能接受它。”高级视频技术顾问“买得起高质量屏幕的用户可能对价格不敏感,但对质量非常敏感。”一家 SVOD 服务提供商的首席运营官“我们根据提供给观众的视频质量划分价位。我们涵盖了所有不同的市场 从新兴的 4K 到有限的带宽。”一家
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、艰难的时刻。一百万个客户同时按下播放 这就是麻烦的地方。”一家大型广播公司的高级经理 然而,虽然许多视频分发商了解一致性对业务模式的重要性,但他们仍然必须找到理由对基础设施进行投资。在加大对独家和原创内容的投资的压力下,还需要找到投资技术的理由,从而以尽可能高的质量交付内容。对于那些还要提供传统付费电视的公司,IP 交付的服务肯定会与线性广播端竞争资源,这可能会导致出现困难:“缺乏投资 的理由始终是:我们从数字端获得的盈利始终比不上线性电视直播。这只是因为,线性电视直播存在的时间更长。”一家多渠道广播公司的战略与创新副总裁“对于一个大型大学篮球锦标赛,我们在 22 个平台上进行直播,其中每个平
188、台都必须提供良好的体验,而且您必须创建软件集以满足所有的流媒体和统计数据需求。由于时间有限,您有两天的时间来直播所有球队的比赛。在这两天内,您应确保所有广告正确无误,流媒体情况正常,如果您没有做到这一点,您会损失大量收入。”一家多渠道广播公司的战略与创新副总裁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 的智能边缘平台涵盖了从企业到云端的一切,从而确保客户及其业务获得快速、智能且安全的体验。全球顶级品牌依靠 Akamai 敏捷的解
207、决方案扩展其多云架构的功能,从而实现竞争优势。Akamai 使决策、应用程序和体验更贴近用户,帮助用户远离攻击和威胁。Akamai 一系列的边缘安全、Web 和移动性能、企业访问和视频交付解决方案均可由优质客户服务、分析和全天候监控提供支持。如需了解全球顶级品牌信赖 Akamai 的原因,请访问 ,或者扫描下方二维码,关注我们的微信公众号。您可 访问 https:/ 查找全球联系信息。发布时间:2019 年 5 月。MTM 是一家专门面向媒体、科技和广告行业的国际调查和战略咨询公司。MTM 帮助世界各地的客户了解并应对数字化驱动的变革,为新的风险投资、业务发展以及组织变革和转型提供卓越的消费者
208、调查、行业分析、战略建议和支持。有关更多信息,请访问 “我们通常会进行原始 4K 质量的放映 这看起来绝对令人惊叹。我们的目标是向美国消费者提供这种质量的视频。”一家 SVOD 服务提供商的首席运营官“您如果了解消费模式以及观众与 OTT 品牌的关系,您就会发现观众的期望是无穷无尽。我最大的建议是,尽量聘用合适的人员并做出正确的投资。”一家多渠道广播公司的战略与创新副总裁“在未来 5-10 年后,所有交付都将通过 IP 进行。美国的每一家运营商都在努力进行全面转型,以便实现 100%基于 IP 的交付。”高级视频技术顾问但是,随着行业向 IP 过渡,提高 OTT 视频质量势在必行 传统广播技术
209、仍然占据了付费电视收入的主导地位,该技术可以大规模高效地提供高质量的视频体验。但是,行业高管们现在清楚地认识到,行业正在向 IP 交付的视频过渡。传统发行商正开始调整他们的思维模式以适应这一新的现实。高管承认,目前 IP 内容的视频体验并不完美,特别是对于直播体育赛事和高速动作内容而言(在这些内容中,刷新率是一个问题)。但他们相信,随着基础设施的改进,这类体验将变得更出色。事实上,他们认为,OTT 有这个潜力大规模交付视频,其质量甚至比当前的广播技术更高。在基础设施允许的情况下,OTT 服务可提取比编码广播更加纯净的图像。如果未能在提高视频质量方面进行投资,即一致性和峰值质量,将影响视频分发商从订阅用户和广告商那里创造收入的能力。此外,行业的发展方向(不仅仅在于消费者的需求)也表明了未来的机遇所在。扫码关注获取最新 CDN 前沿资讯