LINUX.ORG.RU

Сообщения gobot

 

Скорость сети на сервере

На сервере анлим 500mbps, по графикам zabbix видно что действительно скорость отдачи\загрузки бывает и 100 и 200 mbps и выше. Но стоит мне со своего компа начать загруку какого нибудь файла по http или FTP так скорость не превышает 1-2mbps (интернет
дом.ру 100mbps).

speedtest.net показывает ping 1ms, dowload 84mbps uplaod 74mbps.

На самом сервере тестил через speedtest-cli, все четко 438\417mbps

В чем затык, где узкое место?

UPD. И да, это не зависит от географической локации загрузки, жалуются на скорость все пользователи сервера

UPD2. Проверял также скачку с другого сервера по wget, скорость не прквышает 1mbps

UPD3. Когда с сервера загружаю http://ipv4.download.thinkbroadband.com/512MB.zip то скорость загрузки отличная, поднималась до 30mbps

UPD4. Проверял по FTP - скорость также маленькая, не превышает 1mbps

 , , ,

gobot ()

Клава для властелина

Ищу клавиатуру. Чтобы кнопки трескали как в 90х. Были выпуклые. Чоткие, короче. К последим клавам не могу привыкнуть, они плоские. Какие модели посоветуете?

 ,

gobot ()

node 8 vs node 15

Здравствуйте!
Приходится (в связи с переходом на webpack 5) обновить nodejs с 8 до ... более новой, но думаю до последней уж тогда 15 версии.
Пока боюсь обновлять. Подскажите, что может потенциально сломаться в моих скриптах, если до этого они 3 года работали на ноде 8? Специфицеского ничего не использовал, код довольно простой

И собственно как обновлять правильно?

# Using Debian, as root
curl -fsSL https://deb.nodesource.com/setup_15.x | bash -
apt-get install -y nodejs


так?

 

gobot ()

Часть строки как html

Здрасти
Есть vue...есть я... На этом можно было бы закончить ))

Есть шаблон, есть строка с текстом в которой есть подстрока с кодом смайлика, ну папримен :ugly:
В шаблон я разумеется хочу вставить эту строку {{mess}}. Хочу я также взять и заменить в этой строке код смайла на картинку. Вроде все тривиально, 6аписал регекс и хлоп - все. Так и есть, но вуй при вставке переменной экранизирует <img/>

Понятно, что я знаю про v-html и про вставку <component is>, но вот в чем затык, в строке могут быть другие теги(собственно это пользовательские данные) и их нужно экранировать. Но не можно экранировать мои <img>

На ум приходит только предварительно экранизировать всю строку самому (может в вуе есть функция?), потом парсить смайлы и прочее и уже готовую строку впендюривать в v-html

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

Пример строки

Пнивет всем :ugly: я вася пупкин <script>alert("xss")</script>


Что хочу
Пнивет всем <img src="/ugly.gif"/> я вася пупкин &lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;


Шаблон
<strong>{{nickname}}</strong>
<div>{{mess}}</div>

 

gobot ()

Зачем гугл рекомендует делать сайты под текстовые браузеры?

https://developers.google.com/search/docs/advanced/guidelines/ajax?hl=ru

В частности, подумайте о тех, чьи браузеры не поддерживают JavaScript (например, людях, использующих программы чтения с экрана или старые телефоны)

Что за дичь в 21 веке? Для кого? Для чего? Кто реально поддерживает браузеры, где нет js?

 , , ,

gobot ()

Как найти админа

Хочу нанять админа сервера. Как ограничить доступ к БД и вообще к другим разделам, фоткам, например, пользователей? Как такое разруливают?


Перемещено leave из admin

 

gobot ()

Использование памяти

Что-то не могу понять. Смотрю в ТОП, у процесса колонка VIRT=6GB (RES=500MB), но в тоже время свопа в системе всего 512MB, причем весь он занят (как обычно, я уже забил на это и походу не лечится). В чем дело? Куда VIRT пишется? Процес какой-то мусор накапливает, можно ли его очистить и вообще нужно ли? Направьте на путь истинный..)

 ,

gobot ()

ffmpeg дропает кадры с камеры, если битрейд увеличивается (too full or near too full)

Вкратце: стримминг камеры(+звука) на rtmp сервисы через ffmpeg

