- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
package com.company;
public class Main {
public static void main(String[] args) {
int answer = 0;
for (int i = 100; i < 1000; i++){
for (int j = 100; j < 1000; j++){
int result = i * j;
String str = String.valueOf(result); //convert
String revers = new StringBuffer(str).reverse().toString(); //revers
int newb = Integer.parseInt(revers); //convert
if (newb == result){
int answer001 = result;
if (answer001 > answer) answer = answer001;
}
}
}
System.out.println(answer);
}
}
MAKAKA 01.08.2020 20:33 # 0
bormand 01.08.2020 20:49 # 0
MAKAKA 01.08.2020 20:58 # 0
bormand 01.08.2020 21:03 # +1
MAKAKA 01.08.2020 21:04 # 0
Лучше уж напитонячить тогда: там это будет не так ужасно
bormand 01.08.2020 21:05 # 0
MAKAKA 01.08.2020 21:17 # 0
gost 01.08.2020 21:05 # 0
Подтверждаю. Не отклоняясь от изначального алгоритма:
MAKAKA 01.08.2020 21:07 # 0
Видимо, внутренний линтер зависит от языка
bormand 01.08.2020 21:08 # 0
MAKAKA 01.08.2020 21:14 # 0
bormand 01.08.2020 21:18 # 0
Зачем? Зачем? В общем-то и в версии ОПа можно было остановиться на str == revers.
MAKAKA 01.08.2020 21:19 # 0
В общем, создавать буферы в цикле бы точно не хотелось
bormand 01.08.2020 21:19 # 0
MAKAKA 01.08.2020 21:21 # 0
bormand 01.08.2020 21:07 # 0
Именно поэтому я за пхп.
P.S. И ведь хрен ты придумаешь более красивое и наглядное решение.
warzon131 01.08.2020 21:06 # 0
gost 01.08.2020 21:17 # +1
Можно оптимизировать (например, прекращать вычисления, когда оба множителя меньше наименьшего из предыдущей найденной пары), но мне лень.
bormand 01.08.2020 21:22 # +1
guest8 01.08.2020 21:26 # −999
bormand 01.08.2020 21:38 # 0
MAKAKA 01.08.2020 21:42 # 0
bormand 01.08.2020 21:44 # 0
MAKAKA 01.08.2020 21:48 # 0
bormand 01.08.2020 21:23 # 0
Побочные эффекты посреди выражений!? Бля, это серьёзно завезли в питон? ЗАЧЕМ? ЗАЧЕМ?
guest8 01.08.2020 21:24 # −999
bormand 01.08.2020 21:26 # 0
guest8 01.08.2020 21:28 # −999
3.14159265 01.08.2020 22:36 # 0
Подтверждаю.
gost 01.08.2020 21:28 # +1
Какой анскилл (((
guest8 01.08.2020 21:30 # −999
gost 01.08.2020 21:40 # 0
Царская функция дробит числа, а как числодробилка нативный «Питон» работает до крайности хуёво.
gost 01.08.2020 21:43 # 0
MAKAKA 01.08.2020 21:47 # +1
gost 01.08.2020 21:52 # 0
MAKAKA 01.08.2020 21:57 # 0
На жабе троже
В 10 раз, в 10 блядь раз
bormand 01.08.2020 22:08 # 0
С учётом прибавления и отнимания '0' и трёх аллокаций выглядит совсем неплохо. Я думал хуже будет.
MAKAKA 01.08.2020 22:21 # 0
Но в кучу анскильный вариант срёт знатно, конечно
Зацени
https://postimg.cc/xXQynRK5
bormand 01.08.2020 22:26 # 0
guest8 01.08.2020 22:27 # −999
warzon131 01.08.2020 22:32 # 0
3.14159265 01.08.2020 22:38 # +1
Ненормально было бы если бы понимал.
guest8 01.08.2020 22:39 # −999
bormand 01.08.2020 22:41 # 0
Ты платишь фиксированную цену за запуск гц и обход стека каждые N мегабайт. Но мертвые объекты же недостижимы, их двигать не надо.
На мелких временных аллокациях джава в клочья сишку порвёт, имхо. Если сишник не будет читерить с переменными на стеке, конечно.
guest8 01.08.2020 22:48 # −999
3.14159265 01.08.2020 22:48 # +1
Хуета.
Полная хуета.
>Если сишник не будет читерить с переменными на стеке, конечно.
Царь даже без стека эту хуйню сольёт.
Если я хуйну SLAB-аллокацию или заранее выделю себе mmapом мегабайты памяти, как это делает Йажа, то она опять сольётся в хламину.
Йажа-сектанты часто пишут бенчи в стиле: Сишные malloc+free vs преаллоциорованный гиг памяти в Йажа, причём бенчмарк заканчивается ещё до первой сборки. См. -Xmx 1Gb
После чего делаются многозначительные выводы и пишутся статьи для хабархабра: «Придуман новый язык, быстрее чем Си».
guest8 01.08.2020 23:37 # −999
gost 01.08.2020 23:39 # 0
Инты в ЙАЖЕ как раз хранятся на стеке, если их в коробки не завернули. В отличие от «Python», в котором каждая арифметическая операция — это создание нового объекта с соответствующим дёрганьем кучи. Собственно, почему он так и тормозит на царском алгоритме.
guest8 01.08.2020 23:42 # −999
gost 01.08.2020 23:44 # 0
Есть, до 255-и, кажется. Или поменьше, не помню.
guest8 01.08.2020 23:46 # −999
gost 01.08.2020 23:49 # 0
guest8 01.08.2020 23:53 # −999
gost 01.08.2020 23:55 # 0
guest8 02.08.2020 00:00 # −999
gost 02.08.2020 00:01 # 0
Нет, необходимости не было.
guest8 02.08.2020 00:04 # −999
gost 02.08.2020 00:07 # 0
А ещё к «Питону» можно прикрутить «JIT»: https://numba.pydata.org/. Говорят, помогает.
guest8 02.08.2020 00:09 # −999
gost 02.08.2020 00:13 # 0
gost 02.08.2020 00:15 # 0
В 8.7 раз быстрее максимально ускоренной анскильной (см. ниже) на первом запуске, в 43 раза быстрее на последующих.
gost 02.08.2020 00:40 # 0
Бамп отсосу «JavaScript»!
bormand 01.08.2020 21:35 # +1
Вот тебе и преждевременная оптимизация.
gost 01.08.2020 21:38 # 0
gost 01.08.2020 22:13 # 0
gost 01.08.2020 22:41 # 0
3.14159265 01.08.2020 22:35 # 0
Слайсы ебошит нативная сишка. А деления анскильный Питух.
Лалки обсирали jsую идиому str.split('').reverse().join('')
Однако же:
guest8 01.08.2020 22:40 # −999
bormand 01.08.2020 22:47 # 0
guest8 01.08.2020 22:52 # −999
3.14159265 01.08.2020 22:44 # 0
Я к тому что этот метод довольно долгое время был самым быстрым.
Похоже в браузерах пустые сплиты/джойны шли по отдельному оптимизированному пути.
bormand 01.08.2020 21:27 # 0
Я вот думаю они и тут без перебора решили.
guest8 01.08.2020 21:29 # −999
Myxa 01.08.2020 22:51 # 0
guest8 01.08.2020 22:59 # −999
bormand 01.08.2020 23:25 # +2
Desktop 01.08.2020 23:34 # 0
bormand 01.08.2020 23:38 # 0
Desktop 01.08.2020 23:40 # 0
Я про софт, который у стримера стоит. Захват видео, кодирование, передача.
Типа хуета это всё?
gost 01.08.2020 23:43 # 0
Дык что его разрабатывать, он уже в опенсорсе есть: https://github.com/obsproject/obs-studio.
Desktop 01.08.2020 23:45 # 0
Какой высокотехнологичный стартап )))
bormand 01.08.2020 23:47 # 0
Desktop 01.08.2020 23:50 # 0
> Нахуй плодить сущности?
- как будто ты не знаешь про nih
gost 01.08.2020 23:54 # 0
А это будет тяжелейшим выстрелом в ногу. Абсолютное большинство крупных стримеров (т.е. все те, кто приносят «Твичу» бабло) стримят не напрямую, а через что-то типа https://restream.io/ — штуковины, которая размножает поток на несколько платформ с опциональным добавлением всяких межплатформенных фишек. И работает это потому, что протоколы для стриминга открыты и стандартизованы.
Desktop 01.08.2020 23:56 # 0
Так что я бы скорее подумал, что им этот рестрим поперёк горла
gost 01.08.2020 23:59 # 0
Ну да, он у них зрителей отнимает. Но жёстко с ним бороться они не могут просто потому, что тогда от них уйдут стримеры, а это куда больнее.
guest8 02.08.2020 00:01 # −999
gost 02.08.2020 00:03 # 0
Desktop 02.08.2020 00:05 # 0
guest8 02.08.2020 00:08 # −999
Desktop 02.08.2020 00:14 # 0
- как говорится, если в жизни мало секса, иди понастраивай IPTV
guest8 02.08.2020 00:26 # −999
gost 01.08.2020 23:48 # 0
*Клиент у «Твича», на самом деле, имеется, но он нужен только для просмотра каналов и сбора дополнительных данных пользователей.
bormand 01.08.2020 23:44 # 0
3.14159265 02.08.2020 01:53 # 0
Бууэээ. На курятнике писать энкодер для AV1. Твич поставил на rav1e.
https://github.com/xiph/rav1e
Который наглухо сливает всем сишноплюсовым (aom, SVT-AV1) конкурентам и по скорости и по зожатию.
При том что по времени они все начали писать их примерно одновременно.
Desktop 02.08.2020 01:56 # 0
gost 01.08.2020 23:42 # 0
Хотя я не уверен, возможно, и это тоже должно быть на компе сделано.
ИМХО, самое интересное там — это сетевая рахитектура, которая должна раскидывать гигантское количество трафика с минимальными задержками (2 секунды отставания от стримера, например).
bormand 01.08.2020 23:57 # 0
Я могу ошибаться, но по-моему low-res потоки тоже на компе стримера создаются. Ща проверю.
> сетевая рахитектура
Я не думаю, что там прям что-то гениальное... Скорее всего обычное дерево с датацентром в каждом регионе.
А на задержку там всем похуй на самом деле, ну ответит тебе стример на 5 секунд позже, не помрёшь.
guest8 01.08.2020 23:58 # −999
bormand 02.08.2020 00:13 # 0
guest8 02.08.2020 00:19 # −999
Desktop 02.08.2020 00:21 # 0
bormand 02.08.2020 00:22 # 0
guest8 02.08.2020 00:27 # −999
defecate-plusplus 02.08.2020 00:40 # 0
Для ~ реалтайма надо тащить вебсокет/вебртц
guest8 02.08.2020 00:42 # −999
gost 02.08.2020 00:46 # 0
guest8 02.08.2020 00:49 # −999
gost 02.08.2020 00:51 # 0
Стримить не через сервер вообще сложновато. Ты что, предлагаешь стримеру отправлять копию видеопотока десятку-другому тысяч зрителей напрямую?
guest8 02.08.2020 00:54 # −999
bormand 02.08.2020 00:51 # 0
Ну мы же сейчас не про скайп, а про раздачу потока тысячам зрителей. Никто в здравом уме там не будет напрямую коннектица, у стримера комп и без этого перегружен.
guest8 02.08.2020 00:54 # −999
bormand 02.08.2020 00:57 # 0
Х.з., исторически сложилось. Там же "протокол" у этих DASH и HLS - это тупо плейлист из чанков. Можешь закинуть их на сервер статикой и смотреть. Можешь в реалтайме отдавать.
guest8 02.08.2020 00:58 # −999
bormand 02.08.2020 00:59 # 0
guest8 02.08.2020 01:01 # −999
bormand 02.08.2020 01:03 # 0
guest8 02.08.2020 01:06 # −999
bormand 02.08.2020 01:09 # 0
guest8 02.08.2020 01:11 # −999
gost 02.08.2020 01:14 # 0
Ну если ты готов терпеть постоянно рассыпающийся видеопоток ради снижения задержки на десяток-другой секунд…
guest8 02.08.2020 01:18 # −999
Desktop 02.08.2020 01:20 # 0
gost 02.08.2020 01:22 # 0
Desktop 02.08.2020 01:24 # 0
3.14159265 02.08.2020 01:23 # 0
А, пацаны. Это хуйня всё. Вы не шарите. Эти проблемы давным-давно решены несколькими различными способами.
Почитайте про intra-refresh. Он волной макроблоки обновляет. Был ещё в x264.
Periodic Intra Refresh instead of keyframes, which enables each frame to be capped to the same size enabling each slice to be immediately transmitted in a single UDP or TCP packet and on arrival immediately decoded.
Periodic Intra Refresh can replace keyframes by using a column of intra blocks that move across the video from one side to the other, thereby "refreshing" the image. In effect, instead of a big keyframe, the keyframe is "spread" over many frames. The video is still seekable: a special header, called the SEI Recovery Point, tells the decoder to "start here, decode X frames, and then start displaying the video." This hides the refresh effect from the user while the frame loads. Motion vectors are restricted so that blocks on one side of the refresh column don't reference blocks on the other side, effectively creating a demarcation line in each frame.
guest8 02.08.2020 01:32 # −999
Desktop 02.08.2020 01:33 # 0
guest8 02.08.2020 01:35 # −999
3.14159265 02.08.2020 01:44 # 0
Может пара кадров проебаться, но буфер весьма быстро восстановится.
Вертикальная полоска за 5-10 кадров сделает полный self-refresh. И не надо ждать I-frame.
Ценой этого чуть более низкое зожатие.
Смысл в том, что в P-кадре или B-кадре могут быть I-блоки, которые ни от чего не зависят.
bormand 02.08.2020 01:46 # 0
gost 02.08.2020 01:25 # 0
Потому что так потери пакетов работают. У тебя просто постоянно теряется N процентов пакетов.
> У меня помеха пошла по docsis на N ms.
При чём тут «DOCSIS»-то? Мы про «Ethernet» говорим.
> а в TCP я тупо отстал навсегда, хоть и не потерял кадр
Да, при этом чем больше отставание — тем меньше вероятности, что следующие потери истощат буфер.
> Оно того стоит?
В массовом сегменте — да.
guest8 02.08.2020 01:28 # −999
gost 02.08.2020 01:41 # 0
Совершенно да.
> Если у меня временные проблемы, то почему они должны быть всегда?
Это не временные трудности, это постоянные проблемы. В обычном интернете у тебя всегда теряется какая-то часть пакетов, иногда больше, иногда меньше.
> Интернету же пофиг, поврех чего работать.
Интернету пофиг, но сейчас он работает поверх «Ethernet» и оптики. Или ты предлагаешь все кабели в Интернете поменять?
> если мне нормально отстать на три секунды, но при этом НЕ потерять ни одного видеокадра
Да. Смотреть видео с постоянными перерывами — это пиздец как раздражает, пользователи этим заниматься не будут.
guest8 02.08.2020 01:47 # −999
bormand 02.08.2020 01:50 # 0
А может быть и не временным. Заранее ты не угадаешь. Но один артефакт/буферинг зритель потерпит. На втором начнёт плеваться и уйдёт на другой сервис у которого с задержкой но стабильно.
И ты не объяснишь человеку, что это его личная проблема с интернетом. Другие сервисы же нормально идут, лол.
Desktop 02.08.2020 01:54 # 0
В своё время ЮТуб был диким тормозом, но народ на какой-нибудь Vimeo массово не побежал.
Вопрос в контенте и позиционировании. А стандарты качества у массового пользователя упали, к сожалению
guest8 02.08.2020 01:56 # −999
gost 02.08.2020 02:01 # 0
Для любования на квадраты через «UDP» тебе не нужна потеря половины пакетов, тебе достаточно терять сотые/тысячные доли процента. А это — вполне нормальный режим работы Интернета.
bormand 02.08.2020 02:03 # 0
Особенно если рядом торрент качается, лол.
bormand 02.08.2020 02:04 # 0
Desktop 02.08.2020 02:08 # 0
bormand 02.08.2020 02:09 # 0
Собственно на 10% я уже позвонил провайдеру.
gost 02.08.2020 01:58 # 0
То, потери пакетов в обычном режиме очень небольшие, сотая доля процентов, например. Простым пингом на четыре пакеты ты их, разумеется, не увидишь.
Типичный стрим — это постоянный видеопоток примерно на 5 мегабайт в секунду полезных данных (40 мегабит). Путём несложных грубых вычислений можно убедиться, что 5 мегабайт в секунду с MSS 1400 — это как минимум 5* 1024**2 // 1400 = 3744 IP-пакета в секунду. То есть, если у тебя теряется 0.003% (три тысячных доли процента) пакетов, то наблюдать квадратики ты будешь раз в десять секунд. Через «TCP», в свою очередь, ты таких потерь в принципе не заметишь.
> Да ну? А поверх 11n он не работает, когда ты внутри ESS переключился на другую станцию, и в этот момент проебал пакет?
Я вообще-то про магистрали, но да ладно, похуй.
guest8 02.08.2020 02:03 # −999
gost 02.08.2020 02:06 # 0
Ну что ж такое, мы же это уже выяснили.
>>> Таким образом, я сосу болта до следующего ключевого кадра, верно?
Ты будешь смотреть на квадратики по одной-двум секундам раз в десять секунд (я — на квадратики по одной-двум секундам раз в пол-секунды, ага).
> Разве пользователь сидит не дома?
Потому что пакеты теряются далеко не только на линии между пользователем и оборудованием провайдера. Они теряются на всём пути от сервера «Твича» и до компьютера пользователя.
guest8 02.08.2020 02:11 # −999
bormand 02.08.2020 02:12 # 0
guest8 02.08.2020 02:13 # −999
defecate-plusplus 02.08.2020 09:04 # 0
Не выезжая из Москвы
bormand 02.08.2020 09:11 # 0
gost 02.08.2020 02:17 # 0
Это означает, что пользователь будет смотреть на чёрный квадрат/месиво из квадратиков. Не заметить такое можно только когда ты отвернулся от экрана.
P. S. Минус нечаянно въебал, извини.
bormand 02.08.2020 02:19 # 0
gost 02.08.2020 02:20 # 0
gost 02.08.2020 02:03 # 0
Два потерянных пакета на 6293 посланных. То есть, в примере с пятимегабайтным потоком, я буду наблюдать квадратики примерно два раза в секунду.
guest8 02.08.2020 02:08 # −999
guest8 02.08.2020 02:12 # −999
gost 02.08.2020 02:16 # 0
guest8 02.08.2020 02:21 # −999
gost 02.08.2020 02:22 # 0
(Тут я минуту держал вместо пяти)
guest8 02.08.2020 02:23 # −999
gost 02.08.2020 02:26 # 0
Ну можно ещё килобатными пакетами попинговать для большего приближения к реальности, ну да это неважно.
> Проеблось 3 пакета из 38164
То есть примерно каждые три секунды ты будешь наблюдать квадратики. Именно для этого и нужен «TCP».
guest8 02.08.2020 02:32 # −999
gost 02.08.2020 02:50 # 0
Зависит от кодека, но никак не меньше нескольких (возможно, десятков) кадров. Повторюсь, не заметить такое сложно.
> Надо еще учитывать, что ya.ru это не видеохостинг, и отвечать мне на ping они вообще не обязаны.
Для любых других серверов картина ничуть не лучше. Постоянная небольшая потеря пакетов — это зло, от которого избавиться в принципе невозможно. Ну, разве что провести оптику от твоего компа к серверу «Твича».
Кстати, я совершенно забыл упомянуть, что порядок прихода пакетов в «UDP» не гарантирован. Поэтому для передачи видео по «UDP» тебе в любом случае придётся реализовывать подмножество «TCP» с сегментами и их буфером.
guest8 02.08.2020 02:31 # −999
gost 02.08.2020 02:41 # 0
> TCP более предпочтителен: он забуферизирует данные, сделав процесс smooth для пользователя: он будет перепосылать сегменты, пока пользователь смотрит видео.
На самом деле не совсем. Существует два буфера: системного уровня, который заполняется ядром (драйвером TCP/IP), и буфер браузера. В первом хранятся сегменты TCP, во второй браузер складывает кадры видео.
«TCP» гарантирует, что последовательность байт, отправленная с сервера, обязательно дойдёт до клиента без изменений и в правильном порядке (что тоже крайне важно, кстати). Буферизация видео браузером, в свою очередь, обеспечивает пользователю плавное воспроизведение даже тогда, когда приход очередной порции байт с сервера задерживается (драйвером TCP/IP) из-за потерь пакетов.
> Однако, TCP это бОльшая нагрузка на CPU.
По сравнению с декодированием 60@FHD видео — это настолько мелкие копейки, что ими нужно пренебречь.
> Итого: если мы уверены в более-ли-менее качественном интернет-соединении, то имеет смысл использовать UDP.
Да, но такое будет только если сервер и клиент соединены напрямую одним кабелем. И даже в этом случае пользователь может поставить качаться торрент и получить багор.
Увы, Интернет — крайне непредсказуемое говно, поэтому получить по-настоящему надёжное соединение до удалённого сервера, к сожалению, невозможно. Возвращаясь к примеру выше, чтобы надёжно передавать видеопоток через «UDP» и получать квадраты хотя бы не чаще раза в минуту, нужно терять не больше одного пакета из 224640.
guest8 02.08.2020 02:50 # −999
gost 02.08.2020 02:58 # 0
Настолько мизерные крохи ресурсов, что ими можно и нужно пренебречь. Там одно только TLS-шифрование потока сожрёт на два порядка больше ресурсов, чем обработка «TCP».
> Тогда почему у меня нормально работает IPTV по мультикасту от провайдера?
Нужно смотреть протокол и кодирование. Я же не говорю, что по «UDP» в принципе нельзя передать видео, я говорю о том, что это очень сложно и геморройно. Можно жать кадры по отдельности, тогда небольшая потеря пакетов действительно не будет заметна. Можно впендюрить десяток-другой процентов избыточности. Ещё как-нибудь извратиться.
Спокойной ночи.
gost 02.08.2020 01:03 # 0
guest8 02.08.2020 01:07 # −999
bormand 02.08.2020 01:10 # 0
Там такая дикая зависимость между кадрами, что всё на квадратики рассыпется до следующего ключевого. Не особо лучше чёрного экрана.
guest8 02.08.2020 01:12 # −999
gost 02.08.2020 01:15 # 0
Тем, что «buffering» тебе покажется один раз. Потом буфер разработается и никакой буферизации у тебя не будет.
guest8 02.08.2020 01:17 # −999
bormand 02.08.2020 01:19 # 0
guest8 02.08.2020 01:20 # −999
Fike 02.08.2020 12:12 # 0
извините, я не смог не
gost 02.08.2020 01:12 # 0
> ты проебал пакет, и получит передачу всего говна
Что? Какого говна?
3.14159265 02.08.2020 01:14 # 0
Не совсем правда.
Можно удачно проебать B-frame, на который никто не ссылается.
Можно проебать P-frame, но на следующем обновить.
Кодеки очень адаптивные и резистетные к ошибкам на самом деле.
Очень сильно зависит от настроек адаптивности энтропии и кодека.
guest8 02.08.2020 01:15 # −999
bormand 02.08.2020 01:20 # 0
Не, на него хуй забьют. buffering будет пока буфер не наполнится на безопасную для твоего канала глубину.
guest8 02.08.2020 01:21 # −999
gost 02.08.2020 01:20 # 0
Нет. Потеряться может только IP-фрейм (1500 байт брутто). В таком случае «TCP» просто передаст этот фрейм ещё раз.
> Рассмотрим ситуацю, когда ты потерял НЕ ключевой кадр.
> В UDP ты этого не заметишь
Нет, не так. Если я потерял НЕ ключевой кадр, то у меня ВСЕ последующие НЕ-ключевые кадры превратятся в квадратики. То есть, в зависимости от кодека, я буду эдак секунду-другую (точное время надо у кодировочных петухов спрашивать) смотреть на квадраты.
> в TCP ты будешь вынужден смотреть на "buffering", пока ты не переполучишь кусок с потерянным кадром, нет?
Нет, см. первый абзац.
guest8 02.08.2020 01:24 # −999
gost 02.08.2020 01:35 # 0
Перепутал с «Ethernet».
> TCP передаст сегмент целиком, не?
Да. При этом сегменты запихиваются в IP-пакеты, поэтому один сегмент — это не больше 1500 байт. См. «MSS».
> Разве не ключевой кадр это не diff к предыдущему ключевому?
Ключевой кадр — это, грубо говоря, просто пожатая стандартными алгоритмами картинка, JPEG. Диффы последующих не-ключевых кадров считаются от него. То есть (опять же, очень грубо говоря, видеопетухи поправят) тебе передаётся (key_frame, data_1, data_2, ...); frame_1 = diff(key_frame, data_1), frame_2 = diff(frame_1, data_2), frame_3 = diff(frame_2, data_3), etc. Каждый последующий не-ключевой кадр зависит от предыдущего, как в «AES CBC».
guest8 02.08.2020 01:42 # −999
gost 02.08.2020 01:50 # 0
Да.
> я или смотрю на квадратики до следующего ключ кадра, или смотрю на "buffering"
Нет. Ключевая разница в том, что в «TCP» ты смотришь на «buffering» один раз, после чего буфер у тебя разрабатывается, и дальше ты видишь только плавную картинку без единого разрыва.
> то ключевой кадр может быть размазан на несколько пакетов
Не знаю, не видел этой технологии.
guest8 02.08.2020 01:52 # −999
bormand 02.08.2020 01:57 # 0
Т.е. если у тебя буфер 10 секунд, то у тебя есть почти 10 секунд на загрузку каждого чанка. Ну и собственно отстаёшь от реалтайма ты на эти самые 10 секунд. TCP за это время без проблем успевает всё перепослать и переполучить.
Ну а если канал пиздец хуёвый и не успевает - значит будешь жить с буфером в 20 секунд. Хотя обычно после такого просто качество скидывают.
guest8 02.08.2020 02:00 # −999
defecate-plusplus 02.08.2020 08:56 # 0
Ты качаешь по хттп плейлист и по хттп начинаешь качать чанки. Понимая, что плейлист - активный стрим, ты перезапрашиваешь плейлист раз в эн секунд, чтобы узнать о новых свежих чанках, которые тоже будешь сливать с сервера по хттп.
Плеер твой может догадаться, или ты сам, о том, что твой канал говно, он не успевает вовремя качать, все тормозит и дёргается - есть возможность переключиться на качество похуже (чанки будут за те же промежутки времени, но по размеру меньше заметно).
Вот в этой схеме задержку менее 15 секунд практически нереально получить (потому что чанк должен быть не на 1 секунду), а оптимально - 60 секунд.
Когда ты смотришь футбол онлайн, это норм, когда смотришь куранты с путиным на новый год - это тоже приемлемо.
А вот для диалога - нет.
bormand 02.08.2020 09:13 # 0
Desktop 02.08.2020 12:24 # 0
Впрочем, для этих целей наверняка лучше использовать вменяемые текстовые трансляции.
Интересно, какая задержка при ТВ-трансляции
defecate-plusplus 02.08.2020 13:03 # 0
если спутник
Myxa 02.08.2020 00:59 # +1
gost 02.08.2020 00:59 # 0
guest8 02.08.2020 01:01 # −999
Desktop 02.08.2020 01:19 # 0
bormand 02.08.2020 00:44 # +1
defecate-plusplus 02.08.2020 00:47 # 0
3.14159265 02.08.2020 01:16 # 0
Да. И это гнусно что HLS кругом.
Впрочем на твиче лайф-стримы. Для них это как раз вполне нормально.
3.14159265 02.08.2020 01:28 # 0
И они их могут ворецировать как пожелают, адаптивно меняя качество под скорость канала пользователя.
bormand 02.08.2020 01:30 # 0
3.14159265 02.08.2020 01:34 # +1
> Чтобы можно было быстро переключаться на хуёвое качество и обратно.
Это называется SVC.
Хз как на твитче. Но вряд ли. Т.к. в я не видел толковых реализаций в промышленных энкодерах.
>Чтобы можно было быстро переключаться на хуёвое качество и обратно.
Одно я знаю наверняка. Твитчовцы (и это их заслуга) для этих целей пролоббировали в AV1 совершенно потрясную штуку.
Называется S-frames.
https://www.youtube.com/watch?v=o5sJX6VA34o
https://thebroadcastknowledge.com/2020/04/15/video-s-frame-in-av1-enabling-better-compression-for-low-latency-live-streaming/
Desktop 02.08.2020 01:31 # 0
gost 02.08.2020 00:00 # 0
Да нет, они в последнее время серьёзно за её уменьшением гонятся (как и «Ютуб», кстати). Две секунды задержки от компьютера стримера — это реальный пример.
guest8 02.08.2020 00:03 # −999
defecate-plusplus 02.08.2020 00:13 # 0
Ффмпег ебаный это уже секунда, даже если ты такой охуевший и в полуреальном времени срешь на клиенты по вебсокету (а не мпег-даш/хлс), 2 секунды и массовость звучат фантастично
(И главное, зачем? Что плохого в задержке, например, 30с?)
Я прост далёк от блогиров, но тема интернет вещания регулярно возвращается в контекст
gost 02.08.2020 00:21 # 0
Не знаю, я на «Твиче» специализируюсь. Реальный пример: https://i.imgur.com/DGN5EK0.png.
Правда, меня смущает размер буфера: если буфер 2.06 секунд, а задержка — 2.09, получается, мне от стримера кадры приходят за 30 миллисекунд?..
Наверное, «Твич» всё таки запутался в терминах, и реальная задержка (отставание часов на экране стрима от моих локальных) там 4.15 секунды.
> И главное, зачем? Что плохого в задержке, например, 30с?
Ну типа мгновенная реакция на чат, все дела.
defecate-plusplus 02.08.2020 00:27 # 0
Диалог в конфе овер, скажем, 50, вести сложновато.
Ну разве что в твиче модный блогир типа тоже диалог ведёт, с текстовым чатом. Ясно
gost 02.08.2020 00:28 # 0
Подтверждаю. Интерактивность.
guest8 02.08.2020 00:29 # −999
bormand 02.08.2020 00:31 # 0
guest8 02.08.2020 00:32 # −999
Desktop 02.08.2020 00:35 # 0
bormand 02.08.2020 00:36 # 0
3.14159265 02.08.2020 01:40 # +1
Сорянчик, что вмешиваюсь в экспертную беседу со своим профанизмом.
https://youtu.be/LsF5bHRxC_M?t=234
В принципе там довольно подробное описание работы твитча.
bormand 02.08.2020 00:12 # 0
guest8 01.08.2020 23:39 # −999
Desktop 01.08.2020 23:40 # 0
guest8 01.08.2020 23:44 # −999
3.14159265 02.08.2020 01:19 # 0
Да. И Экселя не знает. Ну его нахуй.
3.14159265 01.08.2020 22:31 # 0
https://govnokod.ru/25131
3.14159265 02.08.2020 02:40 # 0
А там такое:
CDF — энтропийное кодирование.
За сим иду спать. Доброй ночи.
Myxa 02.08.2020 06:01 # 0
3.14159265 02.08.2020 13:16 # 0
3.14159265 02.08.2020 13:22 # +1
1. Взять ffmpeg+x264 зожать.
2. Пропустить через какой-нибудь tc с заданным дропом.
3. Воспроизвести полученный файл ffplay.
MAKAKA 02.08.2020 16:48 # 0
только man tc-netem вроде)
MAKAKA 02.08.2020 16:45 # 0
Если видео записано заранее, то лучше всего взять Adaptive bit rate, когда сервер разбивает всё на кусочки, а клиент выбирает следующий чанк нужного размера.
Если клиент сидит на iPhone через сотовую сеть, то он выберет кусочек с худшим качеством (и худшего размера)
А если у него телек на пол стены по гигабиту, то может позволить себе чанк по лучше
Все эти проты работают по TCP, и это понятно: клиент может накачать себе чанков за щеку, как хомяк, и их показывать.
А если видео стримается в реальном времени? Если это видеокамера с улицы?
Я не смогу наполнять буфер быстрее, чем я его опустошаю, какой же тут толк от TCP по сравнению с UDP?
Получится, что потерянные пакеты приведут или к замиранию картинки, или к buffering.
Можно конечно забуферизировать данные, и показывать камеру с отставанием, но если это видеозвонок или прямой эфир, и туда можно звонить? Тогда отставать мне нельзя.
gost 02.08.2020 16:54 # 0
А зачем? Ты открываешь стрим, браузер закачивает две секунды стрима и начинает тебе его показывать, параллельно закачивая следующие две секунды потока. В «UDP» будет то же самое: тебе так же надо организовать буфер в несколько секунд видеопотока, чтобы, во-первых, восстановить порядок UDP-пакетов (они к тебе придут перемешанные), а во-вторых — не раздражать пользователя из-за флуктуаций пинга (видео, в котором каждый кадр показывается с задержкой +- пару миллисекунд от номинальной будет выглядеть очень… своеобразно).
> Получится, что потерянные пакеты приведут или к замиранию картинки, или к buffering.
Только в том случае, если у тебя теряется порядка процента и больше пакетов, и то только ОДИН РАЗ. После этого одного раза буфер разработается и buffering не будет, за счёт увеличения задержки.
Desktop 02.08.2020 16:57 # 0
gost 02.08.2020 17:02 # 0
Desktop 02.08.2020 17:05 # 0
Помню, как на стороне заказчика юные телекомщики с восторгом рассказывали, как они поменяли с TCP на UDP и всё полетело.
Думал, что в видеостриминге в принципе это норма, но вы меня переубедили.
MAKAKA 02.08.2020 17:04 # 0
OpenVPN может по udp, чтобы не делать накладных расходов
gost 02.08.2020 17:11 # 0
Точно, про него забыл. В «OpenVPN» запилен свой протокол, обеспечивающий надёжность передачи данных, поэтому гонять его по «TCP» — практически бессмысленное занятие.
MAKAKA 02.08.2020 17:15 # 0
А зачем VPN надежность? Интернет же ненадежен, и поверх него работают другие проты. VPN вполне себе может эмулировать такой вот ненадежный Интернет
bormand 02.08.2020 17:30 # 0
guest8 02.08.2020 17:55 # −999
gost 02.08.2020 17:37 # 0
Да, и про это забыл. Пускаем «VPN» на 443-й порт и течём.
> А зачем VPN надежность?
Надо читать протокол. Могу предположить, что он у них завязан на последовательное получение сегментов (типа «AES CBC»), тогда любая потеря пакета приведёт к разрыву соединения.
MAKAKA 02.08.2020 16:58 # 0
>восстановить порядок UDP-пакетов
Пришедший в неверном порядке пакет можно же просто отбросить?
Если браузер всё равно имеет свой буфер, то зачем мне еще и буфер tcp?
>После этого одного раза буфер разработается и buffering не будет, за счёт увеличения задержки.
А как это всё будет работать с прямым эфиром или видеозвонком?
gost 02.08.2020 17:07 # 0
Да.
> Пришедший в неверном порядке пакет можно же просто отбросить?
Можно. Тогда у тебя останется примерно половина пакетов, может даже меньше.
> Если браузер всё равно имеет свой буфер, то зачем мне еще и буфер tcp?
Потому что это два разных буфера с разными функциями. Буфер «TCP» нужен для восстановления исходного потока байт с сервера, буфер браузера — для обеспечения плавного воспроизведения видео без прерываний.
> А как это всё будет работать с прямым эфиром или видеозвонком?
Для прямого эфира это совершенно непринципиально (так, например, многие играющие в онлайн-игры стримеры специально выставляют задержку в одну-две минуты, чтобы противники не могли подсмотреть стрим и получить преимущество). Для видеозвонков используются либо более мелкие буфера, либо какие-то формы избыточности (возможно, в связке с «UDP», надо смотреть протоколы).
MAKAKA 02.08.2020 17:12 # 0
А есть какая-то статистика на этот счет?
>Потому что это два разных буфера с разными функциями.
То-есть TCP нам нужен исключительно для восстановления порядка?
>для видеозвонков
Ну вот skype используе UDP
https://support.skype.com/en/faq/FA148/which-ports-need-to-be-open-to-use-skype-on-desktop
Если ты утверждаешь, что половина пакетов у меня потеряется или придет в неверном порядке, то как же эту проблему решает скайп?
Сам восстнавливает порядок пакетов?
bormand 02.08.2020 17:22 # 0
Проблема не столько в порядке, сколько в джиттере - задержку постоянно "трясёт". Поэтому точно так же поток приходит кусками и какое-то время отстаивается в буфере.
MAKAKA 02.08.2020 17:25 # 0
Так буфер у них свой, выполнящий и буферизацию, и восстановление порядка, итд, а сами они по udp?
Desktop 02.08.2020 17:27 # 0
bormand 02.08.2020 17:29 # 0
MAKAKA 02.08.2020 17:41 # 0
Большой оверхед для такого мелкого буфера?
bormand 02.08.2020 17:43 # 0
А если большая задержка допустима, то мы уже можем реализовать повторы. И здесь, чтобы не изобретать велосипед, можно взять TCP.
guest8 02.08.2020 17:44 # −999
gost 02.08.2020 17:45 # 0
guest8 02.08.2020 17:48 # −999
gost 02.08.2020 17:51 # 0
gost 02.08.2020 17:32 # 0
Нет, только эмпирические наблюдения за «tcpdump».
> То-есть TCP нам нужен исключительно для восстановления порядка?
Для восстановления порядка и восстановления потерянных пакетов.
> то как же эту проблему решает скайп?
Изобретением своего велосипеда. Поверх «UDP» написан охулиард протоколов разной степени надёжности, в той или иной мере копирующих «TCP». См. «RDP», «RUDP», «ENet», «GameNetworkingSockets», тысячи их.
MAKAKA 02.08.2020 17:39 # 0
Надо бы проверить. Почему половина пакетов идет в другм порядке? Потому что разными путями идут?
RDP работает и поверх UDP и поверх TCP, кстати
Когда хорошее подключение, он мигрирует на UDP))
Вопрос: почему же WebRTC, Skype, RTP и пр не использовали tcp?
gost 02.08.2020 17:44 # 0
> RTP
>>> В заголовке данного протокола, в частности, передаются временная метка и номер пакета. Эти параметры позволяют при минимальных задержках определить порядок и момент декодирования каждого пакета, а также интерполировать потерянные пакеты.
Здравствуйте, мы изобрели «TCP».
> WebRTC
>>> Finally, a special error-concealment algorithm is used to hide the negative effects of network jitter and packet loss
Здравствуйте, мы изобрели «TCP».
> Skype
>>> The Skype team anticipated some jitter and packet loss, and therefore have algorithms that can deal with these problems.
Здравствуйте, мы изобрели «TCP».
https://www.gsx.com/resources/blog/udp-vs-tcp-what-is-really-best-for-skype-for-business-voice/
guest8 02.08.2020 17:46 # −999
gost 02.08.2020 17:50 # 0
Ну и ещё есть «NIH».
guest8 02.08.2020 17:52 # −999
defecate-plusplus 02.08.2020 17:53 # 0
guest8 02.08.2020 17:56 # −999
gost 02.08.2020 17:57 # 0
>>> Ну, то есть они изобрели «TCP», оптимизированный для их протокола и профиля использования. Тоже валидный кейс.
guest8 02.08.2020 18:02 # −999
bormand 02.08.2020 18:07 # 0
Иногда и от последующих, лол.
Desktop 02.08.2020 17:55 # 0
но посмотри уже наконец, пожалуйста, как пишется "то есть", а то кровь из глаз
guest8 02.08.2020 17:57 # −999
Desktop 02.08.2020 17:51 # 0
A dynamic jitter buffer and error concealment algorithm used for concealing the negative effects of network jitter and packet loss. Keeps latency as low as possible while maintaining the highest voice quality.
Но у меня нет соблазна сравнивать это с TCP
gost 02.08.2020 17:52 # 0
Ну, то есть они изобрели «TCP», оптимизированный для их протокола и профиля использования. Тоже валидный кейс.
Desktop 02.08.2020 17:57 # 0
Зачем им изобретать TCP, пусть даже оптимизированный, как ты говоришь, если TCP уже есть? Это оверинжениринг
gost 02.08.2020 18:00 # +2
Ну так это и есть изобретение велосипеда. В данном случае, конечно, оправданное: велосипед у них получился специализированный и более подходящий для решения их задачи, вот такой: https://www.youtube.com/watch?v=PIoUKPeWVjQ.
Desktop 02.08.2020 18:02 # 0
Интересно, Борманд так и не заинтересовался Твитчем и видеостримингом после этих всех бесед? По-моему, такое широкое минное поле для байтоёба!)
bormand 02.08.2020 18:09 # 0
Desktop 02.08.2020 18:10 # 0
bormand 02.08.2020 18:11 # 0
MAKAKA 02.08.2020 18:13 # 0
bormand 02.08.2020 18:15 # 0
MAKAKA 02.08.2020 18:17 # 0
MAKAKA 02.08.2020 17:20 # 0
guest8 02.08.2020 17:28 # −999
Desktop 03.08.2020 14:49 # 0
Стрим с камеры, задержка ~30 секунд