Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
胡斌
/
srs
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
winlin
2014-07-12 20:48:03 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
c319cc6a40cc07abbe0dc50d2af92c194a0b5648
c319cc6a
1 parent
b1dd0218
refine bandwidth test client, provides js and as library
显示空白字符变更
内嵌
并排对比
正在显示
12 个修改的文件
包含
699 行增加
和
335 行删除
trunk/research/players/js/srs.bandwidth.js
trunk/research/players/srs_bwt.html
trunk/research/players/srs_bwt/release/srs_bwt.swf
trunk/research/players/srs_bwt/src/SrsClass/SrsElapsedTimer.as
trunk/research/players/srs_bwt/src/SrsClass/SrsSettings.as
trunk/research/players/srs_bwt/src/srs/SrsBandwidth.as
trunk/research/players/srs_bwt/src/srs_bwt.as
trunk/src/app/srs_app_bandwidth.cpp
trunk/src/app/srs_app_bandwidth.hpp
trunk/src/app/srs_app_conn.cpp
trunk/src/rtmp/srs_protocol_stack.cpp
trunk/src/rtmp/srs_protocol_stack.hpp
trunk/research/players/js/srs.bandwidth.js
查看文件 @
c319cc6
...
...
@@ -27,6 +27,8 @@ function SrsBandwidth(container, width, height, private_object) {
// the callback set data.
this
.
percent
=
0
;
this
.
status
=
""
;
this
.
report
=
""
;
this
.
server
=
""
;
}
/**
* user can set some callback, then start the bandwidth.
...
...
@@ -38,7 +40,7 @@ function SrsBandwidth(container, width, height, private_object) {
* on_update_status(status:String):void, when srs bandwidth update the status.
* status:String the human readable status text.
*/
SrsBandwidth
.
prototype
.
start
=
function
(
url
)
{
SrsBandwidth
.
prototype
.
render
=
function
(
url
)
{
if
(
url
)
{
this
.
stream_url
=
url
;
}
...
...
@@ -49,6 +51,8 @@ SrsBandwidth.prototype.start = function(url) {
flashvars
.
on_bandwidth_ready
=
"__srs_on_bandwidth_ready"
;
flashvars
.
on_update_progress
=
"__srs_on_update_progress"
;
flashvars
.
on_update_status
=
"__srs_on_update_status"
;
flashvars
.
on_srs_info
=
"__srs_on_srs_info"
;
flashvars
.
on_complete
=
"__srs_on_complete"
;
var
params
=
{};
params
.
wmode
=
"opaque"
;
...
...
@@ -75,7 +79,6 @@ SrsBandwidth.prototype.start = function(url) {
/**
* 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
();
...
...
@@ -107,6 +110,10 @@ SrsBandwidth.prototype.on_update_progress = function(percent) {
}
SrsBandwidth
.
prototype
.
on_update_status
=
function
(
status
)
{
}
SrsBandwidth
.
prototype
.
on_srs_info
=
function
(
srs_server
,
srs_primary_authors
,
srs_id
,
srs_pid
,
srs_server_ip
)
{
}
SrsBandwidth
.
prototype
.
on_complete
=
function
(
start_time
,
end_time
,
play_kbps
,
publish_kbps
,
play_bytes
,
publish_bytes
,
play_time
,
publish_time
)
{
}
function
__srs_find_bandwidth
(
id
)
{
for
(
var
i
=
0
;
i
<
SrsBandwidth
.
__bandwidths
.
length
;
i
++
)
{
var
bandwidth
=
SrsBandwidth
.
__bandwidths
[
i
];
...
...
@@ -129,8 +136,52 @@ function __srs_on_update_progress(id, percent) {
bandwidth
.
percent
=
percent
;
bandwidth
.
on_update_progress
(
percent
);
}
function
__srs_on_update_status
(
id
,
status
)
{
function
__srs_on_update_status
(
id
,
code
,
data
)
{
var
bandwidth
=
__srs_find_bandwidth
(
id
);
var
status
=
""
;
switch
(
code
){
case
"NetConnection.Connect.Failed"
:
status
=
"连接服务器失败!"
;
break
;
case
"NetConnection.Connect.Rejected"
:
status
=
"服务器拒绝连接!"
;
break
;
case
"NetConnection.Connect.Success"
:
status
=
"连接服务器成功!"
;
break
;
case
"NetConnection.Connect.Closed"
:
if
(
bandwidth
.
report
)
{
return
;
}
status
=
"连接已断开!"
;
break
;
case
"srs.bwtc.play.start"
:
status
=
"开始测试下行带宽"
;
break
;
case
"srs.bwtc.play.stop"
:
status
=
"下行带宽测试完毕,"
+
data
+
"kbps,开始测试上行带宽。"
;
break
;
default
:
return
;
}
bandwidth
.
status
=
status
;
bandwidth
.
on_update_status
(
status
);
}
function
__srs_on_srs_info
(
id
,
srs_server
,
srs_primary_authors
,
srs_id
,
srs_pid
,
srs_server_ip
)
{
var
bandwidth
=
__srs_find_bandwidth
(
id
);
bandwidth
.
status
=
status
;
bandwidth
.
server
=
srs_server_ip
;
bandwidth
.
on_srs_info
(
srs_server
,
srs_primary_authors
,
srs_id
,
srs_pid
,
srs_server_ip
);
}
function
__srs_on_complete
(
id
,
start_time
,
end_time
,
play_kbps
,
publish_kbps
,
play_bytes
,
publish_bytes
,
play_time
,
publish_time
)
{
var
bandwidth
=
__srs_find_bandwidth
(
id
);
var
status
=
"检测结束: "
+
bandwidth
.
server
+
" 上行: "
+
publish_kbps
+
" kbps"
+
" 下行: "
+
play_kbps
+
" kbps"
+
" 测试时间: "
+
Number
((
end_time
-
start_time
)
/
1000
).
toFixed
(
1
)
+
" 秒"
;
bandwidth
.
report
=
status
;
bandwidth
.
on_update_status
(
status
);
bandwidth
.
on_complete
(
start_time
,
end_time
,
play_kbps
,
publish_kbps
,
play_bytes
,
publish_bytes
,
play_time
,
publish_time
);
}
\ No newline at end of file
...
...
trunk/research/players/srs_bwt.html
查看文件 @
c319cc6
...
...
@@ -35,6 +35,7 @@
function
on_click_play
()
{
$
(
"#check_status"
).
text
(
""
);
$
(
"#check_info"
).
text
(
""
);
$
(
"#progress_bar"
).
width
(
"0%"
);
$
(
"#main_modal"
).
modal
({
show
:
true
,
keyboard
:
false
});
}
...
...
@@ -61,7 +62,13 @@
bandwidth
.
on_update_status
=
function
(
status
)
{
$
(
"#check_status"
).
text
(
status
);
}
bandwidth
.
start
(
url
);
bandwidth
.
on_srs_info
=
function
(
srs_server
,
srs_primary_authors
,
srs_id
,
srs_pid
,
srs_server_ip
)
{
$
(
"#check_info"
).
text
(
"server:"
+
srs_server
+
", authors:"
+
srs_primary_authors
+
", srs_id:"
+
srs_id
+
", srs_pid:"
+
srs_pid
+
", ip:"
+
srs_server_ip
);
}
bandwidth
.
render
(
url
);
}
function
on_stop_bandwidth_test
()
{
bandwidth
.
stop
();
...
...
@@ -112,7 +119,8 @@
</div>
<div
class=
"span1"
></div>
</div>
<span
id=
"check_status"
>
status
</span>
<div
id=
"check_status"
>
status
</div>
<div
id=
"check_info"
>
info
</div>
</div>
<div
class=
"modal-footer"
>
<button
class=
"btn btn-primary"
data-dismiss=
"modal"
aria-hidden=
"true"
>
关闭
</button>
...
...
trunk/research/players/srs_bwt/release/srs_bwt.swf
查看文件 @
c319cc6
不能预览此文件类型
trunk/research/players/srs_bwt/src/SrsClass/SrsElapsedTimer.as
已删除
100755 → 0
查看文件 @
b1dd021
package
SrsClass
{
import
flash
.
system
.
System
;
public
class
SrsElapsedTimer
{
private
var
beginDate
:
Date
;
public
function
SrsElapsedTimer
()
{
beginDate
=
new
Date
;
}
public
function
elapsed
()
:
Number
{
var
endDate
:
Date
=
new
Date
;
// get deiff by ms
return
(
endDate
.
time
-
beginDate
.
time
)
;
}
public
function
restart
()
:
void
{
beginDate
=
new
Date
;
}
}
}
\ No newline at end of file
trunk/research/players/srs_bwt/src/SrsClass/SrsSettings.as
已删除
100755 → 0
查看文件 @
b1dd021
package
SrsClass
{
import
flash
.
net
.
SharedObject
;
public
class
SrsSettings
{
private
var
settings
:
SharedObject
;
private
var
key
:
String
=
"SrsBandCheck"
;
public
function
SrsSettings
()
{
settings
=
SharedObject
.
getLocal
(
key
)
;
}
public
function
addAddressText
(
val
:
String
)
:
void
{
settings
.
data
.
address_text
=
val
;
}
public
function
addressText
()
:
String
{
return
settings
.
data
.
address_text
;
}
static
public
function
instance
()
:
SrsSettings
{
return
new
SrsSettings
;
}
}
}
\ No newline at end of file
trunk/research/players/srs_bwt/src/srs/SrsBandwidth.as
0 → 100755
查看文件 @
c319cc6
package
srs
{
import
flash
.
events
.
NetStatusEvent
;
import
flash
.
external
.
ExternalInterface
;
import
flash
.
net
.
NetConnection
;
import
flash
.
net
.
ObjectEncoding
;
import
flash
.
utils
.
clearTimeout
;
import
flash
.
utils
.
setTimeout
;
/**
* SRS bandwidth check/test library,
* user can copy this file and use it directly,
* this library will export as callback functions, and js callback functions.
*
* Usage:
* var bandwidth:SrsBandwidth = new SrsBandwidth();
* bandwidth.initialize(......); // required
* bandwidth.check_bandwidth(......); // required
* bandwidth.stop(); // optional
*
* @remark we donot use event, but use callback functions set by initialize.
*/
public
class
SrsBandwidth
{
/**
* server notice client to do the downloading/play bandwidth test.
*/
public
static
const
StatusSrsBwtcPlayStart
:
String
=
"srs.bwtc.play.start"
;
/**
* server notice client to complete the downloading/play bandwidth test.
*/
public
static
const
StatusSrsBwtcPlayStop
:
String
=
"srs.bwtc.play.stop"
;
/**
* server notice client to do the uploading/publish bandwidth test.
*/
public
static
const
StatusSrsBwtcPublishStart
:
String
=
"srs.bwtc.publish.start"
;
/**
* server notice client to complete the uploading/publish bandwidth test.
*/
public
static
const
StatusSrsBwtcPublishStop
:
String
=
"srs.bwtc.publish.stop"
;
/**
* constructor, do nothing
*/
public
function
SrsBandwidth
()
{
}
/**
* initialize the bandwidth test tool, the callbacks. null to ignore.
*
* the as callbacks.
* @param as_on_ready, function():void, callback when bandwidth tool is ready to run.
* @param as_on_status_change, function(code:String, data:String):void, where:
* code can be:
* "NetConnection.Connect.Failed", see NetStatusEvent(evt.info.code).
* "NetConnection.Connect.Rejected", see NetStatusEvent(evt.info.code).
* "NetConnection.Connect.Success", see NetStatusEvent(evt.info.code).
* "NetConnection.Connect.Closed", see NetStatusEvent(evt.info.code).
* SrsBandwidth.StatusSrsBwtcPlayStart, "srs.bwtc.play.start", when srs start test play bandwidth.
* SrsBandwidth.StatusSrsBwtcPlayStop, "srs.bwtc.play.stop", when srs complete test play bandwidth.
* SrsBandwidth.StatusSrsBwtcPublishStart, "srs.bwtc.publish.start", when srs start test publish bandwidth.
* SrsBandwidth.StatusSrsBwtcPublishStop, "srs.bwtc.publish.stop", when srs complete test publish bandwidth.
* data is extra parameter:
* kbps, for code is SrsBandwidth.StatusSrsBwtcPlayStop or SrsBandwidth.StatusSrsBwtcPublishStop.
* "", otherwise empty string.
* @param as_on_progress_change, function(percent:Number):void, where:
* percent, the progress percent, 0 means 0%, 100 means 100%.
* @param as_on_srs_info, function(srs_server:String, srs_primary_authors:String, srs_id:String, srs_pid:String, srs_server_ip:String):void, where:
* srs_server: the srs server info.
* srs_primary_authors: the srs version info.
* srs_id: the tracable log id, to direclty grep the log..
* srs_pid: the srs process id, to direclty grep the log.
* srs_server_ip: the srs server ip, where client connected at.
* @param as_on_complete, function(start_time:Number, end_time:Number, play_kbps:Number, publish_kbps:Number, play_bytes:Number, publish_bytes:Number, play_time:Number, publish_time:Number):void, where
* start_time, the start timestamp, in ms.
* end_time, the finish timestamp, in ms.
* play_kbps, the play/downloading kbps.
* publish_kbps, the publish/uploading kbps.
* play_bytes, the bytes play/download from server, in bytes.
* publish_bytes, the bytes publish/upload to server, in bytes.
* play_time, the play/download duration time, in ms.
* publish_time, the publish/upload duration time, in ms.
*
* the js callback id.
* @param js_id, specifies the id of swfobject, used to identify the bandwidth object.
* for all js callback, the first param always be the js_id, to identify the callback object.
*
* the js callbacks.
* @param js_on_ready, function(js_id:String):void, callback when bandwidth tool is ready to run.
* @param js_on_status_change, function(js_id:String, code:String, data:String):void
* @param as_on_progress_change, function(js_id:String, percent:Number):void
* @param as_on_srs_info, function(js_id:String, srs_server:String, srs_primary_authors:String, srs_id:String, srs_pid:String, srs_server_ip:String):void
* @param as_on_complete, function(js_id:String, start_time:Number, end_time:Number, play_kbps:Number, publish_kbps:Number, play_bytes:Number, publish_bytes:Number, play_time:Number, publish_time:Number):void
*
* the js export functions.
* @param js_export_check_bandwidth, function(url:String):void, for js to start bandwidth check, @see: check_bandwidth(url:String):void
* @param js_export_stop, function():void, for js to stop bandwidth check, @see: stop():void
*
* @remark, all parameters can be null.
* @remark, as and js callback use same parameter, except that the js calblack first parameter is js_id:String.
*/
public
function
initialize
(
as_on_ready
:
Function
,
as_on_status_change
:
Function
,
as_on_progress_change
:
Function
,
as_on_srs_info
:
Function
,
as_on_complete
:
Function
,
js_id
:
String
,
js_on_ready
:
String
,
js_on_status_change
:
String
,
js_on_progress_change
:
String
,
js_on_srs_info
:
String
,
js_on_complete
:
String
,
js_export_check_bandwidth
:
String
,
js_export_stop
:
String
)
:
void
{
this
.
as_on_ready
=
as_on_ready
;
this
.
as_on_srs_info
=
as_on_srs_info
;
this
.
as_on_status_change
=
as_on_status_change
;
this
.
as_on_progress_change
=
as_on_progress_change
;
this
.
as_on_complete
=
as_on_complete
;
this
.
js_id
=
js_id
;
this
.
js_on_srs_info
=
js_on_srs_info
;
this
.
js_on_ready
=
js_on_ready
;
this
.
js_on_status_change
=
js_on_status_change
;
this
.
js_on_progress_change
=
js_on_progress_change
;
this
.
js_on_complete
=
js_on_complete
;
this
.
js_export_check_bandwidth
=
js_export_check_bandwidth
;
this
.
js_export_stop
=
js_export_stop
;
flash
.
utils
.
setTimeout
(
this
.
system_on_js_ready
,
0
)
;
}
/**
* start check bandwidth.
* @param url, a String indicates the url to check bandwidth,
* format as: rtmp://server:port/app?key=xxx&&vhost=xxx
* for example, rtmp://dev:1935/app?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com
* where the key and vhost must be config in SRS, like:
* vhost bandcheck.srs.com {
* enabled on;
* chunk_size 65000;
* bandcheck {
* enabled on;
* key "35c9b402c12a7246868752e2878f7e0e";
* interval 30;
* limit_kbps 4000;
* }
* }
*
* @remark user must invoke this as method, or js exported method.
*/
public
function
check_bandwidth
(
url
:
String
)
:
void
{
this
.
js_call_check_bandwidth
(
url
)
;
}
/**
* stop check bancwidth.
* @remark it's optional, however, user can abort the bandwidth check.
*/
public
function
stop
()
:
void
{
this
.
js_call_stop
()
;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////// ///////////////////////////////
////////////////////////// ///////////////////////////////
////////////////////////// ///////////////////////////////
////////////////////////// ///////////////////////////////
////////////////////////// Private Section, ignore please. ///////////////////////////////
////////////////////////// ///////////////////////////////
////////////////////////// ///////////////////////////////
////////////////////////// ///////////////////////////////
////////////////////////// ///////////////////////////////
////////////////////////// ///////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* ***********************************************************************
* private section, including private fields, method and embeded classes.
* ***********************************************************************
*/
/**
* as callback.
*/
private
var
as_on_ready
:
Function
;
private
var
as_on_srs_info
:
Function
;
private
var
as_on_status_change
:
Function
;
private
var
as_on_progress_change
:
Function
;
private
var
as_on_complete
:
Function
;
/**
* js callback.
*/
private
var
js_id
:
String
;
private
var
js_on_ready
:
String
;
private
var
js_on_srs_info
:
String
;
private
var
js_on_status_change
:
String
;
private
var
js_on_progress_change
:
String
;
private
var
js_on_complete
:
String
;
/**
* js export functions.
*/
private
var
js_export_check_bandwidth
:
String
;
private
var
js_export_stop
:
String
;
/**
* srs debug infos
*/
private
var
srs_server
:
String
=
null
;
private
var
srs_primary_authors
:
String
=
null
;
private
var
srs_id
:
String
=
null
;
private
var
srs_pid
:
String
=
null
;
private
var
srs_server_ip
:
String
=
null
;
/**
* the underlayer connection, to send call message to do the bandwidth
* check/test with server.
*/
private
var
connection
:
NetConnection
=
null
;
/**
* use timeout to sendout publish call packets.
* when got stop publish packet from server, stop publish call loop.
*/
private
var
publish_timeout_handler
:
uint
=
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
;
}
if
(
this
.
js_export_check_bandwidth
!=
null
)
{
flash
.
external
.
ExternalInterface
.
addCallback
(
this
.
js_export_check_bandwidth
,
this
.
js_call_check_bandwidth
)
;
}
if
(
this
.
js_export_stop
!=
null
)
{
flash
.
external
.
ExternalInterface
.
addCallback
(
this
.
js_export_stop
,
this
.
js_call_stop
)
;
}
if
(
as_on_ready
!=
null
)
{
as_on_ready
()
;
}
if
(
js_on_ready
!=
null
)
{
flash
.
external
.
ExternalInterface
.
call
(
this
.
js_on_ready
,
this
.
js_id
)
;
}
}
private
function
js_call_check_bandwidth
(
url
:
String
)
:
void
{
js_call_stop
()
;
__on_progress_change
(
0
)
;
// init connection
connection
=
new
NetConnection
;
connection
.
objectEncoding
=
ObjectEncoding
.
AMF0
;
connection
.
client
=
{
onStatus
:
onStatus
,
// play
onSrsBandCheckStartPlayBytes
:
onSrsBandCheckStartPlayBytes
,
onSrsBandCheckPlaying
:
onSrsBandCheckPlaying
,
onSrsBandCheckStopPlayBytes
:
onSrsBandCheckStopPlayBytes
,
// publish
onSrsBandCheckStartPublishBytes
:
onSrsBandCheckStartPublishBytes
,
onSrsBandCheckStopPublishBytes
:
onSrsBandCheckStopPublishBytes
,
onSrsBandCheckFinished
:
onSrsBandCheckFinished
}
;
connection
.
addEventListener
(
NetStatusEvent
.
NET_STATUS
,
onStatus
)
;
connection
.
connect
(
url
)
;
__on_progress_change
(
3
)
;
}
private
function
js_call_stop
()
:
void
{
if
(
connection
)
{
connection
.
close
()
;
connection
=
null
;
}
}
/**
* NetConnection callback this function, when recv server call "onSrsBandCheckStartPlayBytes"
* then start @updatePlayProgressTimer for updating the progressbar
* */
private
function
onSrsBandCheckStartPlayBytes
(
evt
:
Object
)
:
void
{
var
duration_ms
:
Number
=
evt
.
duration_ms
;
var
interval_ms
:
Number
=
evt
.
interval_ms
;
trace
(
"start play test, duration="
+
duration_ms
+
", interval="
+
interval_ms
)
;
connection
.
call
(
"onSrsBandCheckStartingPlayBytes"
,
null
)
;
__on_status_change
(
SrsBandwidth
.
StatusSrsBwtcPlayStart
)
;
__on_progress_change
(
10
)
;
}
private
function
onSrsBandCheckPlaying
(
evt
:
Object
)
:
void
{
}
private
function
onSrsBandCheckStopPlayBytes
(
evt
:
Object
)
:
void
{
var
duration_ms
:
Number
=
evt
.
duration_ms
;
var
interval_ms
:
Number
=
evt
.
interval_ms
;
var
duration_delta
:
Number
=
evt
.
duration_delta
;
var
bytes_delta
:
Number
=
evt
.
bytes_delta
;
var
kbps
:
Number
=
0
;
if
(
duration_delta
>
0
){
kbps
=
bytes_delta
*
8
.
0
/
duration_delta
;
// b/ms == kbps
}
kbps
=
(
int
(
kbps
*
10
))
/
10
.
0
;
flash
.
utils
.
setTimeout
(
stopPlayTest
,
0
)
;
__on_status_change
(
SrsBandwidth
.
StatusSrsBwtcPlayStop
,
String
(
kbps
))
;
__on_progress_change
(
40
)
;
}
private
function
stopPlayTest
()
:
void
{
connection
.
call
(
"onSrsBandCheckStoppedPlayBytes"
,
null
)
;
}
/**
* publishing methods.
*/
private
function
onSrsBandCheckStartPublishBytes
(
evt
:
Object
)
:
void
{
var
duration_ms
:
Number
=
evt
.
duration_ms
;
var
interval_ms
:
Number
=
evt
.
interval_ms
;
connection
.
call
(
"onSrsBandCheckStartingPublishBytes"
,
null
)
;
flash
.
utils
.
setTimeout
(
publisher
,
0
)
;
__on_status_change
(
SrsBandwidth
.
StatusSrsBwtcPublishStart
)
;
__on_progress_change
(
60
)
;
}
private
function
publisher
()
:
void
{
var
data
:
Array
=
new
Array
()
;
var
data_size
:
int
=
100
;
for
(
var
i
:
int
;
i
<
data_size
;
i
++
)
{
data
.
push
(
"SrS band check data from client's publishing......"
)
;
}
connection
.
call
(
"onSrsBandCheckPublishing"
,
null
,
data
)
;
publish_timeout_handler
=
flash
.
utils
.
setTimeout
(
publisher
,
0
)
;
}
private
function
onSrsBandCheckStopPublishBytes
(
evt
:
Object
)
:
void
{
var
duration_ms
:
Number
=
evt
.
duration_ms
;
var
interval_ms
:
Number
=
evt
.
interval_ms
;
var
duration_delta
:
Number
=
evt
.
duration_delta
;
var
bytes_delta
:
Number
=
evt
.
bytes_delta
;
var
kbps
:
Number
=
0
;
if
(
duration_delta
>
0
){
kbps
=
bytes_delta
*
8
.
0
/
duration_delta
;
// b/ms == kbps
}
kbps
=
(
int
(
kbps
*
10
))
/
10
.
0
;
stopPublishTest
()
;
__on_progress_change
(
90
)
;
}
private
function
stopPublishTest
()
:
void
{
// the stop publish response packet can not send out, for the queue is full.
//connection.call("onSrsBandCheckStoppedPublishBytes", null);
// clear the timeout to stop the send loop.
if
(
publish_timeout_handler
>
0
)
{
flash
.
utils
.
clearTimeout
(
publish_timeout_handler
)
;
publish_timeout_handler
=
0
;
}
}
private
function
onSrsBandCheckFinished
(
evt
:
Object
)
:
void
{
var
code
:
Number
=
evt
.
code
;
var
start_time
:
Number
=
evt
.
start_time
;
var
end_time
:
Number
=
evt
.
end_time
;
var
play_kbps
:
Number
=
evt
.
play_kbps
;
var
publish_kbps
:
Number
=
evt
.
publish_kbps
;
var
play_bytes
:
Number
=
evt
.
play_bytes
;
var
play_time
:
Number
=
evt
.
play_time
;
var
publish_bytes
:
Number
=
evt
.
publish_bytes
;
var
publish_time
:
Number
=
evt
.
publish_time
;
if
(
this
.
as_on_complete
!=
null
)
{
this
.
as_on_complete
(
start_time
,
end_time
,
play_kbps
,
publish_kbps
,
play_bytes
,
publish_bytes
,
play_time
,
publish_time
)
;
}
if
(
this
.
js_on_complete
!=
null
)
{
flash
.
external
.
ExternalInterface
.
call
(
this
.
js_on_complete
,
this
.
js_id
,
start_time
,
end_time
,
play_kbps
,
publish_kbps
,
play_bytes
,
publish_bytes
,
play_time
,
publish_time
)
;
}
__on_progress_change
(
100
)
;
// when got finish packet, directly close connection.
js_call_stop
()
;
// the last final packet can not send out, for the queue is full.
//connection.call("finalClientPacket", null);
}
/**
* get NetConnection NetStatusEvent
*/
private
function
onStatus
(
evt
:
NetStatusEvent
)
:
void
{
trace
(
evt
.
info
.
code
)
;
if
(
evt
.
info
.
hasOwnProperty
(
"data"
)
&&
evt
.
info
.
data
)
{
if
(
evt
.
info
.
data
.
hasOwnProperty
(
"srs_server"
))
{
srs_server
=
evt
.
info
.
data
.
srs_server
;
}
if
(
evt
.
info
.
data
.
hasOwnProperty
(
"srs_primary_authors"
))
{
srs_primary_authors
=
evt
.
info
.
data
.
srs_primary_authors
;
}
if
(
evt
.
info
.
data
.
hasOwnProperty
(
"srs_id"
))
{
srs_id
=
evt
.
info
.
data
.
srs_id
;
}
if
(
evt
.
info
.
data
.
hasOwnProperty
(
"srs_pid"
))
{
srs_pid
=
evt
.
info
.
data
.
srs_pid
;
}
if
(
evt
.
info
.
data
.
hasOwnProperty
(
"srs_server_ip"
))
{
srs_server_ip
=
evt
.
info
.
data
.
srs_server_ip
;
}
if
(
this
.
as_on_srs_info
!=
null
)
{
this
.
as_on_srs_info
(
srs_server
,
srs_primary_authors
,
srs_id
,
srs_pid
,
srs_server_ip
)
;
}
if
(
this
.
js_on_srs_info
!=
null
)
{
flash
.
external
.
ExternalInterface
.
call
(
this
.
js_on_srs_info
,
this
.
js_id
,
srs_server
,
srs_primary_authors
,
srs_id
,
srs_pid
,
srs_server_ip
)
;
}
}
if
(
evt
.
info
.
code
)
{
__on_status_change
(
evt
.
info
.
code
)
;
}
switch
(
evt
.
info
.
code
){
case
"NetConnection.Connect.Success"
:
__on_progress_change
(
8
)
;
break
;
}
}
/**
* invoke the callback.
*/
private
function
__on_progress_change
(
percent
:
Number
)
:
void
{
if
(
this
.
as_on_progress_change
!=
null
)
{
this
.
as_on_progress_change
(
percent
)
;
}
if
(
this
.
js_on_progress_change
!=
null
)
{
flash
.
external
.
ExternalInterface
.
call
(
this
.
js_on_progress_change
,
this
.
js_id
,
percent
)
;
}
}
private
function
__on_status_change
(
code
:
String
,
data
:
String
=
""
)
:
void
{
if
(
this
.
as_on_status_change
!=
null
)
{
this
.
as_on_status_change
(
code
,
data
)
;
}
if
(
this
.
js_on_status_change
!=
null
)
{
flash
.
external
.
ExternalInterface
.
call
(
this
.
js_on_status_change
,
this
.
js_id
,
code
,
data
)
;
}
}
}
}
\ No newline at end of file
...
...
trunk/research/players/srs_bwt/src/srs_bwt.as
查看文件 @
c319cc6
package
{
import
SrsClass
.
SrsElapsedTimer
;
import
flash
.
display
.
LoaderInfo
;
import
flash
.
display
.
Sprite
;
import
flash
.
display
.
StageAlign
;
...
...
@@ -18,34 +16,19 @@ package
import
flash
.
utils
.
Timer
;
import
flash
.
utils
.
setTimeout
;
import
srs
.
SrsBandwidth
;
public
class
srs_bwt
extends
Sprite
{
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
;
// server ip get from server
private
var
server_ip
:
String
;
// test wheth publish should to stop
private
var
stop_pub
:
Boolean
=
false
;
// js interface
private
var
js_on_player_ready
:
String
;
private
var
js_update_progress
:
String
;
private
var
js_update_status
:
String
;
private
var
value_progressbar
:
Number
=
0
;
private
var
max_progressbar
:
Number
=
0
;
/**
* the SRS bandwidth check/test library object.
*/
private
var
bandwidth
:
SrsBandwidth
=
new
SrsBandwidth
()
;
// set NetConnection ObjectEncoding to AMF0
NetConnection
.
defaultObjectEncoding
=
ObjectEncoding
.
AMF0
;
/**
* when not specifies any param, directly run the swf.
*/
private
var
default_url
:
String
=
"rtmp://dev:1935/app?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com"
;
public
function
srs_bwt
()
{
...
...
@@ -55,91 +38,81 @@ package
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
{
this
.
stage
.
scaleMode
=
StageScaleMode
.
NO_SCALE
;
this
.
stage
.
align
=
StageAlign
.
TOP_LEFT
;
var
flashvars
:
Object
=
this
.
root
.
loaderInfo
.
parameters
;
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
))
;
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
()
;
// init connection
connection
=
new
NetConnection
;
connection
.
client
=
this
;
connection
.
addEventListener
(
NetStatusEvent
.
NET_STATUS
,
onStatus
)
;
connection
.
connect
(
url
)
;
//connection.connect("rtmp://192.168.8.234:1935/app?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com");
// for play to update progress bar
elapTimer
=
new
SrsElapsedTimer
;
// we suppose the check time = 7 S
updatePlayProgressTimer
=
new
Timer
(
100
)
;
updatePlayProgressTimer
.
addEventListener
(
TimerEvent
.
TIMER
,
onTimerTimeout
)
;
updatePlayProgressTimer
.
start
()
;
}
private
function
js_call_stop
()
:
void
{
if
(
connection
)
{
connection
.
close
()
;
connection
=
null
;
}
if
(
updatePlayProgressTimer
)
{
updatePlayProgressTimer
.
stop
()
;
updatePlayProgressTimer
=
null
;
}
if
(
elapTimer
)
{
elapTimer
.
restart
()
;
}
}
// srs infos
private
var
srs_server
:
String
=
null
;
private
var
srs_primary_authors
:
String
=
null
;
private
var
srs_id
:
String
=
null
;
private
var
srs_pid
:
String
=
null
;
private
var
srs_server_ip
:
String
=
null
;
private
function
update_context_items
()
:
void
{
check_bandwidth
()
;
}
private
function
check_bandwidth
()
:
void
{
// closure
var
self
:
srs_bwt
=
this
;
/////////////////////////////////////////////////////////////////////
// initialize the bandwidth check/test library
/////////////////////////////////////////////////////////////////////
// js callback, set to null if ignore.
var
conf
:
Object
=
this
.
root
.
loaderInfo
.
parameters
;
var
js_id
:
String
=
conf
.
id
?
conf
.
id
:
null
;
var
js_on_ready
:
String
=
conf
.
on_bandwidth_ready
?
conf
.
on_bandwidth_ready
:
null
;
var
js_on_srs_info
:
String
=
conf
.
on_srs_info
?
conf
.
on_srs_info
:
null
;
var
js_on_progress_change
:
String
=
conf
.
on_update_progress
?
conf
.
on_update_progress
:
null
;
var
js_on_status_change
:
String
=
conf
.
on_update_status
?
conf
.
on_update_status
:
null
;
var
js_on_complete
:
String
=
conf
.
on_complete
?
conf
.
on_complete
:
null
;
// js export, set to null to disable
var
js_export_check_bandwidth
:
String
=
"__check_bandwidth"
;
var
js_export_stop
:
String
=
"__stop"
;
// as callback, set to null if ignore.
var
as_on_ready
:
Function
=
function
()
:
void
{
self
.
on_ready
()
;
}
;
var
as_on_status_change
:
Function
=
function
(
code
:
String
,
data
:
String
)
:
void
{
self
.
on_status_change
(
code
,
data
)
;
}
;
var
as_on_progress_change
:
Function
=
function
(
percent
:
Number
)
:
void
{
self
.
on_progress
(
percent
)
;
}
;
var
as_on_srs_info
:
Function
=
function
(
srs_server
:
String
,
srs_primary_authors
:
String
,
srs_id
:
String
,
srs_pid
:
String
,
srs_server_ip
:
String
)
:
void
{
self
.
update_context_items
(
srs_server
,
srs_primary_authors
,
srs_id
,
srs_pid
,
srs_server_ip
)
;
}
;
var
as_on_complete
:
Function
=
function
(
start_time
:
Number
,
end_time
:
Number
,
play_kbps
:
Number
,
publish_kbps
:
Number
,
play_bytes
:
Number
,
publish_bytes
:
Number
,
play_time
:
Number
,
publish_time
:
Number
)
:
void
{
self
.
on_complete
(
start_time
,
end_time
,
play_kbps
,
publish_kbps
,
play_bytes
,
publish_bytes
,
play_time
,
publish_time
)
;
}
;
bandwidth
.
initialize
(
as_on_ready
,
as_on_status_change
,
as_on_progress_change
,
as_on_srs_info
,
as_on_complete
,
js_id
,
js_on_ready
,
js_on_status_change
,
js_on_progress_change
,
js_on_srs_info
,
js_on_complete
,
js_export_check_bandwidth
,
js_export_stop
)
;
/////////////////////////////////////////////////////////////////////
}
private
function
on_ready
()
:
void
{
var
conf
:
Object
=
this
.
root
.
loaderInfo
.
parameters
;
// for directly run swf.
if
(
!
conf
.
id
)
{
trace
(
"directly run swf, load default url: "
+
this
.
default_url
)
;
this
.
bandwidth
.
check_bandwidth
(
this
.
default_url
)
;
}
}
private
function
on_progress
(
percent
:
Number
)
:
void
{
trace
(
"progress:"
+
percent
+
"%"
)
;
}
private
function
update_context_items
(
srs_server
:
String
,
srs_primary_authors
:
String
,
srs_id
:
String
,
srs_pid
:
String
,
srs_server_ip
:
String
)
:
void
{
// for context menu
var
customItems
:
Array
=
[
new
ContextMenuItem
(
"SrsPlayer"
)]
;
if
(
srs_server
!=
null
)
{
...
...
@@ -159,172 +132,42 @@ package
}
contextMenu
.
customItems
=
customItems
;
}
// get NetConnection NetStatusEvent
public
function
onStatus
(
evt
:
NetStatusEvent
)
:
void
{
trace
(
evt
.
info
.
code
)
;
if
(
evt
.
info
.
hasOwnProperty
(
"data"
)
&&
evt
.
info
.
data
)
{
if
(
evt
.
info
.
data
.
hasOwnProperty
(
"srs_server"
))
{
srs_server
=
evt
.
info
.
data
.
srs_server
;
}
if
(
evt
.
info
.
data
.
hasOwnProperty
(
"srs_primary_authors"
))
{
srs_primary_authors
=
evt
.
info
.
data
.
srs_primary_authors
;
}
if
(
evt
.
info
.
data
.
hasOwnProperty
(
"srs_id"
))
{
srs_id
=
evt
.
info
.
data
.
srs_id
;
}
if
(
evt
.
info
.
data
.
hasOwnProperty
(
"srs_pid"
))
{
srs_pid
=
evt
.
info
.
data
.
srs_pid
;
}
if
(
evt
.
info
.
data
.
hasOwnProperty
(
"srs_server_ip"
))
{
srs_server_ip
=
evt
.
info
.
data
.
srs_server_ip
;
}
update_context_items
()
;
}
switch
(
evt
.
info
.
code
){
public
function
on_status_change
(
code
:
String
,
data
:
String
)
:
void
{
trace
(
code
)
;
switch
(
code
){
case
"NetConnection.Connect.Failed"
:
updateStat
e
(
"连接服务器失败!"
)
;
trac
e
(
"连接服务器失败!"
)
;
break
;
case
"NetConnection.Connect.Rejected"
:
updateStat
e
(
"服务器拒绝连接!"
)
;
trac
e
(
"服务器拒绝连接!"
)
;
break
;
case
"NetConnection.Connect.Success"
:
server_ip
=
evt
.
info
.
data
.
srs_server_ip
;
updateState
(
"连接服务器成功!"
)
;
trace
(
"连接服务器成功!"
)
;
break
;
case
SrsBandwidth
.
StatusSrsBwtcPlayStart
:
trace
(
"开始测试下行带宽"
)
;
break
;
case
SrsBandwidth
.
StatusSrsBwtcPlayStop
:
trace
(
"下行带宽测试完毕,"
+
data
+
"kbps,开始测试上行带宽。"
)
;
break
;
case
SrsBandwidth
.
StatusSrsBwtcPublishStart
:
trace
(
"开始测试上行带宽"
)
;
break
;
case
SrsBandwidth
.
StatusSrsBwtcPublishStop
:
trace
(
"上行带宽测试完毕,"
+
data
+
"kbps,"
)
;
break
;
case
"NetConnection.Connect.Closed"
:
//updateStat
e("连接已断开!");
trac
e
(
"连接已断开!"
)
;
break
;
}
}
public
function
onTimerTimeout
(
evt
:
TimerEvent
)
:
void
{
value_progressbar
=
elapTimer
.
elapsed
()
;
updateProgess
(
value_progressbar
,
max_progressbar
)
;
}
/**
* NetConnection callback this function, when recv server call "onSrsBandCheckStartPlayBytes"
* then start @updatePlayProgressTimer for updating the progressbar
* */
public
function
onSrsBandCheckStartPlayBytes
(
evt
:
Object
)
:
void
{
var
duration_ms
:
Number
=
evt
.
duration_ms
;
var
interval_ms
:
Number
=
evt
.
interval_ms
;
connection
.
call
(
"onSrsBandCheckStartingPlayBytes"
,
null
)
;
updateState
(
"开始测试下行带宽,服务器IP:"
+
server_ip
)
;
// we suppose play duration_ms = pub duration_ms
max_progressbar
=
duration_ms
*
2
;
}
public
function
onSrsBandCheckPlaying
(
evt
:
Object
)
:
void
{
}
public
function
onSrsBandCheckStopPlayBytes
(
evt
:
Object
)
:
void
{
var
duration_ms
:
Number
=
evt
.
duration_ms
;
var
interval_ms
:
Number
=
evt
.
interval_ms
;
var
duration_delta
:
Number
=
evt
.
duration_delta
;
var
bytes_delta
:
Number
=
evt
.
bytes_delta
;
var
kbps
:
Number
=
0
;
if
(
duration_delta
>
0
){
kbps
=
bytes_delta
*
8
.
0
/
duration_delta
;
// b/ms == kbps
}
kbps
=
(
int
(
kbps
*
10
))
/
10
.
0
;
flash
.
utils
.
setTimeout
(
stopPlayTest
,
0
)
;
updateState
(
"下行带宽测试完毕,服务器: "
+
server_ip
+
","
+
kbps
+
"kbps,开始测试上行带宽。"
)
;
}
private
function
stopPlayTest
()
:
void
{
connection
.
call
(
"onSrsBandCheckStoppedPlayBytes"
,
null
)
;
}
public
function
onSrsBandCheckStartPublishBytes
(
evt
:
Object
)
:
void
{
var
duration_ms
:
Number
=
evt
.
duration_ms
;
var
interval_ms
:
Number
=
evt
.
interval_ms
;
connection
.
call
(
"onSrsBandCheckStartingPublishBytes"
,
null
)
;
flash
.
utils
.
setTimeout
(
publisher
,
0
)
;
}
private
function
publisher
()
:
void
{
if
(
stop_pub
)
{
return
;
}
var
data
:
Array
=
new
Array
()
;
var
data_size
:
int
=
100
;
for
(
var
i
:
int
;
i
<
data_size
;
i
++
){
data
.
push
(
"SrS band check data from client's publishing......"
)
;
}
data_size
+=
100
;
connection
.
call
(
"onSrsBandCheckPublishing"
,
null
,
data
)
;
flash
.
utils
.
setTimeout
(
publisher
,
0
)
;
}
public
function
onSrsBandCheckStopPublishBytes
(
evt
:
Object
)
:
void
{
var
duration_ms
:
Number
=
evt
.
duration_ms
;
var
interval_ms
:
Number
=
evt
.
interval_ms
;
var
duration_delta
:
Number
=
evt
.
duration_delta
;
var
bytes_delta
:
Number
=
evt
.
bytes_delta
;
var
kbps
:
Number
=
0
;
if
(
duration_delta
>
0
){
kbps
=
bytes_delta
*
8
.
0
/
duration_delta
;
// b/ms == kbps
}
kbps
=
(
int
(
kbps
*
10
))
/
10
.
0
;
stopPublishTest
()
;
}
private
function
stopPublishTest
()
:
void
{
if
(
connection
.
connected
){
connection
.
call
(
"onSrsBandCheckStoppedPublishBytes"
,
null
)
;
}
stop_pub
=
true
;
value_progressbar
=
max_progressbar
;
updateProgess
(
value_progressbar
,
max_progressbar
)
;
updatePlayProgressTimer
.
stop
()
;
}
public
function
onSrsBandCheckFinished
(
evt
:
Object
)
:
void
{
var
code
:
Number
=
evt
.
code
;
var
start_time
:
Number
=
evt
.
start_time
;
var
end_time
:
Number
=
evt
.
end_time
;
var
play_kbps
:
Number
=
evt
.
play_kbps
;
var
publish_kbps
:
Number
=
evt
.
publish_kbps
;
var
play_bytes
:
Number
=
evt
.
play_bytes
;
var
play_time
:
Number
=
evt
.
play_time
;
var
publish_bytes
:
Number
=
evt
.
publish_bytes
;
var
publish_time
:
Number
=
evt
.
publish_time
;
updateState
(
"检测结束: 服务器: "
+
server_ip
+
" 上行: "
+
publish_kbps
+
" kbps"
+
" 下行: "
+
play_kbps
+
" kbps"
+
" 测试时间: "
+
(
end_time
-
start_time
)
/
1000
+
" 秒"
)
;
connection
.
call
(
"finalClientPacket"
,
null
)
;
}
// 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
)
;
trace
(
value
+
"-"
+
maxValue
+
"-"
+
value
*
100
/
maxValue
+
"%"
)
;
}
// update checking status
private
function
updateState
(
text
:
String
)
:
void
{
flash
.
external
.
ExternalInterface
.
call
(
this
.
js_update_status
,
this
.
js_id
,
text
)
;
trace
(
text
)
;
}
public
function
onBWDone
()
:
void
{
private
function
on_complete
(
start_time
:
Number
,
end_time
:
Number
,
play_kbps
:
Number
,
publish_kbps
:
Number
,
play_bytes
:
Number
,
publish_bytes
:
Number
,
play_time
:
Number
,
publish_time
:
Number
)
:
void
{
var
status
:
String
=
"检测结束: 上行: "
+
publish_kbps
+
" kbps"
+
" 下行: "
+
play_kbps
+
" kbps"
+
" 测试时间: "
+
Number
((
end_time
-
start_time
)
/
1000
).
toFixed
(
1
)
+
" 秒"
;
trace
(
status
)
;
}
}
}
\ No newline at end of file
...
...
trunk/src/app/srs_app_bandwidth.cpp
查看文件 @
c319cc6
...
...
@@ -115,19 +115,23 @@ int SrsBandwidth::do_bandwidth_check()
int64_t
start_time
=
srs_get_system_time_ms
();
srs_info
(
"start play test."
);
ret
=
check_play
(
play_duration_ms
,
play_interval_ms
,
play_actual_duration_ms
,
play_bytes
,
limit_kbps
);
if
(
ret
!=
ERROR_SUCCESS
)
{
srs_error
(
"band width play check failed. ret=%d"
,
ret
);
return
ret
;
}
srs_info
(
"stop play test."
);
srs_info
(
"start publish test."
);
ret
=
check_publish
(
publish_duration_ms
,
publish_interval_ms
,
publish_actual_duration_ms
,
publish_bytes
,
limit_kbps
);
if
(
ret
!=
ERROR_SUCCESS
)
{
srs_error
(
"band width publish check failed. ret=%d"
,
ret
);
return
ret
;
}
srs_info
(
"stop publish test."
);
int64_t
end_time
=
srs_get_system_time_ms
();
int
play_kbps
=
play_bytes
*
8
/
play_actual_duration_ms
;
...
...
@@ -138,7 +142,9 @@ int SrsBandwidth::do_bandwidth_check()
start_time
,
end_time
,
(
int
)(
end_time
-
start_time
),
play_kbps
,
publish_kbps
,
_req
->
tcUrl
.
c_str
(),
ret
);
// send finished msg
// send finished msg,
// flash client will close connection when got this packet,
// for the publish queue may contains packets.
SrsBandwidthPacket
*
pkt
=
SrsBandwidthPacket
::
create_finish
();
pkt
->
data
->
set
(
"code"
,
SrsAmf0Any
::
number
(
ERROR_SUCCESS
));
pkt
->
data
->
set
(
"start_time"
,
SrsAmf0Any
::
number
(
start_time
));
...
...
@@ -154,9 +160,12 @@ int SrsBandwidth::do_bandwidth_check()
srs_error
(
"send bandwidth check finish message failed. ret=%d"
,
ret
);
return
ret
;
}
srs_info
(
"send finish packet."
);
// if flash, we notice the result, and expect a final packet.
while
(
true
)
{
// we notice the result, and expect a final packet if not flash.
// if flash client, client will disconnect when got finish packet.
bool
is_flash
=
(
_req
->
swfUrl
!=
""
);
while
(
!
is_flash
)
{
SrsMessage
*
msg
=
NULL
;
SrsBandwidthPacket
*
pkt
=
NULL
;
if
((
ret
=
_rtmp
->
expect_message
<
SrsBandwidthPacket
>
(
&
msg
,
&
pkt
))
!=
ERROR_SUCCESS
)
{
...
...
@@ -196,8 +205,8 @@ int SrsBandwidth::check_play(
srs_error
(
"send bandwidth check start play message failed. ret=%d"
,
ret
);
return
ret
;
}
srs_info
(
"BW check begin."
);
}
srs_info
(
"BW check begin."
);
while
(
true
)
{
// recv client's starting play response
...
...
@@ -212,10 +221,10 @@ int SrsBandwidth::check_play(
srs_info
(
"get bandwidth message succes."
);
if
(
pkt
->
is_starting_play
())
{
srs_info
(
"BW check recv play begin response."
);
break
;
}
}
srs_info
(
"BW check recv play begin response."
);
// send play data to client
int64_t
current_time
=
srs_get_system_time_ms
();
...
...
@@ -277,8 +286,8 @@ int SrsBandwidth::check_play(
srs_error
(
"send bandwidth check stop play message failed. ret=%d"
,
ret
);
return
ret
;
}
srs_info
(
"BW check stop play bytes."
);
}
srs_info
(
"BW check stop play bytes."
);
while
(
true
)
{
// recv client's stop play response.
...
...
@@ -293,10 +302,10 @@ int SrsBandwidth::check_play(
srs_info
(
"get bandwidth message succes."
);
if
(
pkt
->
is_stopped_play
())
{
srs_info
(
"BW check recv stop play response."
);
break
;
}
}
srs_info
(
"BW check recv stop play response."
);
return
ret
;
}
...
...
@@ -318,8 +327,8 @@ int SrsBandwidth::check_publish(
srs_error
(
"send bandwidth check start publish message failed. ret=%d"
,
ret
);
return
ret
;
}
srs_info
(
"BW check publish begin."
);
}
srs_info
(
"BW check publish begin."
);
while
(
true
)
{
// read client's notification of starting publish
...
...
@@ -334,14 +343,14 @@ int SrsBandwidth::check_publish(
srs_info
(
"get bandwidth message succes."
);
if
(
pkt
->
is_starting_publish
())
{
srs_info
(
"BW check recv publish begin response."
);
break
;
}
}
srs_info
(
"BW check recv publish begin response."
);
// recv publish msgs until @duration_ms ms
int64_t
current_time
=
srs_get_system_time_ms
();
while
(
(
srs_get_system_time_ms
()
-
current_time
)
<
duration_ms
)
{
while
(
(
srs_get_system_time_ms
()
-
current_time
)
<
duration_ms
)
{
st_usleep
(
0
);
SrsMessage
*
msg
=
NULL
;
...
...
@@ -380,16 +389,16 @@ int SrsBandwidth::check_publish(
srs_error
(
"send bandwidth check stop publish message failed. ret=%d"
,
ret
);
return
ret
;
}
srs_info
(
"BW check stop publish bytes."
);
}
srs_info
(
"BW check stop publish bytes."
);
// expect client to stop publish
// if flash client, we never expect the client stop publish bytes,
// for the flash send call packet to test publish bandwidth,
// there are many many packets in the queue.
// we just ignore the packet and send the bandwidth test data.
// TODO: FIXME: check whether flash client.
while
(
false
)
{
bool
is_flash
=
(
_req
->
swfUrl
!=
""
);
while
(
!
is_flash
)
{
// recv client's stop publish response.
SrsMessage
*
msg
=
NULL
;
SrsBandwidthPacket
*
pkt
=
NULL
;
...
...
@@ -402,10 +411,10 @@ int SrsBandwidth::check_publish(
srs_info
(
"get bandwidth message succes."
);
if
(
pkt
->
is_stopped_publish
())
{
srs_info
(
"BW check recv stop publish response."
);
break
;
}
}
srs_info
(
"BW check recv stop publish response."
);
return
ret
;
}
...
...
trunk/src/app/srs_app_bandwidth.hpp
查看文件 @
c319cc6
...
...
@@ -67,10 +67,10 @@ class SrsRtmpServer;
* | final(2)------------> | finalClientPacket
* | <END> |
*
* 1. when flash client, server ignore the publish stopped result,
* and directly send the report to flash client.
* 2. flash client only. when got report, flash client should send out
* a final packet and close the connection immediately.
* 1. when flash client, server never wait the stop publish response,
* for the flash client queue is fullfill with other packets.
* 2. when flash client, server never wait the final packet,
* for the flash client directly close when got report packet.
*/
class
SrsBandwidth
{
...
...
trunk/src/app/srs_app_conn.cpp
查看文件 @
c319cc6
...
...
@@ -69,7 +69,7 @@ int SrsConnection::cycle()
// success.
if
(
ret
==
ERROR_SUCCESS
)
{
srs_trace
(
"client
process normally finished. ret=%d"
,
ret
);
srs_trace
(
"client
finished."
);
}
// client close peer.
...
...
trunk/src/rtmp/srs_protocol_stack.cpp
查看文件 @
c319cc6
...
...
@@ -720,7 +720,7 @@ int SrsProtocol::do_decode_message(SrsMessageHeader& header, SrsStream* stream,
*
ppacket
=
packet
=
new
SrsSetChunkSizePacket
();
return
packet
->
decode
(
stream
);
}
else
{
if
(
!
header
.
is_set_peer_bandwidth
())
{
if
(
!
header
.
is_set_peer_bandwidth
()
&&
!
header
.
is_ackledgement
()
)
{
srs_trace
(
"drop unknown message, type=%d"
,
header
.
message_type
);
}
}
...
...
trunk/src/rtmp/srs_protocol_stack.hpp
查看文件 @
c319cc6
...
...
@@ -223,7 +223,9 @@ public:
while
(
true
)
{
SrsMessage
*
msg
=
NULL
;
if
((
ret
=
recv_message
(
&
msg
))
!=
ERROR_SUCCESS
)
{
if
(
ret
!=
ERROR_SOCKET_TIMEOUT
&&
!
srs_is_client_gracefully_close
(
ret
))
{
srs_error
(
"recv message failed. ret=%d"
,
ret
);
}
return
ret
;
}
srs_verbose
(
"recv message success."
);
...
...
请
注册
或
登录
后发表评论