LINUX.ORG.RU

Потоковое видео в реальном времени с помощью вебсокетов

 , , ,


0

3

Итак, задача: с N видеокамер покадрово снимается при помощи ffmpeg видеопоток и обрабатывается. В циклическом буфере в разделяемой памяти эти картинки постоянно висят (а также туда складывается дополнительная информация + индекс последнего сохраненного изображения). Нужно клиенту (firefox) вывести в веб-странице это видео со скоростью, которую позволяет канал.

Как это делалось раньше: CGI посылал jpeg'и с разделителем, которые отображались в <img>, обновляемом по таймеру. Это было не очень хорошо + требовало постоянно перезагружать веб-страничку (т.к. браузеры до сих пор текут!).

Хочется: отображать видео, которое не будет приводить к утечке памяти в браузере. Но не представляю, как это реализовать.

Клиент постоянно соединен с сервером через вебсокет (по нему идут асинхронные команды и ответы сервера), т.е. можно писать в вебсокет команду «дай мне следующий кадр» и забирать его как-нибудь.

Но как по-человечески отображать, чтобы не текла память браузера? Если опять передавать jpeg'и (пусть через вебсокет) и в канве их рисовать, то память будет течь (т.к. до сих пор в браузерах не реализовали сборщик мусора).

На ум приходит псевдо-html5-streaming. Но не приходит, как сделать.

Подкиньте идей, пожалуйста.

☆☆☆☆☆

Последнее исправление: CYB3R (всего исправлений: 1)

Ответ на: комментарий от anonymous

тук-тук

не годится

Браузер — последний приличный firefox (24.8.1), минимальное время жизни — хотя бы сутки (раз в сутки можно и обновить страничку), максимальное потребление памяти страничкой — 100МБ (и то, считаю это дикостью).

давай ещё минимальный тест

?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Картинка кэшируется? А если в HTTP-заголовках запретить кэшировать?

Не должно ничего просто так течь. У меня приложение на node-webkit (angular, pouchdb, express) неделями работает на 512МБ памяти, и то останавливаю только для бэкапа.

Black_Roland ★★★★
()

О, таки смотрю дело пошло. Связался значит с Ярославом? Как там оно вообще? Нормально?

По делу:

А где именно они текут? В момент замены значения src у картинки или где?

deep-purple ★★★★★
()
Ответ на: комментарий от Black_Roland

Картинка кэшируется?

Нет, live же.

А если в HTTP-заголовках запретить кэшировать?

При чем здесь кэш?

Не должно ничего просто так течь.

текло, течет и течь будет.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от deep-purple

Не, еще не связался.

В момент замены значения src у картинки или где?

delete() не освобождает память

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Кароч если на удаляемый объект (именно объект) гдето по коду есть еще ссылки - то он не будет удален. За этим в жабоскрипте надобно следить.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Ой, ну чутка не так сказал, но смысл по сути верный.

deep-purple ★★★★★
()
Ответ на: комментарий от Eddy_Em

текло, течет и течь будет

кодеры говнокодили, говнокодят и будут говнокодить

Black_Roland ★★★★
()
Последнее исправление: Black_Roland (всего исправлений: 1)
  • Реализуй поддержку потокового видео в firefox, подожди пока поддержка доберётся до ESR;
  • возьми gecko-mplayer, гони поток как есть;
  • собери вместе JS-декодер и JS-демьюксер, выводи видео через canvas. Декодер уже где-то есть, в новостях проскакивало;
  • возьми готовый плеер на Flash, используй проприетарный Flash player;
  • допили lightspark, чтобы под ним работал готовый flash плеер.
i-rinat ★★★★★
()
var $img = $('#image'); // картинка с кадром видео
var $cachedImg = $('<img />').on('load', function() {
  $img.attr('src',  $cachedImg.attr('src'));
  window.setTimeout(update, 5000);
});
var update = function() {
  $cachedImg.attr('src', 'http://a.b/c.jpg?'+ Math.random());
}
update();

писал с телефона, мог ошибиться, но суть ясна

Black_Roland ★★★★
()
Ответ на: комментарий от i-rinat

Реализуй поддержку потокового видео в firefox