Проблема в следующем: Кадры со входа дропаются, если битрейд передачи потока превышает ~400kbps.

По умолчанию, если ffmpeg получает видеокадр «слишком рано» (в то время как предыдущий кадр еще не закончен), он отбрасывает этот кадр, чтобы он мог поддерживать ввод в реальном времени

Вот что в доках:
https://trac.ffmpeg.org/wiki/DirectShow

By default FFmpeg captures frames from the input, and then does whatever you told it to do, for instance, re-encoding them and saving them to an output file. By default if it receives a video frame «too early» (while the previous frame isn't finished yet), it will discard that frame, so that it can keep up the the real time input.

Ну ок, тут вроде понятно, если кадры с камеры идут очень быстро, а я их не успеваю обрабатывать, то их нужно отбрасывать, для достижения реалтайма. Но я не вижу узких мест. Кодировщик настроен на минималку, FPS на входе и на выходе одинаков. Процессор нагружен на 2-3%. Сеть ДОМРУ ну где то 50Mbps. Сервер тоже тянет.

В целом все хорошо работает. Но сбился с толку уже с этим rtbufsize, который постоянно «too full or near too full», если битрейд превышает 400kbps

rtbufsize - буфер памяти для входа для realtime устройств. Я его установил в 10M(мегабайт). Играть с ним нет вообще никакого смысла, если установишь хоть в гигабайт, то все равно он со временем переполнится, а latency будет огромный

Камеру установил на минималку (640x480@20), выходной поток такой же (640x480@20), битрейд максимальный - 800k.

ffmpeg -f dshow -video_size 640x480 -framerate 20 -rtbufsize 10M -i "video=dev_realtime" -vcodec libx264 -preset veryfast -b 800k -maxrate 800k -bufsize 1600K -r 20 -f flv "rtmp://x.y"


Ещё заметил:
* если на выход установить файл (out.flv), то все четко идет.
* если поднять локально rtmp сервер (ffmpeg -y -f flv -listen 1 -i «rtmp://127.0.0.1:1935/app/live») и передавать на него, то тоже все четко идет
* udp://microsoft.com:666 - хорошо идет, буфер не переполняется

Удаленный сервер менял (от оборудования до провайдера), на сервере замерял битрейд - приходит четко 800kpbs. То есть успевает ffmpeg в сеть передавать?

Не пойму в чем затык! Вроде и на сервер успевает передавать своевременно, но и в тоже время на входе дропаются кадры. Ничего не пойму

Все гугления сводятся к бестолковым «увеличь rtbufsize»

UDP
Кажется баг в rtmp под windows. Помогают правки в реестре (DefaultReceiveWindow, DefaultSendWindow)
https://trac.ffmpeg.org/ticket/1604

 , , , ,

gobot ()

segfault и прочие read access

Так и знал, что кодя на с-подобных столкнусь с этой ****. На ровных местах вылезает ошибка «доступ к памяти». Какая то переменная где-то кем-то удалилась и не может быть прочитана в другом месте.

Есть вот такая чепуха, которая в треде парсит логи на предмет ошибок и прочего

//lambda - вызывается тредом, передает локальную переменную строку
[](std::string line){
  if (std::regex_search(line, std::regex(".*(some err).*"))) debug();
  if (std::regex_search(line, std::regex(".*(some err2).*"))) debug();
  if (std::regex_search(line, std::regex(".*(some err3).*"))) debug();
  //...
}


Когда тред каким-то образом убивается (в моем случае это в основном при выходе из программы) вылезают ошибки доступа к памяти. По call-stack вижу что где то далеко в std::regexp (где то в 18 хопе вверх от моего вызова регекса). Как я понимаю, в regex_search() переменная далее идет по цепочке вызовов и в ккакой то момент она удаляется. Вот как такое предотвратить? Ведь на момент вызова regex_search() переменная существовала? Как я понимаю это из-за того что переменная локальная? Когда тред завершается принудительно переменная удаляется.

Может быть сделать некий конвеер, чтобы не локальную переменную передавать? Как лучше сделать, чтобы избежать такого?

 ,

gobot ()

С++ удаляет локальные переменные

Узнал ужасную вещь. С++ удаляет локальные переменные.
Допустим создал я объект

Myclass xxx;
xxx.onready = func
xxx.start();

Создался объект, запустил start... Иии... Умер. Потом с++ запускает деструктор объекта. А мой колбек onready не дождется своего выхода.
Это нормально? Я же сам не удалял объект через delete. То есть получается компилятор сам за меня решает?

 

gobot ()

Выучил c++: как внедрить в бинарь свой код

Выучил я с++ и написал программу.

Теперь осталось запаковать ее и сделать первый выпуск.

Вот что я хочу: хочу, чтобы в бинарном файле можно было изменить строку. То есть бинарник будет как бы именным, с неким штампом, подписью, токеном. Я хочу типа регекспом искать в бинарнике некую строку и заменять ее на уникальную. Ну типа логина. Строка это будет например char name[10] = «holderxxxx». Вот мне этот holderxxxx нужно заменять на реальное значение, чтобы потом в коде вывести «привет name»

Как такое сделать?

 ,

gobot ()

C++ адрес подменяется

Продолжаю изучать с++

Process* ffplay = nullptr; //указатель в 0
ffplay = new Process("xxx"); //возвращается адрес  0x00000000003aa270 и заполняется память
ffplay->Start(); //тут запускается дочерний процес и также новый thread, который читает трубу процесса

delete ffplay; //освобождаю память
ffplay = nullptr; //указываю на адрес памяти 0x0000000000000000

//далее, в триде, проверяется что объект убит (это можно определить по свойствам объекта, например там id будет -12334214, а у созданого объекта 1..2..3...) и все поля либо NULL, ну в общем понятно. 

//трид успешно завершается, говорит что объект более не живучий и выхожу из цикла чтения. Ну либо когда труба закрыта

//стоит мне после этого создать новый объект на старый указатель
ffplay = new Process("xxx"); //тут снова 0x00000000003aa270

//то потом тред не завершается, потому что считает что объект все ещё живой. Это что получается, быстренько записали на старый адрес новые данные и тред даже не знает что ему подменили объект?

//если следом создать ещё один
Process *ffplay2 = new Process("xxx"); //тут адрес уже другой 0x000000000022d6b0


Как мне избежать такой подмены объекта в треде?

 , ,

gobot ()

c++ Вопросик с лямбда

Продолжаю изучать с++ ) Загвоздка с лямбда


class Process {
public:

  int (*onReady)(const char*);  
  std::string outpurBuffer;
}

Process *proc = new Process();
proc->onReady = [](const char* reason) {
  std::string = proc->outpurBuffer;
  return 1;
};


Не работает, говорит что локальную переменную нельзя. Гуглю соответственно «c++ local variable in lambda», первый пример указывает что нужно в скобки квадратные передавать Captured variables

// Local Variables
std::string msg = "Hello";
int counter = 10;
// Defining Lambda function and
// Capturing Local variables by Value
auto func = [msg, counter] () {
                          //...
                          };

ок, делаю
proc->onReady = [proc](const char* reason) {
  std::string s = proc->outpurBuffer;
  return 1;
};

Снова ошибка, но уже с приведением типов. Что не так?

Кстати сразу другой вопросик, чем отличается
const char* reason;
const char *reason;

Есть ли разница? Компилятору я смотрю без разницы, то и то проглатывает

 ,

gobot ()

Как писать под ios не имея мака

Неужели у орды фрилансеров у всех маки за пару сотен руб?

Почему под винь и линь и макь есть андроид студия, а под гребаный иос нет?

Как мне написать хеловорлд без покупки мака?

 , , ,

gobot ()

С++ вопросик про ссылку на фукнцию

Продолжаю изучать с++, запутался в указателях, а в гугле не могу правильно составить запрос. Мне нужно определить в структуре ссылку на функцию onBuffer, чтобы потом созданный thread ее вызывал. Как простой int передать я понял, а вот как функцию? Пробовал уже и слева и справа * ставить и & b и так и сяк )


