diff --git a/trunk/research/golang/fwriter.go b/trunk/research/golang/fwriter.go new file mode 100644 index 000000000..53572bb41 --- /dev/null +++ b/trunk/research/golang/fwriter.go @@ -0,0 +1,30 @@ +package main + +import ( + "fmt" + "os" + "io" + "net/http" +) + +func main() { + fmt.Println("FileWriter web server, post to /api/v1/flv to temp.flv") + http.HandleFunc("/api/v1/flv", func(w http.ResponseWriter, r *http.Request){ + defer r.Body.Close() + + var f *os.File + var err error + if f,err = os.OpenFile("temp.flv", os.O_RDWR|os.O_APPEND|os.O_CREATE, os.ModePerm); err != nil { + return + } + + var written int64 + written,err = io.Copy(f, r.Body) + fmt.Println(fmt.Sprintf("write to file temp.flv, %v bytes", written)) + + if err != nil { + return + } + }) + _ = http.ListenAndServe(fmt.Sprintf(":8088"), nil) +} \ No newline at end of file diff --git a/trunk/research/players/srs_player.html b/trunk/research/players/srs_player.html index ef567d23e..7e07c6732 100755 --- a/trunk/research/players/srs_player.html +++ b/trunk/research/players/srs_player.html @@ -564,7 +564,7 @@ $("#main_modal").on("hide", function(){ if (srs_player) { // report the log to backend. - console.log(srs_player.dump_log()); + //console.log(srs_player.dump_log()); srs_player.stop(); srs_player = null; diff --git a/trunk/research/players/srs_player/src/Consts.as b/trunk/research/players/srs_player/src/Consts.as new file mode 100644 index 000000000..6b13690d8 --- /dev/null +++ b/trunk/research/players/srs_player/src/Consts.as @@ -0,0 +1,11 @@ +package +{ + public class Consts + { + // refresh every ts_fragment_seconds*M3u8RefreshRatio + public static var M3u8RefreshRatio:Number = 0.5; + + // parse ts every this ms. + public static var TsParseAsyncInterval:Number = 80; + } +} \ No newline at end of file diff --git a/trunk/research/players/srs_player/src/Hls.as b/trunk/research/players/srs_player/src/Hls.as index 4dba8d1ff..d89ad74d3 100755 --- a/trunk/research/players/srs_player/src/Hls.as +++ b/trunk/research/players/srs_player/src/Hls.as @@ -155,7 +155,7 @@ package nb_parsed += each_parse; if (nb_parsed < ts_packets) { - flash.utils.setTimeout(aysncParse, 80); + flash.utils.setTimeout(aysncParse, Consts.TsParseAsyncInterval); return; } diff --git a/trunk/research/players/srs_player/src/M3u8Player.as b/trunk/research/players/srs_player/src/M3u8Player.as index db6d29386..d9f928bcf 100644 --- a/trunk/research/players/srs_player/src/M3u8Player.as +++ b/trunk/research/players/srs_player/src/M3u8Player.as @@ -16,7 +16,10 @@ package import flash.net.NetConnection; import flash.net.NetStream; import flash.net.NetStreamAppendBytesAction; + import flash.net.URLLoader; + import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; + import flash.net.URLRequestMethod; import flash.net.URLStream; import flash.net.URLVariables; import flash.system.Security; @@ -46,12 +49,8 @@ package private var hls:Hls = null; // parse m3u8 and ts // callback for hls. - private var shok:Boolean = false; public var flvHeader:ByteArray = null; public function onSequenceHeader():void { - if (shok) { - return; - } if (!media_stream) { setTimeout(onSequenceHeader, 1000); return; @@ -61,16 +60,30 @@ package s.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN); s.appendBytes(flvHeader); log("FLV: sps/pps " + flvHeader.length + " bytes"); - shok = true; + + writeFlv(flvHeader); } - public function onFlvBody(flv:ByteArray):void { + public function onFlvBody(uri:String, flv:ByteArray):void { if (!media_stream) { return; } var s:NetStream = media_stream; s.appendBytes(flv); - log("FLV: AV " + flv.length + " bytes"); + log("FLV: ts " + uri + " parsed to flv " + flv.length + " bytes"); + + writeFlv(flv); + } + private function writeFlv(data:ByteArray):void { + return; + + var r:URLRequest = new URLRequest("http://192.168.1.117:8088/api/v1/flv"); + r.method = URLRequestMethod.POST; + r.data = data; + + var pf:URLLoader = new URLLoader(); + pf.dataFormat = URLLoaderDataFormat.BINARY; + pf.load(r); } public function M3u8Player(o:srs_player) { @@ -178,7 +191,7 @@ package if (parsed_ts_seq_no >= hls.seq_no + hls.tsCount) { var to:Number = 1000; if (hls.tsCount > 0) { - to = hls.duration * 1000 / hls.tsCount * 0.5; + to = hls.duration * 1000 / hls.tsCount * Consts.M3u8RefreshRatio; } setTimeout(refresh_m3u8, to); log("m3u8 not changed, retry after " + to.toFixed(2) + "ms"); @@ -208,8 +221,6 @@ package download(uri, function(stream:ByteArray):void{ log("got ts seqno=" + parsed_ts_seq_no + ", " + stream.length + " bytes"); - // reset and start to parse this ts. - hls.reset(); var flv:FlvPiece = new FlvPiece(parsed_ts_seq_no); var body:ByteArray = new ByteArray(); @@ -217,7 +228,7 @@ package hls.parseBodyAsync(flv, stream, body, function():void{ body.position = 0; //log("ts parsed, seqno=" + parsed_ts_seq_no + ", flv=" + body.length + "B"); - onFlvBody(body); + onFlvBody(uri, body); parsed_ts_seq_no++; setTimeout(refresh_ts, 0);