/
stream-snapshot.js
144 lines (130 loc) · 4.74 KB
/
stream-snapshot.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS;
var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS;
var localVideo;
var snapshotImg;
//////////////////////////////////
/////////////// Init /////////////
function init_page() {
//init api
try {
Flashphoner.init({flashMediaProviderSwfLocation: '../../../../media-provider.swf'});
} catch(e) {
$("#notifyFlash").text("Your browser doesn't support Flash or WebRTC technology necessary for work of an example");
return;
}
//local and remote displays
localVideo = document.getElementById("localVideo");
snapshotImg = document.getElementById("dynImg");
$("#url").val(setURL() + "/" + createUUID(8));
//set initial button callback
onUnpublished();
}
function snapshot(name) {
setSnapshotStatus();
var session = Flashphoner.getSessions()[0];
session.createStream({name: name}).on(STREAM_STATUS.SNAPSHOT_COMPLETE, function(stream){
console.log("Snapshot complete");
setSnapshotStatus(STREAM_STATUS.SNAPSHOT_COMPLETE);
snapshotImg.src = "data:image/png;base64,"+stream.getInfo();
//remove failed callback
stream.on(STREAM_STATUS.FAILED, function(){});
//release stream object
stream.stop();
}).on(STREAM_STATUS.FAILED, function(stream){
setSnapshotStatus(STREAM_STATUS.FAILED);
console.log("Snapshot failed, info: " + stream.getInfo());
}).snapshot();
}
function onPublishing(stream) {
$("#publishBtn").text("Stop").off('click').click(function(){
$(this).prop('disabled', true);
stream.stop();
}).prop('disabled', false);
$("#snapshotBtn").off('click').click(function(){
$(this).prop('disabled', true);
snapshot(stream.name());
}).prop('disabled', false);
}
function onUnpublished() {
$("#publishBtn").text("Start").off('click').click(function(){
$(this).prop('disabled', true);
start();
}).prop('disabled', false);
$("#snapshotBtn").prop('disabled', true);
}
function start() {
if (Browser.isSafariWebRTC()) {
Flashphoner.playFirstVideo(localVideo, true);
}
//check if we already have session
if (Flashphoner.getSessions().length > 0) {
startStreaming(Flashphoner.getSessions()[0]);
} else {
//create session
var url = field('url');
console.log("Create new session with url " + url);
$('#url').prop('disabled', true);
Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){
//session connected, start streaming
startStreaming(session);
}).on(SESSION_STATUS.DISCONNECTED, function(){
setStatus(SESSION_STATUS.DISCONNECTED);
$('#url').prop('disabled', false);
onUnpublished();
}).on(SESSION_STATUS.FAILED, function(){
setStatus(SESSION_STATUS.FAILED);
$('#url').prop('disabled', false);
onUnpublished();
});
}
}
function startStreaming(session) {
var streamName = field("url").split('/')[3];
session.createStream({
name: streamName,
display: localVideo,
cacheLocalResources: true,
receiveVideo: false,
receiveAudio: false
}).on(STREAM_STATUS.PUBLISHING, function(publishStream){
setStatus(STREAM_STATUS.PUBLISHING);
onPublishing(publishStream);
}).on(STREAM_STATUS.UNPUBLISHED, function(){
setStatus(STREAM_STATUS.UNPUBLISHED);
//enable start button
onUnpublished();
}).on(STREAM_STATUS.FAILED, function(stream){
setStatus(STREAM_STATUS.FAILED, stream);
//enable start button
onUnpublished();
}).publish();
}
//show connection or local stream status
function setStatus(status, stream) {
var statusField = $("#status");
var infoField = $("#info");
statusField.text(status).removeClass();
if (status == "PUBLISHING") {
statusField.attr("class","text-success");
infoField.text("");
} else if (status == "DISCONNECTED" || status == "UNPUBLISHED") {
statusField.attr("class","text-muted");
} else if (status == "FAILED") {
statusField.attr("class","text-danger");
if (stream) {
infoField.text(stream.getInfo()).attr("class","text-muted");
}
}
}
function setSnapshotStatus(status) {
var statusField = $("#snapshotStatus");
if (status == "SNAPSHOT_COMPLETE") {
statusField.text("").removeClass();
$("#snapshotBtn").prop('disabled', false);
} else if (status == "FAILED") {
statusField.text(status).removeClass().attr("class","text-danger");
$("#snapshotBtn").prop('disabled', false);
} else {
statusField.text("processing...").removeClass();
}
}