int onBuffer(const char* data){
   
}

typedef struct ThreadPar {
    int sdtOut;      
    int *onBuffer; //как определить?
} ThreadPar, *PThreadPar;


PThreadPar ThreadParameters;
ThreadParameters->sdtOut = sdtOutRd;
ThreadParameters->onData = onBuffer; //как передать?

 ,

gobot ()

Вопросик по C++ NULL

Я тут изучаю с++ ) Не могу понять как мне проверить что объект создан?

Process{
  public:
    Process(const char* cmd_){}
  ...
}


далее я объявляю
Process ffplay=NULL;

if(ffplay){} //ошибка
//conditional expression of type 'Process' is illegal

if(ffplay != NULL && !ffplay.isClosed()){} //ошибка
//binary '!=': no operator found which takes a left-hand operand of type 'Process' (or there is no acceptable conversion)



ffplay ведь изначально NULL(=0)

 ,

gobot ()

Сборка оптимизированного ffmpeg

Начинаю тут(пришлось) потихоньку компилировать в с\с++. Хочу скомпилировать(собрать) оптимизированный(по размеру) статичный ffmpeg. Все хорошо собирается, статичный бинарь получается около 2 мб. Но стоит мне добавть SDL2, чтобы собрать ffplay, сборка проходит нормально, но при запуске вылазит ошибка что не может найти либу libwinpthread-1.dll. В документации ffmpeg по сборке mingw говорится что это якобы кривой gcc добавляет эту либу, вне зависимости от параметров сборки.

