Contenu connexe
Similaire à 廖雪峰 Saa s ovp (20)
廖雪峰 Saa s ovp
- 6. OVP流程
定制播放器
上传 视频库 发布 观看
转码
- 8. iOS视频
HTTP Live Streaming
#EXTM3U #EXTM3U
#EXTINF:10, #EXT-X-STREAM-INF: BANDWIDTH=200000
0.ts low.m3u8
#EXTINF:10, #EXT-X-STREAM-INF: BANDWIDTH=500000
1.ts high.m3u8
#EXTINF:10,
2.ts
#EXTINF:10,
3.ts
#EXTINF:10,
4.ts
#EXT-X-ENDLIST
- 10. Flash视频播放问题
快速
RTMP
键帧定位: http pseudo streaming
小切片定位: http live streaming
- 14. 为什么不采用RTMP
快速 杂的私有协议
自适应带宽 RTMP服务器贵
快速启动 CDN加速贵
按需下载 不支持客户端缓存
- 15. 小切片优势
快速 HTTP协议
高性能免费Web服务器
自适应带宽
CDN加速
快速启动
客户端缓存
按需下载
- 17. 解决CDN问题
自建CDN成本高 使用商用CDN服务
CDN服务稳定性问题 多CDN备份+切换
RTMP加速成本高 使用HTTP
大文件加速容易中断 小切片加速
- 21. 播放器设计
<script src="http://ovp/bootstrap.js"></script>
<script>
createPlayer({"playerId":"12345", "videoId":"12300"});
</script>
GET /bootstrap.js
GET /bootstrap.swf
GET /player?id=12345
<player id="12345" url="/p-v1.2.swf">
<settings>
<bgColor>#000000</bgColor>
<autoPlay>false</autoPlay>
<logoOverlay>/company-logo.png</logoOverlay>
</settings>
<plugins>
<plugin id="ad">...</plugin>
<plugin id="subtitle">...</plugin>
</plugins>
</player>
- 22. API接口
传统视频平台 OVP视频平台
播放器 Web管理 播放器
Web管理 Web接口 API接口
后台系统 后台系统
- 23. API接口
Web管理 播放器 App 3rd-part
API接口
Transcode Livecast Storage
Messaging Monitor Database
- 26. API设计
√ HTTP JSON
简洁,高效
Web Services
杂,低效
- 27. Java接口设计
Spring 3.0 Servlet Container
ApiServlet
ApiServlet
Spring Container
ServletToBeanProxy ApiServlet
ApiFacade1
ApiFacade2
ApiFacade3
- 28. Java接口设计
@Component
class ApiServlet extends HttpServlet {
@Autowired ApiFacade[] facades;
Map<String, ApiInvocation> mapping = scan();
void service(HttpServletRequest req,HttpServletResponse resp) {
securityCheck(req.getHeader("Authorization"));
String method = fromUrl(req);
Object[] args = convertArgs(req);
Object result = mapping.get(method).invoke(args);
String jsonResult = dumpJson(result);
writeResult(resp, jsonResult);
}
}
- 29. Java接口设计
@Component
class VideoApiFacade
implements ApiFacade {
@ApiGetMethod GET /getVideo?videoId=12345
public Video getVideo( &type=flv
@ApiParam("videoId") String id, Authorization: OAuth2 XXXXX
@ApiParam("type") String type
) {
return findVideo(id); POST /updateVideo
} Authorization: OAuth2 XXXXX
@ApiPostMethod video=%7B%22id%22%3A12345%2C
public void updateVideo( %22title%22%3A%22ABC%22%2C
@ApiParam("video") Video video %22desc%22%3A%22description
) { %22%7D
doUpdate(video);
} video={"id":12345,"title":"A
} BC","desc":"description"}
- 31. 缓存策略
统一的缓存入口
@Component
class ApiServlet {
Object callApi(String method, Object... args) {
key = method + args[0];
field = left(args);
Object result = fromRedis(key, field);
if (result==null) {
result = invoke(method, args);
setRedis(key, field, result);
}
return result;
}
}
- 32. 缓存策略
@Component /getVideo?videoId=123&type=flv
class VideoApiFacade key: getVideo/123
implements ApiFacade { field: flv
@ApiGetMethod
public Video getVideo( /getVideo?videoId=123&type=ios
@ApiParam("videoId") String id, key: getVideo/123
@ApiParam("type") String type field: ios
) {
return find(videoId, type);
} "flv" value1
void clear(String videoId) {
deleteFromRedis( "getVideo/123" "ios" value2
"getVideo/" + videoId);
}
"mp4" value3
}
... ...
- 34. SDK接口
代码生成:Java SDK, C# SDK, Flash SDK
动态接口:Python SDK, Ruby SDK, PHP SDK
client = APIClient()
client.getVideo(videoId="123", type="ios")
def http_curl(url, **params): pass
class APIClient(object):
def __getattr__(self, attr):
return functools.partial(http_curl,
url="http://ovp/%s" % attr)
- 41. Python接口
def jsonrpc(method):
def _decorator(func):
@functools.wraps(func)
def _wrapper(*args, **kw):
args_info = getargsinfo(func)
realargs = convertargs(ctx.request, args_info)
ret = func(*realargs)
return json.dumps(ret)
return _wrapper
return _decorator