...
Для захвата VOD из файла в качестве имени потока при вызове функции session.createStream() должна быть указана ссылка на файл в виде:
Code Block | ||||
---|---|---|---|---|
| ||||
vod://sample.mp4 |
где sample.mp4 - имя файла, который должен находиться в каталоге /usr/local/FlashphonerWebCallServer/media/
...
Поток, созданный таким образом, предназначен для трансляции одному пользователю (персональный VOD). В случае, если необходимо организовать полноценную онлайн-трансляцию, следует указать ссылку на файл в виде:
Code Block | ||||
---|---|---|---|---|
| ||||
vod-live://sample.mp4 |
К такому потоку могут подключиться одновременно несколько пользователей в реальном времени.
Поддерживаемые форматы и кодеки
...
- Контейнер: MP4
- Видео: H.264
- Аудио: AAC
...
Code Block | ||||
---|---|---|---|---|
| ||||
Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){ setStatus(session.status());... }); |
2. Получение от сервера события, подтверждающего успешное соединение.
ConnectionStatusEvent ESTABLISHED code
Code Block | ||||
---|---|---|---|---|
| ||||
/Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){ setStatus(session.status()); //session connected, start playback publishStream(session); }).on(SESSION_STATUS.DISCONNECTED, function(){ setStatus(SESSION_STATUS.DISCONNECTED);... onStopped(); }}).on(SESSION_STATUS.FAILED, function(){ setStatus(SESSION_STATUS.FAILED); onStopped();... }); |
2. Получение от сервера события, подтверждающего успешное соединение.ConnectionStatusEvent ESTABLISHED 3. Публикация потока с указанием признака записи:
stream.publish(); code
Code Block | ||||
---|---|---|---|---|
| ||||
Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){ session.createStream({ setStatus(session.status());name: streamName, //session connected, start playback display: localVideo, record: true, publishStream(session); }).on(SESSION_STATUS.DISCONNECTED, function(){ receiveVideo: false, setStatus(SESSION_STATUS.DISCONNECTED);receiveAudio: false onStopped();... }).on(SESSION_STATUS.FAILED, function(){ setStatus(SESSION_STATUS.FAILED); onStopped(); }); |
...
publish(); |
4. Получение от сервера события, подтверждающего успешную публикацию потока.
StreamStatusEvent, статус PUBLISHING code
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream({ name: streamName, display: localVideo, record: true, receiveVideo: false, receiveAudio: false }).on(STREAM_STATUS.PUBLISHING, function(stream) { setStatus(stream.status()); onStarted(stream); }).on(STREAM_STATUS.UNPUBLISHED, function(stream) { setStatus(stream.status()); showDownloadLink(stream.getRecordInfo()); onStopped();... }).on(STREAM_STATUS.FAILED, function(stream) { setStatus(stream.status(), stream.getInfo());... showDownloadLink(stream.getRecordInfo}).publish()); onStopped(); }).publish(); |
...
; |
5. Отправка аудио-видео потока по WebRTC
6. Остановка публикации потока.
stream.stop(); code
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream({ function onStarted(stream) { $("#publishBtn").text("Stop").off('click').click(function(){ name: streamName, $(this).prop('disabled', true); display: localVideo, stream.stop(); record: true,}).prop('disabled', false); } |
7. Получение от сервера события, подтверждающего остановку публикации потока.
StreamStatusEvent, статус UNPUBLISHED code
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream({ receiveVideoname: falsestreamName, receiveAudiodisplay: falselocalVideo, }).on(STREAM_STATUS.PUBLISHING, function(stream) { record: true, setStatus(stream.status()); receiveVideo: false, onStarted(stream);receiveAudio: false }).on(STREAM_STATUS.UNPUBLISHEDPUBLISHING, function(stream) { setStatus(stream.status());... showDownloadLink(stream.getRecordInfo()); onStopped(); }).}).on(STREAM_STATUS.FAILEDUNPUBLISHED, function(stream) { setStatus(stream.status(), stream.getInfo()); showDownloadLink(stream.getRecordInfo()); onStopped(); }).publish(); |
...
6. Остановка публикации потока.
...
.on(STREAM_STATUS.FAILED, function(stream) {
...
}).publish(); |
8. Установка соединения с сервером для воспроизведения потока.
Flashphoner.createSession(); code
Code Block | ||||
---|---|---|---|---|
| ||||
function onStarted(stream) { $("#publishBtn").text("Stop").off('click').click(function(Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){ $(this).prop('disabled', true); stream.stop();... }).prop('disabled', false); } |
79. Получение от сервера события, подтверждающего остановку публикации потокауспешное соединение.
StreamStatusEvent, статус UNPUBLISHED ConnectionStatusEvent ESTABLISHED code
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream(Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){ name: streamName,setStatus(session.status()); display: localVideo,//session connected, start playback record: true,playStream(session); receiveVideo: false,}).on(SESSION_STATUS.DISCONNECTED, function(){ receiveAudio: false... }).on(STREAMSESSION_STATUS.PUBLISHINGFAILED, function(stream) { setStatus(stream.status());... onStarted(stream}); |
10. Воспроизведение потока.
stream.play(); code
Code Block | ||||
---|---|---|---|---|
| ||||
if })(Flashphoner.on(STREAM_STATUS.UNPUBLISHED, function(streamgetMediaProviders()[0] === "MSE" && mseCutByIFrameOnly) { setStatus(stream.status()); options.mediaConnectionConstraints = { showDownloadLink(stream.getRecordInfo());cutByIFrameOnly: mseCutByIFrameOnly onStopped();} }).on(STREAM_STATUS.FAILED, function(stream if (resolution_for_wsplayer) { setStatus(stream.status(), stream.getInfo()); options.playWidth = resolution_for_wsplayer.playWidth; options.playHeight showDownloadLink(stream.getRecordInfo())= resolution_for_wsplayer.playHeight; } else if onStopped(resolution); { options.playWidth = })resolution.publishsplit("x"); |
8. Установка соединения с сервером для воспроизведения потока.
Flashphoner.createSession(); code
Code Block | ||||
---|---|---|---|---|
| ||||
Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){
setStatus(session.status());
//session connected, start playback
playStream(session);
}).on(SESSION_STATUS.DISCONNECTED, function(){
setStatus(SESSION_STATUS.DISCONNECTED);
onStopped();
}).on(SESSION_STATUS.FAILED, function(){
setStatus(SESSION_STATUS.FAILED);
onStopped();
}); |
...
ConnectionStatusEvent ESTABLISHED code
Code Block | ||||
---|---|---|---|---|
| ||||
Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){
setStatus(session.status());
//session connected, start playback
playStream(session);
}).on(SESSION_STATUS.DISCONNECTED, function(){
setStatus(SESSION_STATUS.DISCONNECTED);
onStopped();
}).on(SESSION_STATUS.FAILED, function(){
setStatus(SESSION_STATUS.FAILED);
onStopped();
});
|
...
stream.play(); code
Code Block | ||||
---|---|---|---|---|
| ||||
if (Flashphoner.getMediaProviders()[0] === "MSE" && mseCutByIFrameOnly) {
options.mediaConnectionConstraints = {
cutByIFrameOnly: mseCutByIFrameOnly
}
}
if (resolution_for_wsplayer) {
options.playWidth = resolution_for_wsplayer.playWidth;
options.playHeight = resolution_for_wsplayer.playHeight;
} else if (resolution) {
options.playWidth = resolution.split("x")[0];
options.playHeight = resolution.split("x")[1];
}
stream = session.createStream(options).on(STREAM_STATUS.PENDING, function(stream) {
var video = document.getElementById(stream.id());
if (!video.hasListeners) {
video.hasListeners = true;
video.addEventListener('playing', function () {
$("#preloader").hide();
});
video.addEventListener('resize', function (event) {
var streamResolution = stream.videoResolution();
if (Object.keys(streamResolution).length === 0) {
resizeVideo(event.target);
} else {
// Change aspect ratio to prevent video stretching
var ratio = streamResolution.width / streamResolution.height;
var newHeight = Math.floor(options.playWidth / ratio);
resizeVideo(event.target, options.playWidth, newHeight);
}
});
}
}).on(STREAM_STATUS.PLAYING, function(stream) {
$("#preloader").show();
setStatus(stream.status());
onStarted(stream);
}).on(STREAM_STATUS.STOPPED, function() {
setStatus(STREAM_STATUS.STOPPED);
onStopped();
}).on(STREAM_STATUS.FAILED, function(stream) {
setStatus(STREAM_STATUS.FAILED, stream);
onStopped();
}).on(STREAM_STATUS.NOT_ENOUGH_BANDWIDTH, function(stream){
console.log("Not enough bandwidth, consider using lower video resolution or bitrate. Bandwidth " + (Math.round(stream.getNetworkBandwidth() / 1000)) + " bitrate " + (Math.round(stream.getRemoteBitrate() / 1000)));
});
stream.play(); |
11. Получение от сервера события, подтверждающего успешное воспроизведение потока.
StreamStatusEvent, статус PLAYING code
Code Block | ||||
---|---|---|---|---|
| ||||
stream = session.createStream(options).on(STREAM_STATUS.PENDING, function(stream) {
var video = document.getElementById(stream.id());
if (!video.hasListeners) {
video.hasListeners = true;
video.addEventListener('playing', function () {
$("#preloader").hide();
});
video.addEventListener('resize', function (event) {
var streamResolution = stream.videoResolution();
if (Object.keys(streamResolution).length === 0) {
resizeVideo(event.target);
} else {
// Change aspect ratio to prevent video stretching
var ratio = streamResolution.width / streamResolution.height;
var newHeight = Math.floor(options.playWidth / ratio);
resizeVideo(event.target, options.playWidth, newHeight);
}
});
}
}).on(STREAM_STATUS.PLAYING, function(stream) {
$("#preloader").show();
setStatus(stream.status());
onStarted(stream);
}).on(STREAM_STATUS.STOPPED, function() {
setStatus(STREAM_STATUS.STOPPED);
onStopped();
}).on(STREAM_STATUS.FAILED, function(stream) {
setStatus(STREAM_STATUS.FAILED, stream);
onStopped();
}).on(STREAM_STATUS.NOT_ENOUGH_BANDWIDTH, function(stream){
console.log("Not enough bandwidth, consider using lower video resolution or bitrate. Bandwidth " + (Math.round(stream.getNetworkBandwidth() / 1000)) + " bitrate " + (Math.round(stream.getRemoteBitrate() / 1000)));
});
stream.play(); |
12. Прием аудио-видео потока по Websocket и воспроизведение по WebRTC
13. Остановка воспроизведения потока.
stream.stop(); code
Code Block | ||||
---|---|---|---|---|
| ||||
function onStarted(stream) {
$("#playBtn").text("Stop").off('click').click(function(){
$(this).prop('disabled', true);
stream.stop();
}).prop('disabled', false);
$("#fullScreenBtn").off('click').click(function(){
stream.fullScreen();
}).prop('disabled', false);
$("#volumeControl").slider("enable");
stream.setVolume(currentVolumeValue);
} |
14. Получение от сервера события, подтверждающего остановку воспроизведения потока.
StreamStatusEvent, статус STOPPED code
Code Block | ||||
---|---|---|---|---|
| ||||
stream = session.createStream(options).on(STREAM_STATUS.PENDING, function(stream) { var video = document.getElementById(stream.id()); if (!video.hasListeners) { video.hasListeners = true; [0]; options.playHeight = video.addEventListener('playing', function () { $("#preloader").hide(); resolution.split("x")[1]; }); video.addEventListener('resize'stream = session.createStream(options).on(STREAM_STATUS.PENDING, function (eventstream) { ... var streamResolution =}); stream.videoResolutionplay(); |
11. Получение от сервера события, подтверждающего успешное воспроизведение потока.
StreamStatusEvent, статус PLAYING code
Code Block | ||||
---|---|---|---|---|
| ||||
stream if (Object.keys(streamResolution).length === 0= session.createStream(options).on(STREAM_STATUS.PENDING, function(stream) { resizeVideo(event.target); ... }).on(STREAM_STATUS.PLAYING, function(stream) { } else {$("#preloader").show(); setStatus(stream.status()); onStarted(stream); // Change aspect ratio to prevent video stretching }).on(STREAM_STATUS.STOPPED, function() { ... }).on(STREAM_STATUS.FAILED, function(stream) { ... var ratio = streamResolution.width / streamResolution.height; }).on(STREAM_STATUS.NOT_ENOUGH_BANDWIDTH, function(stream){ ... }); stream.play(); |
12. Прием аудио-видео потока по Websocket и воспроизведение по WebRTC
13. Остановка воспроизведения потока.
stream.stop(); code
Code Block | ||||
---|---|---|---|---|
| ||||
function onStarted(stream) { var newHeight = Math.floor(options.playWidth / ratio); $("#playBtn").text("Stop").off('click').click(function(){ resizeVideo(event.target, options.playWidth, newHeight$(this).prop('disabled', true); stream.stop(); }}).prop('disabled', false); }); ... } |
14. Получение от сервера события, подтверждающего остановку воспроизведения потока.
StreamStatusEvent, статус STOPPED code
Code Block | ||||
---|---|---|---|---|
| ||||
stream } }= session.createStream(options).on(STREAM_STATUS.PLAYINGPENDING, function(stream) { $("#preloader").show(); setStatus(stream.status()); onStarted(stream);... }).on(STREAM_STATUS.STOPPEDPLAYING, function(stream) { setStatus(STREAM_STATUS.STOPPED); onStopped();... }).on(STREAM_STATUS.FAILEDSTOPPED, function(stream) { setStatus(STREAM_STATUS.FAILED, streamSTOPPED); onStopped(); }).on(STREAM_STATUS.NOT_ENOUGH_BANDWIDTHFAILED, function(stream) { console.log("Not enough bandwidth, consider using lower video resolution or bitrate... Bandwidth " + (Math.round(stream.getNetworkBandwidth() / 1000)) + " bitrate " + (Math.round(stream.getRemoteBitrate() / 1000)));}).on(STREAM_STATUS.NOT_ENOUGH_BANDWIDTH, function(stream){ ... }); stream.play(); |