mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
fixbug[play packet decode bug: srs only read bool type play reset value, actually this value can be bool or number]
This commit is contained in:
commit
bfef0eebfe
74 changed files with 1591 additions and 1050 deletions
4
AUTHORS.txt
Normal file
4
AUTHORS.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
Authors ordered by first contribution.
|
||||
|
||||
* winlin <winlin@vip.126.com>
|
||||
* wenjie
|
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
188
README.md
188
README.md
|
@ -1,68 +1,74 @@
|
|||
simple-rtmp-server
|
||||
Simple-RTMP-Server
|
||||
==================
|
||||
|
||||
srs(simple rtmp origin live server) over state-threads.<br/>
|
||||
srs is a simple, high-performance, running in single process, origin live server.<br/>
|
||||
srs supports vhost, rtmp, HLS, transcoding, forward, http hooks. <br/>
|
||||
blog: [http://blog.csdn.net/win_lin](http://blog.csdn.net/win_lin) <br/>
|
||||
see also: [https://github.com/winlinvip/simple-rtmp-server](https://github.com/winlinvip/simple-rtmp-server) <br/>
|
||||
see also: [http://winlinvip.github.io/simple-rtmp-server](http://winlinvip.github.io/simple-rtmp-server) <br/>
|
||||
SRS(SIMPLE RTMP Server) over state-threads created in 2013.<br/>
|
||||
SRS is a simple, high-performance, running in single process, origin live server.<br/>
|
||||
SRS supports vhost, rtmp, HLS, transcoding, forward, http hooks. <br/>
|
||||
Blog: [http://blog.csdn.net/win_lin](http://blog.csdn.net/win_lin) <br/>
|
||||
See also: [https://github.com/winlinvip/simple-rtmp-server](https://github.com/winlinvip/simple-rtmp-server) <br/>
|
||||
See also: [http://winlinvip.github.io/simple-rtmp-server](http://winlinvip.github.io/simple-rtmp-server) <br/>
|
||||
TencentQQ: [http://url.cn/WAHICw](http://url.cn/WAHICw) (Group: 212189142)
|
||||
|
||||
### Contributors
|
||||
winlin([winterserver](#)): [http://blog.csdn.net/win_lin](http://blog.csdn.net/win_lin) <br/>
|
||||
wenjie([wenjiegit](https://github.com/wenjiegit/simple-rtmp-server)): [http://blog.chinaunix.net/uid/25006789.html](http://blog.chinaunix.net/uid/25006789.html) <br/>
|
||||
about the contributors: <br/>
|
||||
1. contribute important features to srs. <br/>
|
||||
2. the name of all contributors will send in the response of NetConnection.connect and metadata.
|
||||
### AUTHORS
|
||||
The PRIMARY AUTHORS are (and/or have been)(Authors ordered by first contribution): <br/>
|
||||
* winlin([winterserver](#)): [http://blog.csdn.net/win_lin](http://blog.csdn.net/win_lin) <br/>
|
||||
* wenjie([wenjiegit](https://github.com/wenjiegit/simple-rtmp-server)): [http://blog.chinaunix.net/uid/25006789.html](http://blog.chinaunix.net/uid/25006789.html) <br/>
|
||||
|
||||
About the primary AUTHORS: <br/>
|
||||
* Contribute important features to SRS. <br/>
|
||||
* Names of all PRIMARY AUTHORS response in NetConnection.connect and metadata. <br/>
|
||||
|
||||
And here is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS --<br/>
|
||||
people who have submitted patches, reported bugs, added translations, helped<br/>
|
||||
answer newbie questions, and generally made SRS that much better: [AUTHORS.txt](https://github.com/winlinvip/simple-rtmp-server/blob/master/AUTHORS.txt)
|
||||
|
||||
### Usage(simple)
|
||||
<strong>step -1:</strong> get srs<br/>
|
||||
<strong>Step -1:</strong> get SRS<br/>
|
||||
<pre>
|
||||
git clone https://github.com/winlinvip/simple-rtmp-server &&
|
||||
cd simple-rtmp-server/trunk
|
||||
</pre>
|
||||
<strong>step 0:</strong> build srs system.<br/>
|
||||
<strong>Step 0:</strong> build SRS system.<br/>
|
||||
<pre>
|
||||
bash scripts/build.sh
|
||||
</pre>
|
||||
<strong>step 1:</strong> start srs all demo features.<br/>
|
||||
<strong>Step 1:</strong> start SRS all demo features.<br/>
|
||||
<pre>
|
||||
bash scripts/run.sh
|
||||
</pre>
|
||||
<strong>step 2:</strong> srs live show: [http://your-server-ip](http://your-server-ip) <br/>
|
||||
<strong>step 3:</strong> stop srs demo<br/>
|
||||
<strong>Step 2:</strong> SRS live show: [http://your-server-ip](http://your-server-ip) <br/>
|
||||
<strong>Step 3:</strong> stop SRS demo<br/>
|
||||
<pre>
|
||||
bash scripts/stop.sh
|
||||
</pre>
|
||||
|
||||
### Usage(detail)
|
||||
<strong>step 0:</strong> get srs <br/>
|
||||
<strong>Step 0:</strong> get SRS <br/>
|
||||
<pre>
|
||||
git clone https://github.com/winlinvip/simple-rtmp-server &&
|
||||
cd simple-rtmp-server/trunk
|
||||
</pre>
|
||||
<strong>step 1:</strong> build srs <br/>
|
||||
<strong>Step 1:</strong> build SRS <br/>
|
||||
<pre>
|
||||
./configure --with-ssl --with-hls --with-ffmpeg --with-http && make
|
||||
</pre>
|
||||
<strong>step 2:</strong> start srs <br/>
|
||||
<strong>Step 2:</strong> start SRS <br/>
|
||||
<pre>
|
||||
./objs/srs -c conf/srs.conf
|
||||
</pre>
|
||||
<strong>step 3(optinal):</strong> start srs listen at 19350 to forward to<br/>
|
||||
<strong>Step 3(optinal):</strong> start SRS listen at 19350 to forward to<br/>
|
||||
<pre>
|
||||
./objs/srs -c conf/srs.19350.conf
|
||||
</pre>
|
||||
<strong>step 4(optinal):</strong> start nginx for HLS <br/>
|
||||
<strong>Step 4(optinal):</strong> start nginx for HLS <br/>
|
||||
<pre>
|
||||
sudo ./objs/nginx/sbin/nginx
|
||||
</pre>
|
||||
<strong>step 5(optinal):</strong> start http hooks for srs callback <br/>
|
||||
<strong>Step 5(optinal):</strong> start http hooks for SRS callback <br/>
|
||||
<pre>
|
||||
python ./research/api-server/server.py 8085
|
||||
</pre>
|
||||
<strong>step 6:</strong> publish demo live stream <br/>
|
||||
<strong>Step 6:</strong> publish demo live stream <br/>
|
||||
<pre>
|
||||
FMS URL: rtmp://127.0.0.1/live?vhost=demo.srs.com
|
||||
Stream: livestream
|
||||
|
@ -74,7 +80,7 @@ FFMPEG to publish the default demo stream:
|
|||
sleep 1; \
|
||||
done
|
||||
</pre>
|
||||
<strong>step 7:</strong> publish players live stream <br/>
|
||||
<strong>Step 7:</strong> publish players live stream <br/>
|
||||
<pre>
|
||||
FMS URL: rtmp://127.0.0.1/live?vhost=players
|
||||
Stream: livestream
|
||||
|
@ -86,7 +92,7 @@ FFMPEG to publish the players demo stream:
|
|||
sleep 1; \
|
||||
done
|
||||
</pre>
|
||||
<strong>step 8:</strong> add server ip to client hosts as demo. <br/>
|
||||
<strong>Step 8:</strong> add server ip to client hosts as demo. <br/>
|
||||
<pre>
|
||||
# edit the folowing file:
|
||||
# linux: /etc/hosts
|
||||
|
@ -94,14 +100,14 @@ FFMPEG to publish the players demo stream:
|
|||
# where server ip is 192.168.2.111
|
||||
192.168.2.111 demo.srs.com
|
||||
</pre>
|
||||
<strong>step 9:</strong> play live stream. <br/>
|
||||
<strong>Step 9:</strong> play live stream. <br/>
|
||||
<pre>
|
||||
players: http://demo.srs.com/players
|
||||
rtmp url: rtmp://demo.srs.com/live/livestream
|
||||
m3u8 url: http://demo.srs.com/live/livestream.m3u8
|
||||
for android: http://demo.srs.com/live/livestream.html
|
||||
</pre>
|
||||
<strong>step 10(optinal):</strong> play live stream auto transcoded<br/>
|
||||
<strong>Step 10(optinal):</strong> play live stream auto transcoded<br/>
|
||||
<pre>
|
||||
rtmp url: rtmp://demo.srs.com/live/livestream_ld
|
||||
m3u8 url: http://demo.srs.com/live/livestream_ld.m3u8
|
||||
|
@ -110,7 +116,7 @@ rtmp url: rtmp://demo.srs.com/live/livestream_sd
|
|||
m3u8 url: http://demo.srs.com/live/livestream_sd.m3u8
|
||||
for android: http://demo.srs.com/live/livestream_sd.html
|
||||
</pre>
|
||||
<strong>step 11(optinal):</strong> play live stream auto forwarded, the hls dir change to /forward<br/>
|
||||
<strong>Step 11(optinal):</strong> play live stream auto forwarded, the hls dir change to /forward<br/>
|
||||
<pre>
|
||||
rtmp url: rtmp://demo.srs.com:19350/live/livestream
|
||||
m3u8 url: http://demo.srs.com/forward/live/livestream.m3u8
|
||||
|
@ -122,7 +128,7 @@ rtmp url: rtmp://demo.srs.com:19350/live/livestream_sd
|
|||
m3u8 url: http://demo.srs.com/forward/live/livestream_sd.m3u8
|
||||
for android: http://demo.srs.com/forward/live/livestream_sd.html
|
||||
</pre>
|
||||
<strong>step 12(optinal):</strong> modify the config and reload it (all features support reload)<br/>
|
||||
<strong>Step 12(optinal):</strong> modify the config and reload it (all features support reload)<br/>
|
||||
<pre>
|
||||
killall -1 srs
|
||||
</pre>
|
||||
|
@ -135,7 +141,7 @@ killall -s SIGHUP srs
|
|||
System Architecture:
|
||||
<pre>
|
||||
+------------------------------------------------------+
|
||||
| SRS(Simple Rtmp Server) |
|
||||
| SRS(Simple RTMP Server) |
|
||||
+---------------+---------------+-----------+----------+
|
||||
| API/hook | Transcoder | HLS | RTMP |
|
||||
| http-parser | FFMPEG/x264 | NGINX/ts | protocol |
|
||||
|
@ -151,7 +157,7 @@ Stream Architecture:
|
|||
+ Publish + + Deliver |
|
||||
+---|-----+ +----|-----+
|
||||
+-----------+-------------------------+----------------+
|
||||
| Encoder | SRS(Simple Rtmp Server) | Client |
|
||||
| Encoder | SRS(Simple RTMP Server) | Client |
|
||||
+-----------+-------------------------+----------------+
|
||||
| (FMLE, | +-> RTMP protocol ----+-> Flash Player |
|
||||
| FFMPEG, --+-> +-> HLS/NGINX --------+-> m3u8 player |
|
||||
|
@ -186,7 +192,7 @@ Bandwidth Test Workflow:
|
|||
| final(2)-----------------> |
|
||||
| <END> |
|
||||
|
||||
@see: class SrsBandwidth comments.
|
||||
@See: class SrsBandwidth comments.
|
||||
</pre>
|
||||
|
||||
### System Requirements
|
||||
|
@ -195,37 +201,38 @@ Supported operating systems and hardware:
|
|||
* All handware.
|
||||
|
||||
### Summary
|
||||
1. simple: also stable enough.<br/>
|
||||
2. high-performance: single-thread, async socket, event/st-thread driven.<br/>
|
||||
3. no edge server, origin server only.<br/>
|
||||
4. no vod streaming, live streaming only.<br/>
|
||||
5. no multiple processes, single process only.<br/>
|
||||
6. support vhost, support \_\_defaultVhost\_\_.<br/>
|
||||
7. support adobe rtmp live streaming.<br/>
|
||||
8. support apple hls(m3u8) live streaming.<br/>
|
||||
9. support reload config to enable changes.<br/>
|
||||
10. support cache last gop for flash player to fast startup.<br/>
|
||||
11. support listen at multiple ports.<br/>
|
||||
12. support long time(>4.6hours) publish/play.<br/>
|
||||
13. high performace, 1800 connections(500kbps), 900Mbps, CPU 90.2%, 41MB<br/>
|
||||
14. support forward publish stream to build active-standby cluster.<br/>
|
||||
15. support broadcast by forward the stream to other servers(origin/edge).<br/>
|
||||
16. support live stream transcoding by ffmpeg.<br/>
|
||||
17. support live stream forward(acopy/vcopy) by ffmpeg.<br/>
|
||||
18. support ffmpeg filters(logo/overlay/crop), x264 params.<br/>
|
||||
19. support audio transcode only, speex/mp3 to aac<br/>
|
||||
20. support http callback api hooks(for authentication and injection).<br/>
|
||||
21. support bandwidth test api and flash client.<br/>
|
||||
22. player, publisher(encoder), and demo pages(jquery+bootstrap). <br/>
|
||||
23. demo video meeting or chat(srs+cherrypy+jquery+bootstrap). <br/>
|
||||
24. [plan] support network based cli and json result.<br/>
|
||||
25. [plan] support adobe flash refer/token/swf verification.<br/>
|
||||
26. [plan] support adobe amf3 codec.<br/>
|
||||
27. [plan] support dvr(record live to vod file)<br/>
|
||||
28. [plan] support FMS edge protocol<br/>
|
||||
29. [plan] support encryption: RTMPE/RTMPS, HLS DRM<br/>
|
||||
30. [plan] support RTMPT, http to tranverse firewalls<br/>
|
||||
31. [plan] support file source, transcoding file to live stream<br/>
|
||||
1. Simple: also stable enough.<br/>
|
||||
2. [High-performance](https://github.com/winlinvip/simple-rtmp-server/wiki/Performance): single-thread, async socket, event/st-thread driven.<br/>
|
||||
3. NO edge server, origin server only.<br/>
|
||||
4. NO vod streaming, live streaming only.<br/>
|
||||
5. NO multiple processes, single process only.<br/>
|
||||
6. Support vhost, support \_\_defaultVhost\_\_.<br/>
|
||||
7. Support adobe rtmp live streaming.<br/>
|
||||
8. Support apple hls(m3u8) live streaming.<br/>
|
||||
9. Support reload config to enable changes.<br/>
|
||||
10. Support cache last gop for flash player to fast startup.<br/>
|
||||
11. Support listen at multiple ports.<br/>
|
||||
12. Support long time(>4.6hours) publish/play.<br/>
|
||||
13. High performace, 1800 connections(500kbps), 900Mbps, CPU 90.2%, 41MB<br/>
|
||||
14. Support forward publish stream to build active-standby [cluster](https://github.com/winlinvip/simple-rtmp-server/wiki/Cluster).<br/>
|
||||
15. Support broadcast by forward the stream to other servers(origin/edge).<br/>
|
||||
16. Support live stream transcoding by ffmpeg.<br/>
|
||||
17. Support live stream forward(acopy/vcopy) by ffmpeg.<br/>
|
||||
18. Support ffmpeg filters(logo/overlay/crop), x264 params.<br/>
|
||||
19. Support audio transcode only, speex/mp3 to aac<br/>
|
||||
20. Support http callback api hooks(for authentication and injection).<br/>
|
||||
21. Support bandwidth test api and flash client.<br/>
|
||||
22. Player, publisher(encoder), and demo pages(jquery+bootstrap). <br/>
|
||||
23. Demo video meeting or chat(SRS+cherrypy+jquery+bootstrap). <br/>
|
||||
24. [dev] Full documents in wiki, in chineses. <br/>
|
||||
25. [plan] Support network based cli and json result.<br/>
|
||||
26. [plan] Support adobe flash refer/token/swf verification.<br/>
|
||||
27. [plan] Support adobe amf3 codec.<br/>
|
||||
28. [plan] Support dvr(record live to vod file)<br/>
|
||||
29. [plan] Support FMS edge protocol<br/>
|
||||
30. [plan] Support encryption: RTMPE/RTMPS, HLS DRM<br/>
|
||||
31. [plan] Support RTMPT, http to tranverse firewalls<br/>
|
||||
32. [plan] Support file source, transcoding file to live stream<br/>
|
||||
|
||||
### Performance
|
||||
1. 300 connections, 150Mbps, 500kbps, CPU 18.8%, 5956KB.
|
||||
|
@ -234,53 +241,54 @@ Supported operating systems and hardware:
|
|||
4. 1200 connections, 600Mbps, 500kbps, CPU 72.4%, 15MB.
|
||||
5. 1500 connections, 750Mbps, 500kbps, CPU 81.9%, 28MB.
|
||||
6. 1800 connections, 900Mbps, 500kbps, CPU 90.2%, 41MB.
|
||||
|
||||
<pre>
|
||||
[winlin@dev6 srs]$ dstat
|
||||
----total-cpu-usage---- -dsk/total- ---net/lo-- ---paging-- ---system--
|
||||
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
|
||||
58 9 32 0 0 1| 0 4168k| 277M 277M| 0 0 | 29k 25k
|
||||
61 8 30 0 0 1| 0 1168k| 336M 336M| 0 0 | 29k 24k
|
||||
63 8 27 0 0 1| 0 2240k| 124M 124M| 0 0 | 32k 33k
|
||||
62 8 28 0 0 1| 0 1632k| 110M 110M| 0 0 | 31k 33k
|
||||
67 9 23 0 0 2| 0 1604k| 130M 130M| 0 0 | 33k 32k
|
||||
63 9 27 0 0 2| 0 1496k| 145M 145M| 0 0 | 32k 32k
|
||||
61 9 29 0 0 1| 0 1112k| 132M 132M| 0 0 | 32k 33k
|
||||
63 9 27 0 0 2| 0 1220k| 145M 145M| 0 0 | 32k 33k
|
||||
53 7 40 0 0 1| 0 1360k| 115M 115M| 0 0 | 24k 26k
|
||||
51 7 41 0 0 1| 0 1184k| 146M 146M| 0 0 | 24k 27k
|
||||
39 6 54 0 0 1| 0 1284k| 105M 105M| 0 0 | 22k 28k
|
||||
41 6 52 0 0 1| 0 1264k| 116M 116M| 0 0 | 25k 28k
|
||||
48 6 45 0 0 1| 0 1272k| 143M 143M| 0 0 | 27k 27k
|
||||
</pre>
|
||||
See also: [Performance Test Guide](https://github.com/winlinvip/simple-rtmp-server/wiki/Performance)
|
||||
|
||||
### Releases
|
||||
* 2013-12-25, [release v0.9](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.9), support bandwidth test, add player/encoder/chat demos. 20926 lines.<br/>
|
||||
* 2013-12-08, [release v0.8](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.8), support http hooks callback, update [st_load](https://github.com/winlinvip/st-load). 19186 lines.<br/>
|
||||
* 2013-12-03, [release v0.7](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.7), support live stream transcoding. 17605 lines.<br/>
|
||||
* 2013-11-29, [release v0.6](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.6), support forward stream to origin/edge. 16094 lines.<br/>
|
||||
* 2013-11-26, [release v0.5](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.5), support HLS(m3u8), fragment and window. 14449 lines.<br/>
|
||||
* 2013-11-10, [release v0.4](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.4), support reload config, pause, longtime publish/play. 12500 lines.<br/>
|
||||
* 2013-11-04, [release v0.3](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.3), support vhost, refer, gop cache, listen multiple ports. 11773 lines.<br/>
|
||||
* 2013-10-25, [release v0.2](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.2), support rtmp flash publish, h264, time jitter correct. 10125 lines.<br/>
|
||||
* 2013-10-23, [release v0.1](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.1), support rtmp FMLE/FFMPEG publish, vp6. 8287 lines.<br/>
|
||||
* 2013-10-17, created.<br/>
|
||||
* 2013-12-25, [Release v0.9](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.9), support bandwidth test, add player/encoder/chat demos. 20926 lines.<br/>
|
||||
* 2013-12-08, [Release v0.8](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.8), support http hooks callback, update [st_load](https://github.com/winlinvip/st-load). 19186 lines.<br/>
|
||||
* 2013-12-03, [Release v0.7](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.7), support live stream transcoding. 17605 lines.<br/>
|
||||
* 2013-11-29, [Release v0.6](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.6), support forward stream to origin/edge. 16094 lines.<br/>
|
||||
* 2013-11-26, [Release v0.5](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.5), support HLS(m3u8), fragment and window. 14449 lines.<br/>
|
||||
* 2013-11-10, [Release v0.4](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.4), support reload config, pause, longtime publish/play. 12500 lines.<br/>
|
||||
* 2013-11-04, [Release v0.3](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.3), support vhost, refer, gop cache, listen multiple ports. 11773 lines.<br/>
|
||||
* 2013-10-25, [Release v0.2](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.2), support rtmp flash publish, h264, time jitter correct. 10125 lines.<br/>
|
||||
* 2013-10-23, [Release v0.1](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.1), support rtmp FMLE/FFMPEG publish, vp6. 8287 lines.<br/>
|
||||
* 2013-10-17, Created.<br/>
|
||||
|
||||
### Compare
|
||||
* srs v0.9: 20926 lines. player/encoder/chat demos. bandwidth test for encoder/CDN.<br/>
|
||||
* srs v0.8: 19186 lines. implements http hooks refer to [nginx-rtmp](https://github.com/arut/nginx-rtmp-module). <br/>
|
||||
* srs v0.7: 17605 lines. implements transcoding(FFMPEG) feature refer to [wowza](http://www.wowza.com). <br/>
|
||||
* srs v0.6: 16094 lines. important feature forward for CDN. <br/>
|
||||
* srs v0.5: 14449 lines. implements HLS feature refer to [nginx-rtmp](https://github.com/arut/nginx-rtmp-module). <br/>
|
||||
* srs v0.4: 12500 lines. important feature reload for CDN. <br/>
|
||||
* srs v0.3: 11773 lines. implements vhost feature refer to [FMS](http://www.adobe.com/products/adobe-media-server-family.html). <br/>
|
||||
* srs v0.2: 10125 lines. implements rtmp protocol stack refer to [nginx-rtmp](https://github.com/arut/nginx-rtmp-module). <br/>
|
||||
* srs v0.1: 8287 lines. base on state-threads. <br/>
|
||||
* SRS v0.9: 20926 lines. player/encoder/chat demos. bandwidth test for encoder/CDN.<br/>
|
||||
* SRS v0.8: 19186 lines. implements http hooks refer to [nginx-rtmp](https://github.com/arut/nginx-rtmp-module). <br/>
|
||||
* SRS v0.7: 17605 lines. implements transcoding(FFMPEG) feature refer to [wowza](http://www.wowza.com). <br/>
|
||||
* SRS v0.6: 16094 lines. important feature forward for CDN. <br/>
|
||||
* SRS v0.5: 14449 lines. implements HLS feature refer to [nginx-rtmp](https://github.com/arut/nginx-rtmp-module). <br/>
|
||||
* SRS v0.4: 12500 lines. important feature reload for CDN. <br/>
|
||||
* SRS v0.3: 11773 lines. implements vhost feature refer to [FMS](http://www.adobe.com/products/adobe-media-server-family.html). <br/>
|
||||
* SRS v0.2: 10125 lines. implements rtmp protocol stack refer to [nginx-rtmp](https://github.com/arut/nginx-rtmp-module). <br/>
|
||||
* SRS v0.1: 8287 lines. base on state-threads. <br/>
|
||||
* nginx-rtmp v1.0.4: 26786 lines <br/>
|
||||
* nginx v1.5.0: 139524 lines <br/>
|
||||
|
||||
### History
|
||||
* v1.0, 2014-01-01, change listen(512), chunk-size(60000), to improve performance.
|
||||
* v1.0, 2013-12-27, merge from wenjie, the bandwidth test feature.
|
||||
* v0.9, 2013-12-25, [v0.9](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.9) released. 20926 lines.
|
||||
* v0.9, 2013-12-25, fix the bitrate bug(in Bps), use enhanced microphone.
|
||||
* v0.9, 2013-12-22, demo video meeting or chat(srs+cherrypy+jquery+bootstrap).
|
||||
* v0.9, 2013-12-22, demo video meeting or chat(SRS+cherrypy+jquery+bootstrap).
|
||||
* v0.9, 2013-12-22, merge from wenjie, support banwidth test.
|
||||
* v0.9, 2013-12-22, merge from wenjie: support set chunk size at vhost level
|
||||
* v0.9, 2013-12-21, add [players](http://demo.srs.com/players) for play and publish.
|
||||
|
@ -297,7 +305,7 @@ usr sys idl wai hiq siq| read writ| recv send| in out | int csw
|
|||
* v0.8, 2013-12-08, support multiple http hooks for a event.
|
||||
* v0.8, 2013-12-07, support http callback hooks, on_connect.
|
||||
* v0.8, 2013-12-07, support network based cli and json result, add CherryPy 3.2.4.
|
||||
* v0.8, 2013-12-07, update http/hls/rtmp load test tool [st_load](https://github.com/winlinvip/st-load), use srs rtmp sdk.
|
||||
* v0.8, 2013-12-07, update http/hls/rtmp load test tool [st_load](https://github.com/winlinvip/st-load), use SRS rtmp sdk.
|
||||
* v0.8, 2013-12-06, support max_connections, drop if exceed.
|
||||
* v0.8, 2013-12-05, support log_dir, write ffmpeg log to file.
|
||||
* v0.8, 2013-12-05, fix the forward/hls/encoder bug.
|
||||
|
|
|
@ -1,5 +1,14 @@
|
|||
# the listen ports, split by space.
|
||||
listen 1935;
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
# the default chunk size is 128, max is 65536,
|
||||
# some client does not support chunk size change,
|
||||
# however, most clients supports it and it can improve
|
||||
# performance about 10%.
|
||||
# default: 60000
|
||||
chunk_size 60000;
|
||||
>>>>>>> upstream/master
|
||||
# the logs dir.
|
||||
# if enabled ffmpeg, each stracoding stream will create a log file.
|
||||
# default: ./objs/logs
|
||||
|
@ -28,7 +37,7 @@ vhost __defaultVhost__ {
|
|||
# for which cannot identify the required vhost.
|
||||
# for default demo.
|
||||
vhost demo.srs.com {
|
||||
chunk_size 4096;
|
||||
chunk_size 60000;
|
||||
enabled on;
|
||||
gop_cache on;
|
||||
queue_length 30;
|
||||
|
@ -226,7 +235,7 @@ vhost bandcheck.srs.com {
|
|||
enabled on;
|
||||
# the key for server to valid,
|
||||
# if invalid key, server disconnect and abort the bandwidth check.
|
||||
key 35c9b402c12a7246868752e2878f7e0e;
|
||||
key "35c9b402c12a7246868752e2878f7e0e";
|
||||
# the interval in seconds for bandwidth check,
|
||||
# server donot allow new test request.
|
||||
# default: 30
|
||||
|
|
20
trunk/configure
vendored
20
trunk/configure
vendored
|
@ -47,22 +47,27 @@ echo "" >> $SRS_AUTO_HEADERS_H
|
|||
echo "generate Makefile"
|
||||
|
||||
cat << END > ${SRS_MAKEFILE}
|
||||
.PHONY: default help clean server _prepare_dir
|
||||
default: server
|
||||
.PHONY: default help clean server bandwidth _prepare_dir
|
||||
default: server bandwidth
|
||||
|
||||
help:
|
||||
@echo "Usage: make <help>|<clean>|<server>"
|
||||
@echo "Usage: make <help>|<clean>|<server>|<bandwidth>"
|
||||
@echo " help display this help menu"
|
||||
@echo " clean cleanup project"
|
||||
@echo " server build the srs(simple rtmp server) over st(state-threads)"
|
||||
@echo " bandwidth build the bandwidth test client tool."
|
||||
|
||||
clean:
|
||||
(rm -f Makefile; cd ${SRS_OBJS}; rm -rf srs Makefile *.hpp src st_*_load)
|
||||
(rm -f Makefile; cd ${SRS_OBJS}; rm -rf srs bandwidth Makefile *.hpp src st_*_load)
|
||||
|
||||
server: _prepare_dir
|
||||
@echo "build the srs(simple rtmp server) over st(state-threads)"
|
||||
\$(MAKE) -f ${SRS_OBJS}/${SRS_MAKEFILE} srs
|
||||
|
||||
bandwidth: _prepare_dir
|
||||
@echo "build the bandwidth test client tool"
|
||||
\$(MAKE) -f ${SRS_OBJS}/${SRS_MAKEFILE} bandwidth
|
||||
|
||||
# the ./configure will generate it.
|
||||
_prepare_dir:
|
||||
@mkdir -p ${SRS_OBJS}
|
||||
|
@ -87,7 +92,7 @@ GCC = g++
|
|||
LINK = \$(GCC)
|
||||
AR = ar
|
||||
|
||||
.PHONY: default srs
|
||||
.PHONY: default srs bandwidth
|
||||
|
||||
default:
|
||||
|
||||
|
@ -124,12 +129,12 @@ CORE_OBJS="${MODULE_OBJS[@]}"
|
|||
MODULE_ID="MAIN"
|
||||
MODULE_DEPENDS=("CORE")
|
||||
ModuleLibIncs=(${LibSTRoot} ${SRS_OBJS})
|
||||
MODULE_FILES=("srs_main_server")
|
||||
MODULE_FILES=("srs_main_server" "srs_main_bandcheck")
|
||||
MODULE_DIR="src/main" . auto/modules.sh
|
||||
MAIN_OBJS="${MODULE_OBJS[@].o}"
|
||||
|
||||
# all main entrances
|
||||
MAIN_ENTRANCES=("srs_main_server")
|
||||
MAIN_ENTRANCES=("srs_main_server" "srs_main_bandcheck")
|
||||
|
||||
# srs(simple rtmp server) over st(state-threads)
|
||||
ModuleLibFiles=(${LibSTfile})
|
||||
|
@ -143,6 +148,7 @@ else
|
|||
LINK_OPTIONS="-ldl"
|
||||
fi
|
||||
BUILD_KEY="srs" APP_MAIN="srs_main_server" APP_NAME="srs" SO_PATH="" . auto/apps.sh
|
||||
BUILD_KEY="bandwidth" APP_MAIN="srs_main_bandcheck" APP_NAME="bandwidth" SO_PATH="" . auto/apps.sh
|
||||
|
||||
echo 'configure ok! '
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
'''
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -463,7 +463,7 @@ if __name__ != "__main__":
|
|||
|
||||
# check the user options
|
||||
if len(sys.argv) <= 1:
|
||||
print "SRS api callback server, Copyright (c) 2013 winlin"
|
||||
print "SRS api callback server, Copyright (c) 2013-2014 winlin"
|
||||
print "Usage: python %s <port>"%(sys.argv[0])
|
||||
print " port: the port to listen at."
|
||||
print "For example:"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -417,38 +417,38 @@ public:
|
|||
*/
|
||||
enum TSPESStreamId
|
||||
{
|
||||
PES_program_stream_map = 0b10111100, // 0xbc
|
||||
PES_private_stream_1 = 0b10111101, // 0xbd
|
||||
PES_padding_stream = 0b10111110, // 0xbe
|
||||
PES_private_stream_2 = 0b10111111, // 0xbf
|
||||
PES_program_stream_map = 0xbc, // 0b10111100
|
||||
PES_private_stream_1 = 0xbd, // 0b10111101
|
||||
PES_padding_stream = 0xbe, // 0b10111110
|
||||
PES_private_stream_2 = 0xbf, // 0b10111111
|
||||
|
||||
// 110x xxxx
|
||||
// ISO/IEC 13818-3 or ISO/IEC 11172-3 or ISO/IEC 13818-7 or ISO/IEC
|
||||
// 14496-3 audio stream number x xxxx
|
||||
// (stream_id>>5)&0x07 == PES_audio_prefix
|
||||
PES_audio_prefix = 0b110,
|
||||
PES_audio_prefix = 0x06, // 0b110
|
||||
|
||||
// 1110 xxxx
|
||||
// ITU-T Rec. H.262 | ISO/IEC 13818-2 or ISO/IEC 11172-2 or ISO/IEC
|
||||
// 14496-2 video stream number xxxx
|
||||
// (stream_id>>4)&0x0f == PES_audio_prefix
|
||||
PES_video_prefix = 0b1110,
|
||||
PES_video_prefix = 0x0e, // 0b1110
|
||||
|
||||
PES_ECM_stream = 0b11110000, // 0xf0
|
||||
PES_EMM_stream = 0b11110001, // 0xf1
|
||||
PES_DSMCC_stream = 0b11110010, // 0xf2
|
||||
PES_13522_stream = 0b11110011, // 0xf3
|
||||
PES_H_222_1_type_A = 0b11110100, // 0xf4
|
||||
PES_H_222_1_type_B = 0b11110101, // 0xf5
|
||||
PES_H_222_1_type_C = 0b11110110, // 0xf6
|
||||
PES_H_222_1_type_D = 0b11110111, // 0xf7
|
||||
PES_H_222_1_type_E = 0b11111000, // 0xf8
|
||||
PES_ancillary_stream = 0b11111001, // 0xf9
|
||||
PES_SL_packetized_stream = 0b11111010, // 0xfa
|
||||
PES_FlexMux_stream = 0b11111011, // 0xfb
|
||||
PES_ECM_stream = 0xf0, // 0b11110000
|
||||
PES_EMM_stream = 0xf1, // 0b11110001
|
||||
PES_DSMCC_stream = 0xf2, // 0b11110010
|
||||
PES_13522_stream = 0xf3, // 0b11110011
|
||||
PES_H_222_1_type_A = 0xf4, // 0b11110100
|
||||
PES_H_222_1_type_B = 0xf5, // 0b11110101
|
||||
PES_H_222_1_type_C = 0xf6, // 0b11110110
|
||||
PES_H_222_1_type_D = 0xf7, // 0b11110111
|
||||
PES_H_222_1_type_E = 0xf8, // 0b11111000
|
||||
PES_ancillary_stream = 0xf9, // 0b11111001
|
||||
PES_SL_packetized_stream = 0xfa, // 0b11111010
|
||||
PES_FlexMux_stream = 0xfb, // 0b11111011
|
||||
// reserved data stream
|
||||
// 1111 1100 … 1111 1110
|
||||
PES_program_stream_directory= 0b11111111, // 0xff
|
||||
PES_program_stream_directory= 0xff, // 0b11111111
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
<<<<<<< HEAD
|
||||
// for bw to init url
|
||||
// url: scheme://host:port/path?query#fragment
|
||||
function srs_init_bwt(rtmp_url, hls_url) {
|
||||
|
@ -24,4 +25,141 @@ function srs_bwt_check_url(url) {
|
|||
function srs_bwt_build_default_url() {
|
||||
var url_default = "rtmp://" + window.location.host + ":" + 1935 + "/app?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com";
|
||||
return url_default;
|
||||
=======
|
||||
/**
|
||||
* the SrsBandwidth object.
|
||||
* @param container the html container id.
|
||||
* @param width a float value specifies the width of bandwidth.
|
||||
* @param height a float value specifies the height of bandwidth.
|
||||
* @param private_object [optional] an object that used as private object,
|
||||
* for example, the logic chat object which owner this bandwidth.
|
||||
*/
|
||||
function SrsBandwidth(container, width, height, private_object) {
|
||||
if (!SrsBandwidth.__id) {
|
||||
SrsBandwidth.__id = 100;
|
||||
}
|
||||
if (!SrsBandwidth.__bandwidths) {
|
||||
SrsBandwidth.__bandwidths = [];
|
||||
}
|
||||
|
||||
SrsBandwidth.__bandwidths.push(this);
|
||||
|
||||
this.private_object = private_object;
|
||||
this.container = container;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
this.id = SrsBandwidth.__id++;
|
||||
this.stream_url = null;
|
||||
this.callbackObj = null;
|
||||
|
||||
// the callback set data.
|
||||
this.percent = 0;
|
||||
this.status = "";
|
||||
}
|
||||
/**
|
||||
* user can set some callback, then start the bandwidth.
|
||||
* @param url the bandwidth test url.
|
||||
* callbacks:
|
||||
* on_bandwidth_ready():void, when srs bandwidth ready, user can play.
|
||||
* on_update_progress(percent:Number):void, when srs bandwidth update the progress.
|
||||
* percent:Number 100 means 100%.
|
||||
* on_update_status(status:String):void, when srs bandwidth update the status.
|
||||
* status:String the human readable status text.
|
||||
*/
|
||||
SrsBandwidth.prototype.start = function(url) {
|
||||
if (url) {
|
||||
this.stream_url = url;
|
||||
}
|
||||
|
||||
// embed the flash.
|
||||
var flashvars = {};
|
||||
flashvars.id = this.id;
|
||||
flashvars.on_bandwidth_ready = "__srs_on_bandwidth_ready";
|
||||
flashvars.on_update_progress = "__srs_on_update_progress";
|
||||
flashvars.on_update_status = "__srs_on_update_status";
|
||||
|
||||
var params = {};
|
||||
params.wmode = "opaque";
|
||||
params.allowFullScreen = "true";
|
||||
params.allowScriptAccess = "always";
|
||||
|
||||
var attributes = {};
|
||||
|
||||
var self = this;
|
||||
|
||||
swfobject.embedSWF(
|
||||
"srs_bwt/release/srs_bwt.swf?_version="+srs_get_version_code(),
|
||||
this.container,
|
||||
this.width, this.height,
|
||||
"11.1.0", "js/AdobeFlashbandwidthInstall.swf",
|
||||
flashvars, params, attributes,
|
||||
function(callbackObj){
|
||||
self.callbackObj = callbackObj;
|
||||
}
|
||||
);
|
||||
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* play the stream.
|
||||
* @param stream_url the url of stream, rtmp or http.
|
||||
* @param volume the volume, 0 is mute, 1 is 100%, 2 is 200%.
|
||||
*/
|
||||
SrsBandwidth.prototype.check_bandwidth = function(url) {
|
||||
this.stop();
|
||||
SrsBandwidth.__bandwidths.push(this);
|
||||
|
||||
if (url) {
|
||||
this.stream_url = url;
|
||||
}
|
||||
|
||||
this.callbackObj.ref.__check_bandwidth(this.stream_url);
|
||||
}
|
||||
SrsBandwidth.prototype.stop = function(url) {
|
||||
for (var i = 0; i < SrsBandwidth.__bandwidths.length; i++) {
|
||||
var bandwidth = SrsBandwidth.__bandwidths[i];
|
||||
|
||||
if (bandwidth.id != this.id) {
|
||||
continue;
|
||||
}
|
||||
|
||||
SrsBandwidth.__bandwidths.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
this.callbackObj.ref.__stop();
|
||||
}
|
||||
SrsBandwidth.prototype.on_bandwidth_ready = function() {
|
||||
}
|
||||
SrsBandwidth.prototype.on_update_progress = function(percent) {
|
||||
}
|
||||
SrsBandwidth.prototype.on_update_status = function(status) {
|
||||
}
|
||||
function __srs_find_bandwidth(id) {
|
||||
for (var i = 0; i < SrsBandwidth.__bandwidths.length; i++) {
|
||||
var bandwidth = SrsBandwidth.__bandwidths[i];
|
||||
|
||||
if (bandwidth.id != id) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return bandwidth;
|
||||
}
|
||||
|
||||
throw new Error("bandwidth not found. id=" + id);
|
||||
}
|
||||
function __srs_on_bandwidth_ready(id) {
|
||||
var bandwidth = __srs_find_bandwidth(id);
|
||||
bandwidth.on_bandwidth_ready();
|
||||
}
|
||||
function __srs_on_update_progress(id, percent) {
|
||||
var bandwidth = __srs_find_bandwidth(id);
|
||||
bandwidth.percent = percent;
|
||||
bandwidth.on_update_progress(percent);
|
||||
}
|
||||
function __srs_on_update_status(id, status) {
|
||||
var bandwidth = __srs_find_bandwidth(id);
|
||||
bandwidth.status = status;
|
||||
bandwidth.on_update_status(status);
|
||||
>>>>>>> upstream/master
|
||||
}
|
|
@ -10,7 +10,7 @@ function srs_get_player_width() { return srs_get_player_modal() - 30; }
|
|||
function srs_get_player_height() { return srs_get_player_width() * 9 / 19; }
|
||||
|
||||
// to query the swf anti cache.
|
||||
function srs_get_version_code() { return "1.17"; }
|
||||
function srs_get_version_code() { return "1.19"; }
|
||||
// get the default vhost for players.
|
||||
function srs_get_player_vhost() { return "players"; }
|
||||
// the api server port, for chat room.
|
||||
|
@ -80,6 +80,18 @@ function build_default_publish_rtmp_url() {
|
|||
return "rtmp://" + server + ":" + port + "/" + app + "...vhost..." + vhost + "/" + stream;
|
||||
}
|
||||
}
|
||||
// for the bandwidth tool to init page
|
||||
function build_default_bandwidth_rtmp_url() {
|
||||
var query = parse_query_string();
|
||||
|
||||
var server = (query.server == undefined)? window.location.hostname:query.server;
|
||||
var port = (query.port == undefined)? 1935:query.port;
|
||||
var vhost = "bandcheck.srs.com";
|
||||
var app = (query.app == undefined)? "app":query.app;
|
||||
var key = (query.key == undefined)? "35c9b402c12a7246868752e2878f7e0e":query.key;
|
||||
|
||||
return "rtmp://" + server + ":" + port + "/" + app + "?key=" + key + "&vhost=" + vhost;
|
||||
}
|
||||
|
||||
/**
|
||||
@param server the ip of server. default to window.location.hostname
|
||||
|
@ -139,6 +151,15 @@ function srs_init_publish(rtmp_url) {
|
|||
$(rtmp_url).val(build_default_publish_rtmp_url());
|
||||
}
|
||||
}
|
||||
// for bw to init url
|
||||
// url: scheme://host:port/path?query#fragment
|
||||
function srs_init_bwt(rtmp_url, hls_url) {
|
||||
update_nav();
|
||||
|
||||
if (rtmp_url) {
|
||||
$(rtmp_url).val(build_default_bandwidth_rtmp_url());
|
||||
}
|
||||
}
|
||||
|
||||
// check whether can republish
|
||||
function srs_can_republish() {
|
||||
|
|
|
@ -63,7 +63,7 @@ SrsPlayer.prototype.start = function(url) {
|
|||
"srs_player/release/srs_player.swf?_version="+srs_get_version_code(),
|
||||
this.container,
|
||||
this.width, this.height,
|
||||
"11.1", "js/AdobeFlashPlayerInstall.swf",
|
||||
"11.1.0", "js/AdobeFlashPlayerInstall.swf",
|
||||
flashvars, params, attributes,
|
||||
function(callbackObj){
|
||||
self.callbackObj = callbackObj;
|
||||
|
|
|
@ -73,7 +73,7 @@ SrsPublisher.prototype.start = function() {
|
|||
"srs_publisher/release/srs_publisher.swf?_version="+srs_get_version_code(),
|
||||
this.container,
|
||||
this.width, this.height,
|
||||
"11.1", "js/AdobeFlashPlayerInstall.swf",
|
||||
"11.1.0", "js/AdobeFlashPlayerInstall.swf",
|
||||
flashvars, params, attributes,
|
||||
function(callbackObj){
|
||||
self.callbackObj = callbackObj;
|
||||
|
|
|
@ -13,6 +13,21 @@ function padding(number, length, prefix) {
|
|||
|
||||
/**
|
||||
* parse the query string to object.
|
||||
* parse the url location object as: host(hostname:http_port), pathname(dir/filename)
|
||||
* for example, url http://192.168.1.168:1980/ui/players.html?vhost=player.vhost.com&app=test&stream=livestream
|
||||
* parsed to object:
|
||||
{
|
||||
host : "192.168.1.168:1980",
|
||||
hostname : "192.168.1.168",
|
||||
http_port : 1980,
|
||||
pathname : "/ui/players.html",
|
||||
dir : "/ui",
|
||||
filename : "/players.html",
|
||||
|
||||
vhost : "player.vhost.com",
|
||||
app : "test",
|
||||
stream : "livestream"
|
||||
}
|
||||
*/
|
||||
function parse_query_string(){
|
||||
var obj = {};
|
||||
|
|
|
@ -12,13 +12,18 @@
|
|||
<script type="text/javascript" src="js/srs.player.js"></script>
|
||||
<script type="text/javascript" src="js/srs.publisher.js"></script>
|
||||
<script type="text/javascript" src="js/srs.utility.js"></script>
|
||||
<<<<<<< HEAD
|
||||
<script type="text/javascript" src="js/srs.utility.js"></script>
|
||||
<script type="text/javascript" src="js/srs.bandwidth.js"></script>
|
||||
=======
|
||||
<script type="text/javascript" src="js/srs.bandwidth.js"></script>
|
||||
>>>>>>> upstream/master
|
||||
<style>
|
||||
body{
|
||||
padding-top: 55px;
|
||||
}
|
||||
#main_modal {
|
||||
<<<<<<< HEAD
|
||||
width: 600px;
|
||||
margin-left: -300px;
|
||||
}
|
||||
|
@ -119,6 +124,56 @@
|
|||
}
|
||||
);
|
||||
});
|
||||
=======
|
||||
width: 700px;
|
||||
margin-left: -350px;
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
var bandwidth = null;
|
||||
|
||||
$(function(){
|
||||
srs_init_bwt("#txt_url");
|
||||
|
||||
$("#btn_play").click(on_click_play);
|
||||
$("#main_modal").on("show", on_start_bandwidth_test);
|
||||
$("#main_modal").on("hide", on_stop_bandwidth_test);
|
||||
});
|
||||
|
||||
function on_click_play() {
|
||||
$("#check_status").text("");
|
||||
$("#progress_bar").width("0%");
|
||||
$("#main_modal").modal({show:true, keyboard:false});
|
||||
}
|
||||
function on_start_bandwidth_test() {
|
||||
$("#div_container").remove();
|
||||
|
||||
var div_container = $("<div/>");
|
||||
$(div_container).attr("id", "div_container");
|
||||
$("#player").append(div_container);
|
||||
|
||||
var player = $("<div/>");
|
||||
$(player).attr("id", "player_id");
|
||||
$(div_container).append(player);
|
||||
|
||||
var url = $("#txt_url").val();
|
||||
|
||||
bandwidth = new SrsBandwidth("player_id", 100, 1);
|
||||
bandwidth.on_bandwidth_ready = function() {
|
||||
this.check_bandwidth(url);
|
||||
}
|
||||
bandwidth.on_update_progress = function(percent) {
|
||||
$("#progress_bar").width(percent + "%");
|
||||
}
|
||||
bandwidth.on_update_status = function(status) {
|
||||
$("#check_status").text(status);
|
||||
}
|
||||
bandwidth.start(url);
|
||||
}
|
||||
function on_stop_bandwidth_test() {
|
||||
bandwidth.stop();
|
||||
}
|
||||
>>>>>>> upstream/master
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
@ -141,6 +196,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<<<<<<< HEAD
|
||||
|
||||
<div class="form-inline">
|
||||
URL:
|
||||
|
@ -164,15 +220,49 @@
|
|||
</div>
|
||||
<span id="check_status1"><font ><strong id="check_status">status</strong></font> </span>
|
||||
|
||||
=======
|
||||
<div class="alert alert-info fade in">
|
||||
<button type="button" class="close" data-dismiss="alert">×</button>
|
||||
<strong><span>Usage:</span></strong> <span>点击“开始测速”即可测带宽,最大可测试带宽由服务器限制</span>
|
||||
</div>
|
||||
<div class="form-inline">
|
||||
URL:
|
||||
<input type="text" id="txt_url" class="input-xxlarge" value=""></input>
|
||||
<button class="btn btn-primary" id="btn_play">开始测速</button>
|
||||
</div>
|
||||
<div id="main_modal" class="modal hide fade">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h3>SRS Bandwidth Check</h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="row-fluid">
|
||||
<div class="span1"></div>
|
||||
<div class="span10">
|
||||
<div class="progress progress-striped active" id="pb_buffer_bg">
|
||||
<div class="bar" style="width: 0%;" id="progress_bar"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="span1"></div>
|
||||
</div>
|
||||
<span id="check_status">status</span>
|
||||
</div>
|
||||
>>>>>>> upstream/master
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-primary" data-dismiss="modal" aria-hidden="true"> 关闭 </button>
|
||||
</div>
|
||||
</div>
|
||||
<<<<<<< HEAD
|
||||
|
||||
=======
|
||||
>>>>>>> upstream/master
|
||||
<hr>
|
||||
<footer>
|
||||
<p><a href="https://github.com/winlinvip/simple-rtmp-server">SRS Team © 2013</a></p>
|
||||
</footer>
|
||||
<div class="container">
|
||||
<div id="player"></div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<actionScriptProperties analytics="false" mainApplicationPath="srs_bwt.as" projectUUID="00251213-e6a2-4dd5-a033-125cc78f843c" version="10">
|
||||
<<<<<<< HEAD
|
||||
<compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="true" fteInMXComponents="false" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="true" htmlHistoryManagement="true" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="bin-debug" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" verifyDigests="true" warn="true">
|
||||
=======
|
||||
<compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="true" fteInMXComponents="false" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="false" htmlHistoryManagement="true" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="release" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" verifyDigests="true" warn="true">
|
||||
>>>>>>> upstream/master
|
||||
<compilerSourcePath/>
|
||||
<libraryPath defaultLinkType="0">
|
||||
<libraryPathEntry kind="4" path="">
|
||||
|
@ -17,6 +21,7 @@
|
|||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/spark.swc" useDefaultLinkType="false"/>
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/sparkskins.swc" useDefaultLinkType="false"/>
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/rpc.swc" useDefaultLinkType="false"/>
|
||||
<<<<<<< HEAD
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/videoPlayer.swc" useDefaultLinkType="false"/>
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/qtp_air.swc" useDefaultLinkType="false"/>
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/datavisualization.swc" useDefaultLinkType="false"/>
|
||||
|
@ -24,6 +29,15 @@
|
|||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation.swc" useDefaultLinkType="false"/>
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/flash-integration.swc" useDefaultLinkType="false"/>
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_dmv.swc" useDefaultLinkType="false"/>
|
||||
=======
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/datavisualization.swc" useDefaultLinkType="false"/>
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/qtp_air.swc" useDefaultLinkType="false"/>
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/videoPlayer.swc" useDefaultLinkType="false"/>
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/spark_dmv.swc" useDefaultLinkType="false"/>
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation.swc" useDefaultLinkType="false"/>
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_dmv.swc" useDefaultLinkType="false"/>
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/flash-integration.swc" useDefaultLinkType="false"/>
|
||||
>>>>>>> upstream/master
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_flashflexkit.swc" useDefaultLinkType="false"/>
|
||||
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_agent.swc" useDefaultLinkType="false"/>
|
||||
</excludedEntries>
|
||||
|
|
|
@ -20,10 +20,22 @@ package
|
|||
|
||||
public class srs_bwt extends Sprite
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
private var connection:NetConnection;
|
||||
|
||||
private var updatePlayProgressTimer:Timer;
|
||||
private var elapTimer:SrsElapsedTimer;
|
||||
=======
|
||||
private var connection:NetConnection = null;
|
||||
|
||||
private var updatePlayProgressTimer:Timer = null;
|
||||
private var elapTimer:SrsElapsedTimer = null;
|
||||
|
||||
// user set id.
|
||||
private var js_id:String = null;
|
||||
// play param url.
|
||||
private var user_url:String = null;
|
||||
>>>>>>> upstream/master
|
||||
|
||||
// server ip get from server
|
||||
private var server_ip:String;
|
||||
|
@ -32,8 +44,13 @@ package
|
|||
private var stop_pub:Boolean = false;
|
||||
|
||||
// js interface
|
||||
<<<<<<< HEAD
|
||||
private var js_update_progress:String;
|
||||
private var js_progress_reset:String;
|
||||
=======
|
||||
private var js_on_player_ready:String;
|
||||
private var js_update_progress:String;
|
||||
>>>>>>> upstream/master
|
||||
private var js_update_status:String;
|
||||
|
||||
private var value_progressbar:Number = 0;
|
||||
|
@ -44,10 +61,26 @@ package
|
|||
|
||||
public function srs_bwt()
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
if (!this.stage) {
|
||||
this.addEventListener(Event.ADDED_TO_STAGE, this.system_on_add_to_stage);
|
||||
} else {
|
||||
this.system_on_add_to_stage(null);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* system event callback, when this control added to stage.
|
||||
* the main function.
|
||||
*/
|
||||
private function system_on_add_to_stage(evt:Event):void {
|
||||
>>>>>>> upstream/master
|
||||
this.stage.scaleMode = StageScaleMode.NO_SCALE;
|
||||
this.stage.align = StageAlign.TOP_LEFT;
|
||||
|
||||
var flashvars:Object = this.root.loaderInfo.parameters;
|
||||
<<<<<<< HEAD
|
||||
this.js_update_progress = flashvars.update_progress;
|
||||
this.js_progress_reset = flashvars.progress_reset;
|
||||
this.js_update_status = flashvars.update_status;
|
||||
|
@ -58,11 +91,56 @@ package
|
|||
myMenu.customItems.push(new ContextMenuItem("Srs 带宽测试工具 0.1", true));
|
||||
this.contextMenu = myMenu;
|
||||
|
||||
=======
|
||||
|
||||
if (!flashvars.hasOwnProperty("id")) {
|
||||
throw new Error("must specifies the id");
|
||||
}
|
||||
|
||||
this.js_id = flashvars.id;
|
||||
this.js_on_player_ready = flashvars.on_bandwidth_ready;
|
||||
this.js_update_progress = flashvars.on_update_progress;
|
||||
this.js_update_status = flashvars.on_update_status;
|
||||
|
||||
// init context menu
|
||||
var myMenu:ContextMenu = new ContextMenu();
|
||||
myMenu.hideBuiltInItems();
|
||||
myMenu.customItems.push(new ContextMenuItem("SRS 带宽测试工具", true));
|
||||
this.contextMenu = myMenu;
|
||||
|
||||
flash.utils.setTimeout(this.system_on_js_ready, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* system callack event, when js ready, register callback for js.
|
||||
* the actual main function.
|
||||
*/
|
||||
private function system_on_js_ready():void {
|
||||
if (!flash.external.ExternalInterface.available) {
|
||||
trace("js not ready, try later.");
|
||||
flash.utils.setTimeout(this.system_on_js_ready, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
flash.external.ExternalInterface.addCallback("__check_bandwidth", this.js_call_check_bandwidth);
|
||||
flash.external.ExternalInterface.addCallback("__stop", this.js_call_stop);
|
||||
|
||||
flash.external.ExternalInterface.call(this.js_on_player_ready, this.js_id);
|
||||
}
|
||||
|
||||
private function js_call_check_bandwidth(url:String):void {
|
||||
js_call_stop();
|
||||
|
||||
>>>>>>> upstream/master
|
||||
// init connection
|
||||
connection = new NetConnection;
|
||||
connection.client = this;
|
||||
connection.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
|
||||
<<<<<<< HEAD
|
||||
connection.connect(flashvars.url);
|
||||
=======
|
||||
connection.connect(url);
|
||||
>>>>>>> upstream/master
|
||||
//connection.connect("rtmp://192.168.8.234:1935/app?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com");
|
||||
|
||||
// for play to update progress bar
|
||||
|
@ -73,10 +151,43 @@ package
|
|||
updatePlayProgressTimer.addEventListener(TimerEvent.TIMER, onTimerTimeout);
|
||||
updatePlayProgressTimer.start();
|
||||
}
|
||||
<<<<<<< HEAD
|
||||
|
||||
// get NetConnection NetStatusEvent
|
||||
public function onStatus(evt:NetStatusEvent) : void{
|
||||
trace(evt.info.code);
|
||||
=======
|
||||
private function js_call_stop():void {
|
||||
if (connection) {
|
||||
connection.close();
|
||||
connection = null;
|
||||
}
|
||||
if (updatePlayProgressTimer) {
|
||||
updatePlayProgressTimer.stop();
|
||||
updatePlayProgressTimer = null;
|
||||
}
|
||||
if (elapTimer) {
|
||||
elapTimer.restart();
|
||||
}
|
||||
}
|
||||
|
||||
// get NetConnection NetStatusEvent
|
||||
public function onStatus(evt:NetStatusEvent) : void{
|
||||
trace(evt.info.code);
|
||||
|
||||
if (evt.info.hasOwnProperty("data") && evt.info.data) {
|
||||
// for context menu
|
||||
var customItems:Array = [new ContextMenuItem("SrsPlayer")];
|
||||
if (evt.info.data.hasOwnProperty("srs_server")) {
|
||||
customItems.push(new ContextMenuItem("Server: " + evt.info.data.srs_server));
|
||||
}
|
||||
if (evt.info.data.hasOwnProperty("srs_primary_authors")) {
|
||||
customItems.push(new ContextMenuItem("PrimaryAuthors: " + evt.info.data.srs_primary_authors));
|
||||
}
|
||||
contextMenu.customItems = customItems;
|
||||
}
|
||||
|
||||
>>>>>>> upstream/master
|
||||
switch(evt.info.code){
|
||||
case "NetConnection.Connect.Failed":
|
||||
updateState("连接服务器失败!");
|
||||
|
@ -92,8 +203,18 @@ package
|
|||
//updateState("连接已断开!");
|
||||
break;
|
||||
}
|
||||
<<<<<<< HEAD
|
||||
|
||||
}
|
||||
=======
|
||||
}
|
||||
|
||||
public function onTimerTimeout(evt:TimerEvent):void
|
||||
{
|
||||
value_progressbar = elapTimer.elapsed();
|
||||
updateProgess(value_progressbar, max_progressbar);
|
||||
}
|
||||
>>>>>>> upstream/master
|
||||
|
||||
/**
|
||||
* NetConnection callback this function, when recv server call "onSrsBandCheckStartPlayBytes"
|
||||
|
@ -104,13 +225,18 @@ package
|
|||
var interval_ms:Number = evt.interval_ms;
|
||||
|
||||
connection.call("onSrsBandCheckStartingPlayBytes", null);
|
||||
<<<<<<< HEAD
|
||||
updateState("测试下行带宽(" + server_ip + ")");
|
||||
=======
|
||||
updateState("开始测试下行带宽,服务器IP:" + server_ip);
|
||||
>>>>>>> upstream/master
|
||||
|
||||
// we suppose play duration_ms = pub duration_ms
|
||||
max_progressbar = duration_ms * 2;
|
||||
}
|
||||
|
||||
public function onSrsBandCheckPlaying(evt:Object):void{
|
||||
<<<<<<< HEAD
|
||||
|
||||
}
|
||||
|
||||
|
@ -118,6 +244,8 @@ package
|
|||
{
|
||||
value_progressbar = elapTimer.elapsed();
|
||||
updateProgess(value_progressbar, max_progressbar);
|
||||
=======
|
||||
>>>>>>> upstream/master
|
||||
}
|
||||
|
||||
public function onSrsBandCheckStopPlayBytes(evt:Object):void{
|
||||
|
@ -133,6 +261,10 @@ package
|
|||
kbps = (int(kbps * 10))/10.0;
|
||||
|
||||
flash.utils.setTimeout(stopPlayTest, 0);
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
updateState("下行带宽测试完毕,服务器: " + server_ip + "," + kbps + "kbps,开始测试上行带宽。");
|
||||
>>>>>>> upstream/master
|
||||
}
|
||||
|
||||
private function stopPlayTest():void{
|
||||
|
@ -144,7 +276,10 @@ package
|
|||
var interval_ms:Number = evt.interval_ms;
|
||||
|
||||
connection.call("onSrsBandCheckStartingPublishBytes", null);
|
||||
<<<<<<< HEAD
|
||||
updateState("测试上行带宽(" + server_ip + ")");
|
||||
=======
|
||||
>>>>>>> upstream/master
|
||||
|
||||
flash.utils.setTimeout(publisher, 0);
|
||||
}
|
||||
|
@ -208,6 +343,7 @@ package
|
|||
connection.call("finalClientPacket", null);
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
public function onBWDone():void{
|
||||
// do nothing
|
||||
}
|
||||
|
@ -215,13 +351,27 @@ package
|
|||
// update progressBar's value
|
||||
private function updateProgess(value:Number, maxValue:Number):void{
|
||||
flash.external.ExternalInterface.call(this.js_update_progress, value * 100 / maxValue + "%");
|
||||
=======
|
||||
// update progressBar's value
|
||||
private function updateProgess(value:Number, maxValue:Number):void{
|
||||
flash.external.ExternalInterface.call(this.js_update_progress, this.js_id, value * 100 / maxValue);
|
||||
>>>>>>> upstream/master
|
||||
trace(value + "-" + maxValue + "-" + value * 100 / maxValue + "%");
|
||||
}
|
||||
|
||||
// update checking status
|
||||
private function updateState(text:String):void{
|
||||
<<<<<<< HEAD
|
||||
flash.external.ExternalInterface.call(this.js_update_status, text);
|
||||
trace(text);
|
||||
}
|
||||
=======
|
||||
flash.external.ExternalInterface.call(this.js_update_status, this.js_id, text);
|
||||
trace(text);
|
||||
}
|
||||
|
||||
public function onBWDone():void{
|
||||
}
|
||||
>>>>>>> upstream/master
|
||||
}
|
||||
}
|
Binary file not shown.
|
@ -305,8 +305,8 @@ package
|
|||
if (evt.info.data.hasOwnProperty("srs_server")) {
|
||||
customItems.push(new ContextMenuItem("Server: " + evt.info.data.srs_server));
|
||||
}
|
||||
if (evt.info.data.hasOwnProperty("srs_contributor")) {
|
||||
customItems.push(new ContextMenuItem("Contributor: " + evt.info.data.srs_contributor));
|
||||
if (evt.info.data.hasOwnProperty("srs_primary_authors")) {
|
||||
customItems.push(new ContextMenuItem("PrimaryAuthors: " + evt.info.data.srs_primary_authors));
|
||||
}
|
||||
contextMenu.customItems = customItems;
|
||||
}
|
||||
|
@ -334,7 +334,7 @@ package
|
|||
if (url.indexOf("http") == 0) {
|
||||
media_stream.play(url);
|
||||
} else {
|
||||
var streamName:String = url.substr(url.lastIndexOf("/"));
|
||||
var streamName:String = url.substr(url.lastIndexOf("/") + 1);
|
||||
media_stream.play(streamName);
|
||||
}
|
||||
|
||||
|
|
Binary file not shown.
|
@ -192,8 +192,8 @@ package
|
|||
if (evt.info.data.hasOwnProperty("srs_server")) {
|
||||
customItems.push(new ContextMenuItem("Server: " + evt.info.data.srs_server));
|
||||
}
|
||||
if (evt.info.data.hasOwnProperty("srs_contributor")) {
|
||||
customItems.push(new ContextMenuItem("Contributor: " + evt.info.data.srs_contributor));
|
||||
if (evt.info.data.hasOwnProperty("srs_primary_authors")) {
|
||||
customItems.push(new ContextMenuItem("PrimaryAuthors: " + evt.info.data.srs_primary_authors));
|
||||
}
|
||||
contextMenu.customItems = customItems;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -76,10 +76,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#define RTMP_SIG_SRS_URL "https://"RTMP_SIG_SRS_URL_SHORT
|
||||
#define RTMP_SIG_SRS_URL_SHORT "github.com/winlinvip/simple-rtmp-server"
|
||||
#define RTMP_SIG_SRS_WEB "http://blog.csdn.net/win_lin"
|
||||
#define RTMP_SIG_SRS_EMAIL "winterserver@126.com"
|
||||
#define RTMP_SIG_SRS_EMAIL "winlin@vip.126.com"
|
||||
#define RTMP_SIG_SRS_LICENSE "The MIT License (MIT)"
|
||||
#define RTMP_SIG_SRS_COPYRIGHT "Copyright (c) 2013 winlin"
|
||||
#define RTMP_SIG_SRS_CONTRIBUTOR "winlin,wenjiegit"
|
||||
#define RTMP_SIG_SRS_COPYRIGHT "Copyright (c) 2013-2014 winlin"
|
||||
#define RTMP_SIG_SRS_PRIMARY_AUTHROS "winlin,wenjiegit"
|
||||
|
||||
// compare
|
||||
#define srs_min(a, b) (((a) < (b))? (a) : (b))
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 wenjiegit
|
||||
Copyright (c) 2013-2014 wenjiegit
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 wenjiegit
|
||||
Copyright (c) 2013-2014 wenjiegit
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -42,11 +42,6 @@ using namespace std;
|
|||
#include <srs_core_http.hpp>
|
||||
#include <srs_core_bandwidth.hpp>
|
||||
|
||||
#define SRS_PULSE_TIMEOUT_MS 100
|
||||
#define SRS_SEND_TIMEOUT_US 5000000L
|
||||
#define SRS_RECV_TIMEOUT_US SRS_SEND_TIMEOUT_US
|
||||
#define SRS_STREAM_BUSY_SLEEP_MS 2000
|
||||
|
||||
SrsClient::SrsClient(SrsServer* srs_server, st_netfd_t client_stfd)
|
||||
: SrsConnection(srs_server, client_stfd)
|
||||
{
|
||||
|
@ -198,7 +193,7 @@ int SrsClient::service_cycle()
|
|||
srs_warn("stream %s is already publishing. ret=%d",
|
||||
req->get_stream_url().c_str(), ret);
|
||||
// to delay request
|
||||
st_usleep(SRS_STREAM_BUSY_SLEEP_MS * 1000);
|
||||
st_usleep(SRS_STREAM_BUSY_SLEEP_US);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -324,12 +319,12 @@ int SrsClient::playing(SrsSource* source)
|
|||
SrsAutoFree(SrsConsumer, consumer, false);
|
||||
srs_verbose("consumer created success.");
|
||||
|
||||
rtmp->set_recv_timeout(SRS_PULSE_TIMEOUT_MS * 1000);
|
||||
rtmp->set_recv_timeout(SRS_PULSE_TIMEOUT_US);
|
||||
|
||||
SrsPithyPrint pithy_print(SRS_STAGE_PLAY_USER);
|
||||
|
||||
while (true) {
|
||||
pithy_print.elapse(SRS_PULSE_TIMEOUT_MS);
|
||||
pithy_print.elapse(SRS_PULSE_TIMEOUT_US / 1000);
|
||||
|
||||
// switch to other st-threads.
|
||||
st_usleep(0);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -735,9 +735,9 @@ int SrsConfig::parse_argv(int& i, char** argv)
|
|||
|
||||
void SrsConfig::print_help(char** argv)
|
||||
{
|
||||
printf(RTMP_SIG_SRS_NAME" "RTMP_SIG_SRS_VERSION
|
||||
" Copyright (c) 2013 winlin\n"
|
||||
"Contributors: "RTMP_SIG_SRS_CONTRIBUTOR"\n"
|
||||
printf(
|
||||
RTMP_SIG_SRS_NAME" "RTMP_SIG_SRS_VERSION" "RTMP_SIG_SRS_COPYRIGHT"\n"
|
||||
"Primary Authors: "RTMP_SIG_SRS_PRIMARY_AUTHROS"\n"
|
||||
"Build: "SRS_BUILD_DATE" Configuration: "SRS_CONFIGURE"\n"
|
||||
"Usage: %s [-h?vV] [-c <filename>]\n"
|
||||
"\n"
|
||||
|
@ -1664,4 +1664,3 @@ bool srs_directive_equals(SrsConfDirective* a, SrsConfDirective* b)
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -57,7 +57,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
// the interval in seconds for bandwidth check
|
||||
#define SRS_CONF_DEFAULT_BANDWIDTH_LIMIT_KBPS 1000
|
||||
|
||||
#define SRS_CONF_DEFAULT_CHUNK_SIZE 4096
|
||||
// the default chunk size for system.
|
||||
#define SRS_CONF_DEFAULT_CHUNK_SIZE 60000
|
||||
|
||||
#define SRS_STAGE_PLAY_USER_INTERVAL_MS 1300
|
||||
#define SRS_STAGE_PUBLISH_USER_INTERVAL_MS 1100
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -37,11 +37,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include <srs_core_config.hpp>
|
||||
#include <srs_core_rtmp.hpp>
|
||||
#include <srs_core_pithy_print.hpp>
|
||||
#include <srs_core_protocol.hpp>
|
||||
|
||||
#ifdef SRS_FFMPEG
|
||||
|
||||
#define SRS_ENCODER_SLEEP_MS 2000
|
||||
|
||||
#define SRS_ENCODER_COPY "copy"
|
||||
#define SRS_ENCODER_VCODEC "libx264"
|
||||
#define SRS_ENCODER_ACODEC "libaacplus"
|
||||
|
@ -483,7 +482,7 @@ void SrsFFMPEG::stop()
|
|||
|
||||
SrsEncoder::SrsEncoder()
|
||||
{
|
||||
pthread = new SrsThread(this, SRS_ENCODER_SLEEP_MS);
|
||||
pthread = new SrsThread(this, SRS_ENCODER_SLEEP_US);
|
||||
pithy_print = new SrsPithyPrint(SRS_STAGE_ENCODER);
|
||||
}
|
||||
|
||||
|
@ -549,7 +548,7 @@ int SrsEncoder::cycle()
|
|||
|
||||
// pithy print
|
||||
encoder();
|
||||
pithy_print->elapse(SRS_ENCODER_SLEEP_MS);
|
||||
pithy_print->elapse(SRS_ENCODER_SLEEP_US / 1000);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -38,11 +38,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include <srs_core_source.hpp>
|
||||
#include <srs_core_autofree.hpp>
|
||||
|
||||
#define SRS_PULSE_TIMEOUT_MS 100
|
||||
#define SRS_FORWARDER_SLEEP_MS 2000
|
||||
#define SRS_SEND_TIMEOUT_US 3000000L
|
||||
#define SRS_RECV_TIMEOUT_US SRS_SEND_TIMEOUT_US
|
||||
|
||||
SrsForwarder::SrsForwarder(SrsSource* _source)
|
||||
{
|
||||
source = _source;
|
||||
|
@ -51,7 +46,7 @@ SrsForwarder::SrsForwarder(SrsSource* _source)
|
|||
stfd = NULL;
|
||||
stream_id = 0;
|
||||
|
||||
pthread = new SrsThread(this, SRS_FORWARDER_SLEEP_MS);
|
||||
pthread = new SrsThread(this, SRS_FORWARDER_SLEEP_US);
|
||||
queue = new SrsMessageQueue();
|
||||
jitter = new SrsRtmpJitter();
|
||||
}
|
||||
|
@ -286,11 +281,11 @@ int SrsForwarder::forward()
|
|||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
client->set_recv_timeout(SRS_PULSE_TIMEOUT_MS * 1000);
|
||||
client->set_recv_timeout(SRS_PULSE_TIMEOUT_US);
|
||||
|
||||
SrsPithyPrint pithy_print(SRS_STAGE_FORWARDER);
|
||||
|
||||
while (true) {
|
||||
while (pthread->can_loop()) {
|
||||
// switch to other st-threads.
|
||||
st_usleep(0);
|
||||
|
||||
|
@ -322,7 +317,7 @@ int SrsForwarder::forward()
|
|||
SrsAutoFree(SrsSharedPtrMessage*, msgs, true);
|
||||
|
||||
// pithy print
|
||||
pithy_print.elapse(SRS_PULSE_TIMEOUT_MS);
|
||||
pithy_print.elapse(SRS_PULSE_TIMEOUT_US / 1000);
|
||||
if (pithy_print.can_print()) {
|
||||
srs_trace("-> time=%"PRId64", msgs=%d, obytes=%"PRId64", ibytes=%"PRId64", okbps=%d, ikbps=%d",
|
||||
pithy_print.get_age(), count, client->get_send_bytes(), client->get_recv_bytes(), client->get_send_kbps(), client->get_recv_kbps());
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -36,6 +36,37 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include <srs_core_log.hpp>
|
||||
#include <srs_core_error.hpp>
|
||||
|
||||
// the following is the timeout for rtmp protocol,
|
||||
// to avoid death connection.
|
||||
|
||||
// when got a messae header, there must be some data,
|
||||
// increase recv timeout to got an entire message.
|
||||
#define SRS_MIN_RECV_TIMEOUT_US 60*1000*1000L
|
||||
|
||||
// the timeout to wait for client control message,
|
||||
// if timeout, we generally ignore and send the data to client,
|
||||
// generally, it's the pulse time for data seding.
|
||||
#define SRS_PULSE_TIMEOUT_US 200*1000L
|
||||
|
||||
// the timeout to wait client data,
|
||||
// if timeout, close the connection.
|
||||
#define SRS_SEND_TIMEOUT_US 30*1000*1000L
|
||||
|
||||
// the timeout to send data to client,
|
||||
// if timeout, close the connection.
|
||||
#define SRS_RECV_TIMEOUT_US 30*1000*1000L
|
||||
|
||||
// when stream is busy, for example, streaming is already
|
||||
// publishing, when a new client to request to publish,
|
||||
// sleep a while and close the connection.
|
||||
#define SRS_STREAM_BUSY_SLEEP_US 3*1000*1000L
|
||||
|
||||
// when error, forwarder sleep for a while and retry.
|
||||
#define SRS_FORWARDER_SLEEP_US 3*1000*1000L
|
||||
|
||||
// when error, encoder sleep for a while and retry.
|
||||
#define SRS_ENCODER_SLEEP_US 3*1000*1000L
|
||||
|
||||
class SrsSocket;
|
||||
class SrsBuffer;
|
||||
class SrsPacket;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -391,12 +391,44 @@ int SrsRtmpClient::play(string stream, int stream_id)
|
|||
}
|
||||
}
|
||||
|
||||
// SetChunkSize
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket();
|
||||
|
||||
pkt->chunk_size = SRS_CONF_DEFAULT_CHUNK_SIZE;
|
||||
msg->set_packet(pkt, 0);
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
srs_error("send set chunk size failed. "
|
||||
"stream=%s, chunk_size=%d, ret=%d",
|
||||
stream.c_str(), SRS_CONF_DEFAULT_CHUNK_SIZE, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int SrsRtmpClient::publish(string stream, int stream_id)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
// SetChunkSize
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket();
|
||||
|
||||
pkt->chunk_size = SRS_CONF_DEFAULT_CHUNK_SIZE;
|
||||
msg->set_packet(pkt, 0);
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
srs_error("send set chunk size failed. "
|
||||
"stream=%s, chunk_size=%d, ret=%d",
|
||||
stream.c_str(), SRS_CONF_DEFAULT_CHUNK_SIZE, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
// publish(stream)
|
||||
if (true) {
|
||||
|
@ -617,7 +649,7 @@ int SrsRtmp::response_connect_app(SrsRequest *req, const char* server_ip)
|
|||
data->set("srs_site", new SrsAmf0String(RTMP_SIG_SRS_WEB));
|
||||
data->set("srs_email", new SrsAmf0String(RTMP_SIG_SRS_EMAIL));
|
||||
data->set("srs_copyright", new SrsAmf0String(RTMP_SIG_SRS_COPYRIGHT));
|
||||
data->set("srs_contributor", new SrsAmf0String(RTMP_SIG_SRS_CONTRIBUTOR));
|
||||
data->set("srs_primary_authors", new SrsAmf0String(RTMP_SIG_SRS_PRIMARY_AUTHROS));
|
||||
|
||||
if (server_ip) {
|
||||
data->set("srs_server_ip", new SrsAmf0String(server_ip));
|
||||
|
@ -1194,4 +1226,3 @@ int SrsRtmp::identify_flash_publish_client(SrsPublishPacket* req, SrsClientType&
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -110,7 +110,7 @@ enum SrsClientType
|
|||
*/
|
||||
class SrsRtmpClient
|
||||
{
|
||||
private:
|
||||
protected:
|
||||
SrsProtocol* protocol;
|
||||
st_netfd_t stfd;
|
||||
public:
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -35,7 +35,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include <srs_core_client.hpp>
|
||||
#include <srs_core_config.hpp>
|
||||
|
||||
#define SERVER_LISTEN_BACKLOG 10
|
||||
#define SERVER_LISTEN_BACKLOG 512
|
||||
#define SRS_TIME_RESOLUTION_MS 500
|
||||
|
||||
SrsListener::SrsListener(SrsServer* _server, SrsListenerType _type)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -642,7 +642,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
|
|||
metadata->metadata->set("server", new SrsAmf0String(
|
||||
RTMP_SIG_SRS_KEY" "RTMP_SIG_SRS_VERSION" ("RTMP_SIG_SRS_URL_SHORT")"));
|
||||
metadata->metadata->set("contributor",
|
||||
new SrsAmf0String(RTMP_SIG_SRS_CONTRIBUTOR));
|
||||
new SrsAmf0String(RTMP_SIG_SRS_PRIMARY_AUTHROS));
|
||||
|
||||
SrsAmf0Any* prop = NULL;
|
||||
if ((prop = metadata->metadata->get_property("audiosamplerate")) != NULL) {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -54,10 +54,10 @@ void ISrsThreadHandler::on_leave_loop()
|
|||
{
|
||||
}
|
||||
|
||||
SrsThread::SrsThread(ISrsThreadHandler* thread_handler, int64_t interval_ms)
|
||||
SrsThread::SrsThread(ISrsThreadHandler* thread_handler, int64_t interval_us)
|
||||
{
|
||||
handler = thread_handler;
|
||||
cycle_interval_milliseconds = interval_ms;
|
||||
cycle_interval_us = interval_us;
|
||||
|
||||
tid = NULL;
|
||||
loop = false;
|
||||
|
@ -102,6 +102,11 @@ void SrsThread::stop()
|
|||
}
|
||||
}
|
||||
|
||||
bool SrsThread::can_loop()
|
||||
{
|
||||
return loop;
|
||||
}
|
||||
|
||||
void SrsThread::thread_cycle()
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
@ -138,7 +143,7 @@ failed:
|
|||
break;
|
||||
}
|
||||
|
||||
st_usleep(cycle_interval_milliseconds * 1000);
|
||||
st_usleep(cycle_interval_us);
|
||||
}
|
||||
|
||||
handler->on_leave_loop();
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
@ -43,6 +43,23 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
* when stop, the thread will interrupt the st_thread,
|
||||
* which will cause the socket to return error and
|
||||
* terminate the cycle thread.
|
||||
*
|
||||
* when thread interrupt, the socket maybe not got EINT,
|
||||
* espectially on st_usleep(), so the cycle must check the loop,
|
||||
* when handler->cycle() has loop itself, for example:
|
||||
* handler->cycle() is:
|
||||
* while (true):
|
||||
* st_usleep(0);
|
||||
* if (read_from_socket(skt) < 0) break;
|
||||
* if thread stop when read_from_socket, it's ok, the loop will break,
|
||||
* but when thread stop interrupt the s_usleep(0), then the loop is
|
||||
* death loop.
|
||||
* in a word, the handler->cycle() must:
|
||||
* handler->cycle() is:
|
||||
* while (pthread->can_loop()):
|
||||
* st_usleep(0);
|
||||
* if (read_from_socket(skt) < 0) break;
|
||||
* check the loop, then it works.
|
||||
*/
|
||||
class ISrsThreadHandler
|
||||
{
|
||||
|
@ -68,14 +85,14 @@ private:
|
|||
bool loop;
|
||||
private:
|
||||
ISrsThreadHandler* handler;
|
||||
int64_t cycle_interval_milliseconds;
|
||||
int64_t cycle_interval_us;
|
||||
public:
|
||||
/**
|
||||
* initialize the thread.
|
||||
* @param thread_handler, the cycle handler for the thread.
|
||||
* @param interval_ms, the sleep interval when cycle finished.
|
||||
* @param interval_us, the sleep interval when cycle finished.
|
||||
*/
|
||||
SrsThread(ISrsThreadHandler* thread_handler, int64_t interval_ms);
|
||||
SrsThread(ISrsThreadHandler* thread_handler, int64_t interval_us);
|
||||
virtual ~SrsThread();
|
||||
public:
|
||||
/**
|
||||
|
@ -90,6 +107,12 @@ public:
|
|||
* @remark user can stop multiple times, ignore if already stopped.
|
||||
*/
|
||||
virtual void stop();
|
||||
/**
|
||||
* whether the thread should loop,
|
||||
* used for handler->cycle() which has a loop method,
|
||||
* to check this method, break if false.
|
||||
*/
|
||||
virtual bool can_loop();
|
||||
private:
|
||||
virtual void thread_cycle();
|
||||
static void* thread_fun(void* arg);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 winlin
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
file
|
||||
main readonly separator,
|
||||
..\main\srs_main_server.cpp,
|
||||
..\main\srs_main_bandcheck.cpp,
|
||||
auto readonly separator,
|
||||
..\..\objs\srs_auto_headers.hpp,
|
||||
core readonly separator,
|
||||
|
@ -57,7 +58,7 @@ file
|
|||
..\core\srs_core_source.hpp,
|
||||
..\core\srs_core_source.cpp,
|
||||
research readonly separator,
|
||||
..\..\research\ts_info.cc;
|
||||
..\..\research\hls\ts_info.cc;
|
||||
|
||||
mainconfig
|
||||
"" = "MAIN";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue