Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Для захвата VOD из файла в качестве имени потока при вызове функции session.createStream() должна быть указана ссылка на файл в виде:

Code Block
languagebash
themeRDark
vod://sample.mp4

где sample.mp4 - имя файла, который должен находиться в каталоге /usr/local/FlashphonerWebCallServer/media/

...

Поток, созданный таким образом, предназначен для трансляции одному пользователю (персональный VOD). В случае, если необходимо организовать полноценную онлайн-трансляцию, следует указать ссылку на файл в виде:

Code Block
languagebash
themeRDark
vod-live://sample.mp4

К такому потоку могут подключиться одновременно несколько пользователей в реальном времени.

Поддерживаемые форматы и кодеки

...

  • Контейнер: MP4
  • Видео: H.264
  • Аудио: AAC

...

Code Block
languagejs
themeRDark
    Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){
        setStatus(session.status());...
    });


2. Получение от сервера события, подтверждающего успешное соединение.

ConnectionStatusEvent ESTABLISHED code

Code Block
languagejs
themeRDark
    /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
languagejs
themeRDark
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
languagejs
themeRDark
    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
languagejs
themeRDark
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
languagejs
themeRDark
    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
languagejs
themeRDark
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
languagejs
themeRDark
     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
languagejs
themeRDark
    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
languagejs
themeRDark
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
languagejs
themeRDark
 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
languagejs
themeRDark
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
languagejs
themeRDark
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
languagejs
themeRDark
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
languagejs
themeRDark
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
languagejs
themeRDark
    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
languagejs
themeRDark
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
languagejs
themeRDark
    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();