diff --git a/trunk/research/players/srs_player/src/Hls.as b/trunk/research/players/srs_player/src/Hls.as index d89ad74d3..b7f225bdf 100755 --- a/trunk/research/players/srs_player/src/Hls.as +++ b/trunk/research/players/srs_player/src/Hls.as @@ -793,7 +793,7 @@ class SrsTsHanlder implements ISrsTsHandler packet.writeUnsignedInt(size); if (false) { - _log.info("mux flv type={0}, time={1}, size={3}", type, timestamp, dts, packet.length); + _log.info("FLV: mux flv type={0}, time={1}, size={3}", type, timestamp, dts, packet.length); } else { _log.debug("mux flv type={0}, time={1}, size={3}", type, timestamp, dts, packet.length); } diff --git a/trunk/research/players/srs_player/src/M3u8Player.as b/trunk/research/players/srs_player/src/M3u8Player.as index d9f928bcf..82d7c7c82 100644 --- a/trunk/research/players/srs_player/src/M3u8Player.as +++ b/trunk/research/players/srs_player/src/M3u8Player.as @@ -19,6 +19,7 @@ package import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; + import flash.net.URLRequestHeader; import flash.net.URLRequestMethod; import flash.net.URLStream; import flash.net.URLVariables; @@ -47,6 +48,26 @@ package private var owner:srs_player = null; private var hls:Hls = null; // parse m3u8 and ts + + // the uuid similar to Safari, to identify this play session. + // @see https://github.com/winlinvip/srs-plus/blob/bms/trunk/src/app/srs_app_http_stream.cpp#L45 + public var XPlaybackSessionId:String = createRandomIdentifier(32); + private function createRandomIdentifier(length:uint, radix:uint = 61):String { + var characters:Array = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', + 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', + 'z'); + var id:Array = new Array(); + radix = (radix > 61) ? 61 : radix; + while (length--) { + id.push(characters[randomIntegerWithinRange(0, radix)]); + } + return id.join(''); + } + private function randomIntegerWithinRange(min:int, max:int):int { + return Math.floor(Math.random() * (1 + max - min) + min); + } // callback for hls. public var flvHeader:ByteArray = null; @@ -68,6 +89,10 @@ package return; } + if (!flvHeader) { + return; + } + var s:NetStream = media_stream; s.appendBytes(flv); log("FLV: ts " + uri + " parsed to flv " + flv.length + " bytes"); @@ -265,8 +290,14 @@ package completed(stream); }); + // we set to the query. + uri += ((uri.indexOf("?") == -1)? "?":"&") + "shp_xpsid=" + XPlaybackSessionId; + var r:URLRequest = new URLRequest(uri); + // seems flash not allow set this header. + r.requestHeaders.push(new URLRequestHeader("X-Playback-Session-Id", XPlaybackSessionId)); + log("start download " + uri); - url.load(new URLRequest(uri)); + url.load(r); } private function log(msg:String):void {