winlin

refine srs player to play hls.

  1 +package main
  2 +
  3 +import (
  4 + "fmt"
  5 + "os"
  6 + "io"
  7 + "net/http"
  8 +)
  9 +
  10 +func main() {
  11 + fmt.Println("FileWriter web server, post to /api/v1/flv to temp.flv")
  12 + http.HandleFunc("/api/v1/flv", func(w http.ResponseWriter, r *http.Request){
  13 + defer r.Body.Close()
  14 +
  15 + var f *os.File
  16 + var err error
  17 + if f,err = os.OpenFile("temp.flv", os.O_RDWR|os.O_APPEND|os.O_CREATE, os.ModePerm); err != nil {
  18 + return
  19 + }
  20 +
  21 + var written int64
  22 + written,err = io.Copy(f, r.Body)
  23 + fmt.Println(fmt.Sprintf("write to file temp.flv, %v bytes", written))
  24 +
  25 + if err != nil {
  26 + return
  27 + }
  28 + })
  29 + _ = http.ListenAndServe(fmt.Sprintf(":8088"), nil)
  30 +}
@@ -564,7 +564,7 @@ @@ -564,7 +564,7 @@
564 $("#main_modal").on("hide", function(){ 564 $("#main_modal").on("hide", function(){
565 if (srs_player) { 565 if (srs_player) {
566 // report the log to backend. 566 // report the log to backend.
567 - console.log(srs_player.dump_log()); 567 + //console.log(srs_player.dump_log());
568 568
569 srs_player.stop(); 569 srs_player.stop();
570 srs_player = null; 570 srs_player = null;
  1 +package
  2 +{
  3 + public class Consts
  4 + {
  5 + // refresh every ts_fragment_seconds*M3u8RefreshRatio
  6 + public static var M3u8RefreshRatio:Number = 0.5;
  7 +
  8 + // parse ts every this ms.
  9 + public static var TsParseAsyncInterval:Number = 80;
  10 + }
  11 +}
@@ -155,7 +155,7 @@ package @@ -155,7 +155,7 @@ package
155 nb_parsed += each_parse; 155 nb_parsed += each_parse;
156 156
157 if (nb_parsed < ts_packets) { 157 if (nb_parsed < ts_packets) {
158 - flash.utils.setTimeout(aysncParse, 80); 158 + flash.utils.setTimeout(aysncParse, Consts.TsParseAsyncInterval);
159 return; 159 return;
160 } 160 }
161 161
@@ -16,7 +16,10 @@ package @@ -16,7 +16,10 @@ package
16 import flash.net.NetConnection; 16 import flash.net.NetConnection;
17 import flash.net.NetStream; 17 import flash.net.NetStream;
18 import flash.net.NetStreamAppendBytesAction; 18 import flash.net.NetStreamAppendBytesAction;
  19 + import flash.net.URLLoader;
  20 + import flash.net.URLLoaderDataFormat;
19 import flash.net.URLRequest; 21 import flash.net.URLRequest;
  22 + import flash.net.URLRequestMethod;
20 import flash.net.URLStream; 23 import flash.net.URLStream;
21 import flash.net.URLVariables; 24 import flash.net.URLVariables;
22 import flash.system.Security; 25 import flash.system.Security;
@@ -46,12 +49,8 @@ package @@ -46,12 +49,8 @@ package
46 private var hls:Hls = null; // parse m3u8 and ts 49 private var hls:Hls = null; // parse m3u8 and ts
47 50
48 // callback for hls. 51 // callback for hls.
49 - private var shok:Boolean = false;  
50 public var flvHeader:ByteArray = null; 52 public var flvHeader:ByteArray = null;
51 public function onSequenceHeader():void { 53 public function onSequenceHeader():void {
52 - if (shok) {  
53 - return;  
54 - }  
55 if (!media_stream) { 54 if (!media_stream) {
56 setTimeout(onSequenceHeader, 1000); 55 setTimeout(onSequenceHeader, 1000);
57 return; 56 return;
@@ -61,16 +60,30 @@ package @@ -61,16 +60,30 @@ package
61 s.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN); 60 s.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN);
62 s.appendBytes(flvHeader); 61 s.appendBytes(flvHeader);
63 log("FLV: sps/pps " + flvHeader.length + " bytes"); 62 log("FLV: sps/pps " + flvHeader.length + " bytes");
64 - shok = true; 63 +
  64 + writeFlv(flvHeader);
65 } 65 }
66 - public function onFlvBody(flv:ByteArray):void { 66 + public function onFlvBody(uri:String, flv:ByteArray):void {
67 if (!media_stream) { 67 if (!media_stream) {
68 return; 68 return;
69 } 69 }
70 70
71 var s:NetStream = media_stream; 71 var s:NetStream = media_stream;
72 s.appendBytes(flv); 72 s.appendBytes(flv);
73 - log("FLV: AV " + flv.length + " bytes"); 73 + log("FLV: ts " + uri + " parsed to flv " + flv.length + " bytes");
  74 +
  75 + writeFlv(flv);
  76 + }
  77 + private function writeFlv(data:ByteArray):void {
  78 + return;
  79 +
  80 + var r:URLRequest = new URLRequest("http://192.168.1.117:8088/api/v1/flv");
  81 + r.method = URLRequestMethod.POST;
  82 + r.data = data;
  83 +
  84 + var pf:URLLoader = new URLLoader();
  85 + pf.dataFormat = URLLoaderDataFormat.BINARY;
  86 + pf.load(r);
74 } 87 }
75 88
76 public function M3u8Player(o:srs_player) { 89 public function M3u8Player(o:srs_player) {
@@ -178,7 +191,7 @@ package @@ -178,7 +191,7 @@ package
178 if (parsed_ts_seq_no >= hls.seq_no + hls.tsCount) { 191 if (parsed_ts_seq_no >= hls.seq_no + hls.tsCount) {
179 var to:Number = 1000; 192 var to:Number = 1000;
180 if (hls.tsCount > 0) { 193 if (hls.tsCount > 0) {
181 - to = hls.duration * 1000 / hls.tsCount * 0.5; 194 + to = hls.duration * 1000 / hls.tsCount * Consts.M3u8RefreshRatio;
182 } 195 }
183 setTimeout(refresh_m3u8, to); 196 setTimeout(refresh_m3u8, to);
184 log("m3u8 not changed, retry after " + to.toFixed(2) + "ms"); 197 log("m3u8 not changed, retry after " + to.toFixed(2) + "ms");
@@ -208,8 +221,6 @@ package @@ -208,8 +221,6 @@ package
208 221
209 download(uri, function(stream:ByteArray):void{ 222 download(uri, function(stream:ByteArray):void{
210 log("got ts seqno=" + parsed_ts_seq_no + ", " + stream.length + " bytes"); 223 log("got ts seqno=" + parsed_ts_seq_no + ", " + stream.length + " bytes");
211 - // reset and start to parse this ts.  
212 - hls.reset();  
213 224
214 var flv:FlvPiece = new FlvPiece(parsed_ts_seq_no); 225 var flv:FlvPiece = new FlvPiece(parsed_ts_seq_no);
215 var body:ByteArray = new ByteArray(); 226 var body:ByteArray = new ByteArray();
@@ -217,7 +228,7 @@ package @@ -217,7 +228,7 @@ package
217 hls.parseBodyAsync(flv, stream, body, function():void{ 228 hls.parseBodyAsync(flv, stream, body, function():void{
218 body.position = 0; 229 body.position = 0;
219 //log("ts parsed, seqno=" + parsed_ts_seq_no + ", flv=" + body.length + "B"); 230 //log("ts parsed, seqno=" + parsed_ts_seq_no + ", flv=" + body.length + "B");
220 - onFlvBody(body); 231 + onFlvBody(uri, body);
221 232
222 parsed_ts_seq_no++; 233 parsed_ts_seq_no++;
223 setTimeout(refresh_ts, 0); 234 setTimeout(refresh_ts, 0);