Получить миниатюру видео, в формате jpg

pnzdevelop

Member
Задача - получить видеокадр, сохранить его в jpg (будет в списке видео)
Как это сделать через api?
 

pnzdevelop

Member
Понял, осталось это сделать через серверную часть (php), что бы по крону генерировались миниатюры, и сохранялись на сайте. Есть ли "серверный sdk'?

Сначала мы реализовали загрузку PNG-картинки по запросу.

  1. Делаем асинхронный запрос stream.snapshot()
  2. Сервер сохраняет картинку в файловой системе.
  3. Пользователь, который запрашивал снапшот получает ссылку на картинку по http и может его вставить HTML тэгом
Скажите как вы это сделали
 

pnzdevelop

Member
Code:
$(document).ready(function () {
    try {
        Flashphoner.init({
            flashMediaProviderSwfLocation: '/js/media-provider.swf',
            receiverLocation: '/js/WSReceiver2.js',
            decoderLocation: '/js/video-worker2.js'
        });
        var urlServer = setURL();
        var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS;
        var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS;
       
        function createThumbs(session) {
            $.each($(".fp_embed_player"),function() {
                var _this = $(this);

                var stream = session.createStream({name:$(_this).data('fid')});
                stream.snapshot();
                console.log($(_this).data('id')+" SNAP_START");
                stream.on(STREAM_STATUS.SNAPSHOT_COMPLETE, function(stream) {
                    console.log($(_this).data('id')+" OK");
                    $("#thumb-"+$(_this).data('id')).attr('src',"data:image/png;base64,"+stream.getInfo());
                });
            });
        }
        if (Flashphoner.getSessions().length === 0) {
            var mediaOptions = {"iceServers": [{'url': 'turn:*********:3478?transport=tcp', 'username': '**********', 'credential': '***********'}]};
            Flashphoner.createSession({urlServer: urlServer, mediaOptions: mediaOptions}).on(SESSION_STATUS.ESTABLISHED, function (session) {
                createThumbs(session);
            }).on(SESSION_STATUS.DISCONNECTED, function () { }).on(SESSION_STATUS.FAILED, function () { });
        } else {
            var session = Flashphoner.getSessions()[0];
            createThumbs(session);
        }

    } catch (e) {
        console.log(e);
    }
});
В итоге "notifyStreamStatusEvent" = info:"Stream not found", не понимаю что ещё упускаю...
 

Max

Administrator
Staff member
Скорее всего потому что на стороне сервера streamName мапится в адрес 'rtsp://'
Поэтому когда вы запрашиваете снапшот стрима stream1, сервер не знает о его существовании.
Попробуйте передать полный RTSP URL
Пример:
Code:
var stream = session.createStream({name:'rtsp://host:554/live.sdp'});
stream.snapshot();
Если так заработает, то есть REST-метод /snapshot, в котором можно также переопределить имя потока, например со stream1 на rtsp://host:554/live.sdp
 

pnzdevelop

Member
Передаю. Не помогает.
Делаю мап для playStream = всё хорошо, для snapshot передаю то же имя, и нет потока...
 

pnzdevelop

Member
И следующий вопрос. Как это сделать через php? чисто что бы сервер запрашивал картинку.
 

Max

Administrator
Staff member
В текущей версии этого сделать не получится.
Если будет время, добавим в REST API метод, за который можно будет вытащить картинку с потока, по его имени, либо нарезку снапшотов в папки по имени стрима.
В принципе, технически все для этого готово, остается только понять как лучше и удобнее эти превьюшки подготовить.
 

pnzdevelop

Member
В итоге "notifyStreamStatusEvent" = info:"Stream not found"
Нашёл закономерность. Когда поток долго никем не смотрится, видимо он отключается от сервера. И получить миниатюры с этого потока не представляется возможным. Как только нажал кнопку play, при следующем обновлении страницы миниатюра появится.
 

Max

