Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
forked from lava-tech/hls-p2p

Flash OSMF based hybrid cdn&p2p hls solution

Notifications You must be signed in to change notification settings

forfunny/hls-p2p

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

23 Commits

Repository files navigation

hls-p2p

Flash OSMF based hybrid cdn&p2p hls solution. Currently it support LIVE hls. Flash support rtmfp protocal, we use that to deliver video&audio data in p2p&cdn hybrid way.

NOTE: Please take some time to READ this file.

how it works

We use https://github.com/denivip/osmf-hls-plugin to enable hls support. Use that as a base, we developed the p2p part.

Normally, for hls protocal, client download m3u8 first, then download ts; In our p2p solution, client download m3u8 from server first, then download ts and m3u8 from server or other peers.

We developed a algorithm for LIVE hls P2P.

The algorithm is like this:

  • for a single ts file, if we download it from peer, we download it from more than one peer
  • we establish a p2p topology at first.
  • data is pushed from one peer to others
  • if one peer exits, downstream will know that after a while, and will PING the exited peer, if PING fails, it will retry to establising a new topology. In the process of rebuilding the new topology, data will be downloaded from server.
  • peer is considered as stable if it can be added to other peer's topology.
  • m3u8 is small, it will be downloaded only from one peer.

Server part:

  • P2P need a server to support rtmfp. we use https://github.com/OpenRTMFP/Cumulus. Cumulus support lua, we can add peer id to redis using lua script.
  • we also use redis to store peer ids.
  • a nodejs http service for peer to find other peers' id.

Client part:

  • we implement a P2PLoader, which will replace the original HTTPStreamDownloader in osmf-hls-plugin

Install

  • our test server is CentOS 6.2, you can bash install/install_p2p.sh to install required server software.
  • The IDE we used to develope our flash code is 'FlashDevelop'

Run and test

Server:

  • start redis
  • copy "cumulus/main.lua" to "Cumulus/CumulusServer/www" folder and start CumulusServer. For how to set config for CumulusServer, refer to https://github.com/OpenRTMFP/Cumulus/wiki/Installation#configurations
  • copy "server/remote_log" to any folder, under remote_log, run npm install, then node index.js
  • you also need a media server to stream HLS(such as FMS, Wowza, or Lava Media Server 4(trochilus) if you interested). note: Lava Media Server 4 is not a open source project now.

Client:

  • Build the binary. Note: because we use osmf source code directly, you need to remove default osmf lib in you computer before building it.
  • Change config in bin/index.html
change the ip of your server in bin/index.html, such as "115.29.205.140"

some config value and their meanings are as follows:

# the url of LIVE hls stream, it MUST be live and single stream
# it should only contain ts file, and MUST NOT contain another m3u8 file
m3u8_url: "http://211.103.128.226:8080/live/tvie/xray/pad.m3u8",
# the rtmfp url
rtmfp_url: "rtmfp://115.29.205.140:19350/app",
# the url we will get peers information
http_tracker: "http://115.29.205.140:5000/get_peers",
# send log to that url
remote_log_base_url: "http://115.29.205.140:5000/remote_log",
# how many peers we will use to download data
rtmfp_url_peers: 2,
# leave it as it is
index_rtmfp_url: "",
# leave it as it is
index_rtmfp_url_peers: 1,
# the server ip and port from where we download m3u8 and ts.
# if you do not know how it works, set it as the same as `m3u8_url`
source_servers: ["211.103.128.226:8080"]
  • put bin/* under a web server(such as nginx).
  • visit bin/index.html in your browser

Data

In Cumulus, we will add peer informations to redis. You can get the peer informations in redis with following command

  • List all p2p instance.
127.0.0.1:6379 > SMEMBERS cumulus_app
  • For one p2p instance, get all connected peers' id. for example: if I want to get peers of a p2p instance called "app"
127.0.0.1:6379> LLEN app
(integer) 1
127.0.0.1:6379> LRANGE app 0 1
1) "c39e1de52e704279ecb6800bdb4c20006059d6b600b8abd08941a4119dc4250b"
  • For some debug reason, if you want to clear all peers of a p2p instance called "app", you can do
127.0.0.1:6379> LTRIM app 0 0

peer - server protocal

  • Flash client connect Cumulus using RTMFP protocal. Flash client will get a peerID(a unique id), and in main.lua, we save client peerID to redis.
  • Flash client send http request to remote_log service to find other peer ids, so that it can connect other peer.
  • If user close the index.html page, the page will send disconnect event to remote_log, remote_log will remove that peer's id from redis.(We need to do this because Flash in chrome will not send disconnect event to Cumulus server)

peers protocal

  • First, we need to create two way session between two peer, from each side it can send msg. We call it "Create Session"
  • We call one ts file as CHUNK. A CHUNK may contain more than one PIECE. We download one PIECE of CHUNK from different peer.
  • After we have connect ENOUGH peers, we send them HAS_CHUNK_REQ(ts_url) msg to query if we can download PIECE from them.
  • After enough peers send back us 'HAS_CHUNK_RESP(yes)', We send 'GET_PIECE_REQ(url, piece_id)' to qualified peers.
  • After we got some data of a CHUNK, we feed it to player.
  • If we do not get the CHUNK at required time, we will query if the peer still alive, if not, we call it "P2P Failed".
  • If we are in "P2P Failed", we will shift from "P2P mode" to "CDN mode".
  • If we are in "CDN mode", we will try to shift to "P2P mode" at intervals

About

Flash OSMF based hybrid cdn&p2p hls solution

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • ActionScript 99.6%
  • Other 0.4%

AltStyle によって変換されたページ (->オリジナル) /