https://trac.ffmpeg.org/wiki/CompilationGuide/MinGW

Unfortunately the gcc.exe it provides seems to create binary's that require files like «libgcc_s_dw2-1.dll» and «libwinpthread-1.dll» (etc.?) to accompany your executable, so can cause some difficulty there. You can remove some files to remove dependencies on things like «libbzip2.dll» see ​https://ffmpeg.zeranoe.com/forum/viewtopic.php?f=5&t=3688 and possibly avoid the libgcc.dll requirement by using "-static" at linking time.

и предлагает удалить какие то файлы, которые вызывают эти зависимости. Какие именно файлы не уточняется и указывается ссылка на домен ffmpeg.zeranoe.com который сейчас не доступен (искал в кеше, не нашел)

Как бы мне избавиться от этой libwinpthread?

ldd ffmpeg.exe
libwinpthread-1.dll => /mingw64/bin/libwinpthread-1.dll


Собираю так

( читать дальше... )

 ,

gobot ()

Собрать все dll в один бинарь

Делаю программу на libavcodec, она цепляет avcodec.dll и прочие. Я хочу один бинарь, так как не удобно таскать dll всюду. Можно ли такое? Или нужно добавлять в проект весь исходный код ffmpeg и сомпилировать?

 , ,

gobot ()

Изменение SPS на лету через libavcodec

Можно ли как нибудь менять в потоке NAL unit? Мне нужно подменять параметр в sps, seq_id. Без рекодирования, конечно... Хотелка экзотическая, но это пока способ решить проблему

Что заставляет кодировщик часто генерировать SPS\PPS?

 ,

gobot ()

Вопросик по C++

Я дебажу chromium, хочу добавить в класс свой метод для теста. Класс DXVAVideoDecodeAccelerator наследник класса VideoDecodeAccelerator. Я хочу добавить в DXVAVideoDecodeAccelerator публичный метод InsertFrame().

Что я делаю
media/video/video_decode_accelerator.h

class MEDIA_GPU_EXPORT DXVAVideoDecodeAccelerator
    : public VideoDecodeAccelerator {
 public:


 void InsertFrame(int32_t picture_buffer_id, int64_t ts);
}




media/video/video_decode_accelerator.cc
void DXVAVideoDecodeAccelerator::InsertFrame(int32_t picture_buffer_id, int64_t ts)  {
  DVLOG(1) <<  picture_buffer_id << ":" <<  ts;
}


Далее в коде я вызываю
vda_->InsertFrame(picture.picture_buffer_id(), timestamp.InMicroseconds());


и выдает ошибку
error: no member named 'InsertFrame' in 'media::VideoDecodeAccelerator'


Обязательно ли декларировать этот метод в родительском классе VideoDecodeAccelerator? Если да, то печально, этот инклуд затрагивает много кода и пересборка часа 3 будет наверное... Как наиболее просто можно добавить в DXVAVideoDecodeAccelerator этот метод?


Вот исходники
https://source.chromium.org/chromium/chromium/src/ /master:media/gpu/windows/...
https://source.chromium.org/chromium/chromium/src/ /master:media/video/video_...

 , ,

gobot ()

RSS подписка на новые темы