Administrator
Staff member
Если у RTSP потока нет зрителей, WCS-сервер закрывает соединение с IP камерой для экономии ресурсов.
Соответственно, он больше не получает данных с камеры и не из чего делать картинку.
Как только вы вызываете play(), он заново открывает соединение с камерой и после этого может снова брать из потока картинки.
Ну и дальше есть два варианта
1) Выкрутить настройки RTSP чтобы WCS от камеры никогда не отсоединялся, вне зависимости от того, есть у потока зрители или нет.
Code:
rtsp_activity_timer_timeout
rtsp_activity_timer_cool_off_period
в конфиге flashphoner.properties

2) Управлять серверными RTSP-агентами (подключениями к IP камерам на стороне сервера) с помощью REST API.
Тогда вы сами будете принимать решение когда держать соединение WCS сервера с камерой, а когда закрывать.
Это функции
Code:
/rest-api/rtsp/startup
/rest-api/rtsp/shutdown
Документация REST API с примерами здесь:
https://flashphoner.com/docs/wcs5/wcs_docs/html/ru/wcs-rest-api
 
Last edited:

Max

Administrator
Staff member
В последней сборке сервера 2534 добавили возможность получения снапшотов через REST API.
Code:
https://host:8888/rest-api/stream/snapshot
{
streamName:'222'
}
 

pnzdevelop

Member
stdClass Object ( [timestamp] => 1509366067974 [status] => 404 [error] => Not Found [exception] => com.flashphoner.server.manager.controller.exception.NotFoundException [message] => NOT FOUND [path] => /rest-api/stream/snapshot )
хотя через js снапшот приходит как надо.
 

Max

Administrator
Staff member
Здесь надо помнить, что потока '222' в вашем случае не существует, т.к. вы мапите его в RTSP URL.
Поэтому надо запрашивать с полным RTSP URL:
Пример:
Code:
https://host:8888/rest-api/stream/snapshot
{
streamName:'rtsp://host:554/live.sdp'
}
Тогда должно работать.
 

pnzdevelop

Member
Я понял что нужно подставлять "реальный" поток. Не помогает. вот я его "запускаю" - всё ок, он уже запущен. Но вот снапшот по тому же имени не хочет брать.
PHP:
stdClass Object
(
    [timestamp] => 1509367742361
    [status] => 500
    [error] => Internal Server Error
    [exception] => com.flashphoner.server.manager.controller.exception.InternalErrorException
    [message] => RtspAgent rtsp://ip:554/user=admin&password=&channel=1&stream=1?.sdp already exist
    [path] => /rest-api/rtsp/startup
)
stdClass Object
(
    [timestamp] => 1509367742677
    [status] => 404
    [error] => Not Found
    [exception] => com.flashphoner.server.manager.controller.exception.NotFoundException
    [message] => NOT FOUND
    [path] => /rest-api/stream/snapshot
)
 

Max

Administrator
Staff member
Да, воспроизвели что не находит в сборке 2534.
REST снапшоты тестировали только с потоками с веб-камеры. С ними работает.
С RTSP воспроизвели проблему. Будем исправлять.
 

Max

Administrator
Staff member
Исправили в сборке 2541.
Проверили. REST - cнапшоты работают на обоих типах стримов RTSP (с камеры) и WebRTC (из Chrome).
 

pnzdevelop

Member
Отлично! Файл получаю и сохраняю. Далее появилась проблема с "серым квадратом"
Что через js, что через php со временем получаю картинку https://imgur.com/nt0DVeX
Помогает "перезапуск" трансляции terminate/startup

Например запускаем одновременно запрос с 26 камер, несколько раз и с нескольких страниц. Видимо что то происходит с флешфонером
 
Last edited:

Max

Administrator
Staff member
проблема с "серым квадратом"
Да, может быть воспроизведена с вашим потоком. Как будет дальнейшая информация - сообщим.

Кроме того, при использовании REST-запроса мог быть получен ответ с неполными данными - исправлено в версии 2551.
 
Top