|
|
/**
|
|
|
* the SrsPublisher object.
|
|
|
* @param container the html container id.
|
|
|
* @param width a float value specifies the width of publisher.
|
|
|
* @param height a float value specifies the height of publisher.
|
|
|
* @param private_object [optional] an object that used as private object,
|
|
|
* for example, the logic chat object which owner this publisher.
|
|
|
*/
|
|
|
function SrsPublisher(container, width, height, private_object) {
|
|
|
if (!SrsPublisher.__id) {
|
|
|
SrsPublisher.__id = 100;
|
|
|
}
|
|
|
if (!SrsPublisher.__publishers) {
|
|
|
SrsPublisher.__publishers = [];
|
|
|
}
|
|
|
|
|
|
SrsPublisher.__publishers.push(this);
|
|
|
|
|
|
this.private_object = private_object;
|
|
|
this.container = container;
|
|
|
this.width = width;
|
|
|
this.height = height;
|
|
|
this.id = SrsPublisher.__id++;
|
|
|
this.callbackObj = null;
|
|
|
|
|
|
// set the values when publish.
|
|
|
this.url = null;
|
|
|
this.vcodec = {};
|
|
|
this.acodec = {};
|
|
|
|
|
|
// callback set the following values.
|
|
|
this.cameras = [];
|
|
|
this.microphones = [];
|
|
|
this.code = 0;
|
|
|
|
|
|
// error code defines.
|
|
|
this.errors = {
|
|
|
"100": "无法获取指定的摄像头。", //error_camera_get
|
|
|
"101": "无法获取指定的麦克风。", //error_microphone_get
|
|
|
"102": "摄像头为禁用状态,推流时请允许flash访问摄像头。", //error_camera_muted
|
|
|
"103": "服务器关闭了连接。", //error_connection_closed
|
|
|
"104": "服务器连接失败。", //error_connection_failed
|
|
|
"199": "未知错误。"
|
|
|
};
|
|
|
}
|
|
|
/**
|
|
|
* user can set some callback, then start the publisher.
|
|
|
* callbacks:
|
|
|
* on_publisher_ready(cameras, microphones):int, when srs publisher ready, user can publish.
|
|
|
* on_publisher_error(code, desc):int, when srs publisher error, callback this method.
|
|
|
* on_publisher_warn(code, desc):int, when srs publisher warn, callback this method.
|
|
|
*/
|
|
|
SrsPublisher.prototype.start = function() {
|
|
|
// embed the flash.
|
|
|
var flashvars = {};
|
|
|
flashvars.id = this.id;
|
|
|
flashvars.width = this.width;
|
|
|
flashvars.height = this.height;
|
|
|
flashvars.on_publisher_ready = "__srs_on_publisher_ready";
|
|
|
flashvars.on_publisher_error = "__srs_on_publisher_error";
|
|
|
flashvars.on_publisher_warn = "__srs_on_publisher_warn";
|
|
|
|
|
|
var params = {};
|
|
|
params.wmode = "opaque";
|
|
|
params.allowFullScreen = "true";
|
|
|
params.allowScriptAccess = "always";
|
|
|
|
|
|
var attributes = {};
|
|
|
|
|
|
var self = this;
|
|
|
|
|
|
swfobject.embedSWF(
|
|
|
"srs_publisher/release/srs_publisher.swf?_version="+srs_get_version_code(),
|
|
|
this.container,
|
|
|
this.width, this.height,
|
|
|
"11.1.0", "js/AdobeFlashPlayerInstall.swf",
|
|
|
flashvars, params, attributes,
|
|
|
function(callbackObj){
|
|
|
self.callbackObj = callbackObj;
|
|
|
}
|
|
|
);
|
|
|
|
|
|
return this;
|
|
|
}
|
|
|
/**
|
|
|
* publish stream to server.
|
|
|
* @param url a string indicates the rtmp url to publish.
|
|
|
* @param vcodec an object contains the video codec info.
|
|
|
* @param acodec an object contains the audio codec info.
|
|
|
*/
|
|
|
SrsPublisher.prototype.publish = function(url, vcodec, acodec) {
|
|
|
this.stop();
|
|
|
SrsPublisher.__publishers.push(this);
|
|
|
|
|
|
if (url) {
|
|
|
this.url = url;
|
|
|
}
|
|
|
if (vcodec) {
|
|
|
this.vcodec = vcodec;
|
|
|
}
|
|
|
if (acodec) {
|
|
|
this.acodec = acodec;
|
|
|
}
|
|
|
|
|
|
this.callbackObj.ref.__publish(this.url, this.width, this.height, this.vcodec, this.acodec);
|
|
|
}
|
|
|
SrsPublisher.prototype.stop = function() {
|
|
|
for (var i = 0; i < SrsPublisher.__publishers.length; i++) {
|
|
|
var player = SrsPublisher.__publishers[i];
|
|
|
|
|
|
if (player.id != this.id) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
SrsPublisher.__publishers.splice(i, 1);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
this.callbackObj.ref.__stop();
|
|
|
}
|
|
|
/**
|
|
|
* when publisher ready.
|
|
|
* @param cameras a string array contains the names of cameras.
|
|
|
* @param microphones a string array contains the names of microphones.
|
|
|
*/
|
|
|
SrsPublisher.prototype.on_publisher_ready = function(cameras, microphones) {
|
|
|
}
|
|
|
/**
|
|
|
* when publisher error.
|
|
|
* @code the error code.
|
|
|
* @desc the error desc message.
|
|
|
*/
|
|
|
SrsPublisher.prototype.on_publisher_error = function(code, desc) {
|
|
|
throw new Error("publisher error. code=" + code + ", desc=" + desc);
|
|
|
}
|
|
|
SrsPublisher.prototype.on_publisher_warn = function(code, desc) {
|
|
|
throw new Error("publisher warn. code=" + code + ", desc=" + desc);
|
|
|
}
|
|
|
function __srs_find_publisher(id) {
|
|
|
for (var i = 0; i < SrsPublisher.__publishers.length; i++) {
|
|
|
var publisher = SrsPublisher.__publishers[i];
|
|
|
|
|
|
if (publisher.id != id) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
return publisher;
|
|
|
}
|
|
|
|
|
|
throw new Error("publisher not found. id=" + id);
|
|
|
}
|
|
|
function __srs_on_publisher_ready(id, cameras, microphones) {
|
|
|
var publisher = __srs_find_publisher(id);
|
|
|
|
|
|
publisher.cameras = cameras;
|
|
|
publisher.microphones = microphones;
|
|
|
|
|
|
publisher.on_publisher_ready(cameras, microphones);
|
|
|
}
|
|
|
function __srs_on_publisher_error(id, code) {
|
|
|
var publisher = __srs_find_publisher(id);
|
|
|
|
|
|
publisher.code = code;
|
|
|
|
|
|
publisher.on_publisher_error(code, publisher.errors[""+code]);
|
|
|
}
|
|
|
function __srs_on_publisher_warn(id, code) {
|
|
|
var publisher = __srs_find_publisher(id);
|
|
|
|
|
|
publisher.code = code;
|
|
|
|
|
|
publisher.on_publisher_warn(code, publisher.errors[""+code]);
|
|
|
}
|