Http(s) Video Proxy and VPN services
Video content from providers such as Netflix, Hulu or even YouTube are not available everywhere. Furthermore, we may want anonymity when viewing the video. Together they provide some challenge to us today to get high quality video streaming services with the same level of privacy as say the Tor project.
In this document, we will review some options and talk about the designs of a streaming proxy.
First of all, we should be specific about the video content. Most providers only do an IP level check to determine whether they should restrict the viewing. This can easily be tricked by one of the following methods:
1) VPN – We can easily create an IP tunnel over the internet to the domain where we can access the video content. This poses little or no risk over the internet and the quality may be as good as local given the ubiquity of such a technique in workplace.
2) Proxying – We can hide our IP address from the machine that we want to view the video content and check the same on sites that offer to look up our ip address. By doing so, we trick the providers into thinking we are local to the country where the service may be unrestricted.
However both of these are not necessarily guaranteed to be a working option in most cases for reasons such as:
1) we may not be at liberty to use the workplace VPN service to watch internet content that is not related to workplace
2) even if we do hide our IP address, most Internet service providers may have issues with such strategy or there might be already be address translations that affect our viewing.
3) They may require buffering or caching and this does not work well for live video.
4) Even proxy caching strategies such as segment based are actually partially caching video content.
5) We may still see startup latency or be required to start/stop the content again and again.
6) And then the delay by the proxy aka proxy jitter affects continuous streaming
Let us now look at some strategies to overcome this.
There are really two problems to tackle:
First, media content broken into segments requires a segment-based proxy caching strategies. Some of these strategies reduce the startup latency as seen by the client. They attempt to fix it by giving higher priority to caching the beginning segments of media objects. The other type of these strategies aim to reduce operational efficiency of the proxy by improving the byte hit ratio. The highest byte hit ratio can be assumed to be achieved when the segmentation is delayed as late as possible and till some realtime information can be collected
None of the segmentation strategies can automatically ensure continuous streaming delivery to the client. Such a proxy has to fetch and relay the uncached segments whenever necessary and if there is a delay it results in proxy jitter, something that affects the client rightaway and is very annoying.
Reducing this proxy jitter is foremost priority. This is where different pre-fetching schemes are involved. One way is to keep the pre-fetching window and fill in the missing data.
The trouble is that improving byte hit ratio and reducing proxy jitter conflict with each other. Proxy jitter occurs if the prefetching of uncached segments is delayed. Aggressive prefetching on the other hand reduces proxy efficiency. Prefetched segments may even be thrown away. That is why there is a tendency to prefetch uncached segments as late as possible. Secondly, the improvement in byte hit ratio also conflicts with reducing the delayed startup ratio.
Chen,Wee and Zhang in their paper “designs of high quality streaming proxy systems” discuss an active prefetching technique that they use to solve proxy jitter. And they also improve the lazy segmentation scheme which addresses the conflicts between startup latency and byte hit ratio.
#codingexercise
GetAllNumberRangeProductCubeRootPowerFourteen) (Double [] A)
{
if (A == null) return 0;
Return A.AllNumberRangeProductCubeRootPowerFourteen();
}
#codingexercise
GetAllNumberRangeProductCubeRootPowerFourteen) (Double [] A)
{
if (A == null) return 0;
Return A.AllNumberRangeProductCubeRootPowerFourteen();
}
No comments:
Post a Comment