было бы неплохо ссылочкой поделиться

возьми gecko-mplayer, гони поток как есть

?

собери вместе JS-декодер и JS-демьюксер

не годится — тормоза

возьми готовый плеер на Flash

вообще не годится — это мало того, что навоз, так еще и протухший!

допили lightspark, чтобы под ним работал готовый flash плеер

еще од

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от iVS

не в ESR, а в Australis

Термин ESR знаю, но он не имеет никакого отношения к вебу. Это в радиоэлектронике. А при чем здесь Австралия?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от iVS

Я говорю про последний из живых огнелисов — 24.8.1. Новый ынтырфейс видел. Боюсь, что если 24-я версия сдохнет, придется запретить обновление огнелиса, т.к. хромоподобное говно мне не нужно.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Реализуй поддержку потокового видео в firefox

было бы неплохо ссылочкой поделиться

https://hg.mozilla.org/mozilla-central/

Ты же не думал, что всё будет легко, да? :-)

возьми gecko-mplayer, гони поток как есть

?

https://code.google.com/p/gecko-mediaplayer/

i-rinat ★★★★★
()

Скармливай наборы небольших роликов браузеру на склейку потока. Опрос сервера делай воркерами (SSE) и придётся повозиться с плейром или адаптировать какой-то из успешных откртытых.

anonymous
()
Ответ на: комментарий от Black_Roland

Ну так хочется чего-нибудь попроще

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от anonymous

Апплет не годится, т.к. жаба. Кстати, в firefox жабоапплеты не работают

Скотский ондроед! Нет greasemonkey, tampermonkey не работает и в firefox нет настроек! Ненавижу!!!

Eddy_Em ☆☆☆☆☆
() автор топика
Последнее исправление: Eddy_Em (всего исправлений: 1)

Вот блин! Вообще ничего вменяемого нагуглить не могу, что не привело бы к утечке памяти! Вот как мне jpeg-и показывать как видео?

Eddy_Em ☆☆☆☆☆
() автор топика

Ну я даже не знаю...
С одной стороны, можно подождать, пока в Firefox реализуют поддержку HTTP Live Streaming «и не морочити собi голову».

С другой стороны, ты говоришь, Firefox для тебя умер, поэтому твой вопрос относится к той же категории, что «Как сделать так, чтобы сайт на HTML5 работал в IE6», только теперь из принципиальных соображений.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Однако вот кто-то попытался запилить поддержку HLS на имеющихся технологиях:

https://rreverser.github.io/mpegts/

А вообще суть такова: просто делай на сервере потоки WebM, нарезанные на куски, скармливай их клиенту. Как у тебя сейчас JPEG'и, только WebM.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)
Ответ на: комментарий от proud_anon

Firefox для тебя умер

Отнюдь. Умерли только старшие версии с хромоподобным интерфейсом. В общем, где вырвиглазие жесточайшее.

потоки WebM

Там пишут "latest Firefox" — не годится. Ладно, клиенты, а я сам как проверять буду? В хромоногом уродстве что ли?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

начни с mdn memory leak javascript

вот релевантный пример:

var o = { 
  a: {
    b:2
  }
}; 
// 2 objects are created. One is referenced by the other as one of its property.
// The other is referenced by virtue of being assigned to the 'o' variable.
// Obviously, none can be garbage-collected


var o2 = o; // the 'o2' variable is the second thing that 
            // has a reference to the object
o = 1;      // now, the object that was originally in 'o' has a unique reference
            // embodied by the 'o2' variable

var oa = o2.a; // reference to 'a' property of the object.
               // This object has now 2 references: one as a property, 
               // the other as the 'oa' variable

o2 = "yo"; // The object that was originally in 'o' has now zero
           // references to it. It can be garbage-collected.
           // However what was its 'a' property is still referenced by 
           // the 'oa' variable, so it cannot be free'd

oa = null; // what was the 'a' property of the object originally in o 
           // has zero references to it. It can be garbage collected.

Там этого добра навалом, особенно про твои любимые таймеры. Про замыкания еще есть полезные фичи насчет утечек. Там-же: ищи в примерах.

Еще штудируй ajaxian, news.ycombinator

anonymous
()
17 декабря 2014 г.

Блин, гуглил-гуглил и решил, что ничего лучше того костыля, что был, не существует до сих пор!

Чертов HTML5 не готов для элементарного live-streaming'а видео!

Офигеть...

Буду ffmpeg'ом брать последний кадр с видеокамеры, обрабатывать и выплевывать жопег в циклический буфер. Т.е. как раньше было, только вместо прямого v4l2 использовать обертку ffmpeg'а, а то уж больно задолбало код переписывать для каждого конкретного тюнера.

Ну, а в браузере либо по-старинке дергать 5-20 раз в секунду CGI, получая последний кадр, либо забирать его вебсокетом и отображать в iframe. А этот iframe каждые минут 5 перезагружать, чтобы браузер не был убит oom-killer'ом.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Я живой стриминг в браузер по HTTP видел разве что у шестого осла в 2007 году. Через ActiveX конечно же. Это проделывала IP-камера D-LINK.

Что не характерно для длинка, оно не текло, не падало - неделями шуршало себе без продыху.

gbg
()
Ответ на: комментарий от gbg

Дык, нужно-то нормальное человеческое потоковое видео без этих идиотских активхренов или быдлофлешей.

Eddy_Em ☆☆☆☆☆
() автор топика

можешь посмотреть на mediasource extensions, на которых MPEG DASH плеер работает. но это, конечно, свежайший ff/хром/ie. суть - нарезаешь видео на немного специфические mp4, скачиваешь их на клиента, суешь в буфер <video/>, profit.

а так, по треду, я что-то не пойму - тебе шашечки или ехать? несчастный флеш вполне себе работает, есть videojs-contrib-hls+videojs-contrib-mediasource с фоллбэком на все тот же флеш, есть нормальные стриминг-сервера, типа erlyvideo/flussonic. да, везде свои недостатки и сейчас в html нет никакого единого лайв-стриминга, но люди ж что-то делают и все как-то работает.

nwalker
()
Ответ на: комментарий от nwalker

флеш

Ни в коем разе! Еще мне этого говна не хватало. Я уж лучше буду mjpeg'и кидать и перезагружать каждую минуту iframe с "видео".

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Чертов HTML5 не готов для элементарного live-streaming'а видео!

То, что делаешь ты - не стриминг видео, а костыли. Неудивительно, что это работает как костыли.

AnDoR ★★★★★
()

Но как по-человечески отображать, чтобы не текла память браузера

раз ты видишь проблему,то и знаешь ответ-НИКАК

конечно не никак,банальные советы которые сам знаешь-делать релоад страницы каждые xxx секунд по таймеру джаваскриптом

или патчить какойто простой браузер под задачу

или сделать плагин для браузера(бинарный естественно) через который транслировать

самый надежный-бинарный плагин крутящийся в своей памяти который только показывает через окно браузера

anonymous
()

ах да,нопамню-ка ты год-два назад неистово защищал вебсокеты и джаваскрипт как БУДУЩЕЕ всепрограммирования

бугагашенька

и не воспринимал критику про то что сложнее хеловорда ты на этом г- ничего не сделаешь

дожили))

anonymous
()
Ответ на: комментарий от anonymous

У меня сейчас управление железкой через вебсокеты работает. Нужно лишь видео прикрутить, и будет оконченный продукт.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от AnDoR

костыли

Ясен пень: т.к. html5 не умеет стриминг видео, приходится костылить. А умел бы — такой проблемы бы не было!

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Умеет в драфте MSE, раньше не умел. Но драфт же тебя не устраивает, тебе же надо какой-то бородатый недобраузер.

nwalker
()
Ответ на: комментарий от nwalker

MSE

Що це таке?

И браузер, естественно, нужен стабильный. На данный момент это 24.8.0. И, похоже, более свежих версий и не предвидится, т.к. они в говно превратились как по функционалу, так и по внешнему виду.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

media source extensions = MSE, я уже их упоминал.

я ничего не знаю ни про какие стабильные версии, если хочешь использовать драфты нормальных вещей - будешь делать под последний браузер. не хочешь - строй костыли, jpg по вебсокетам, это же надо было придумать.

nwalker
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.