LINUX.ORG.RU

Избранные сообщения superuser

[решено] Программное эхоподавление (и эхокомпенсация) в Debian - какие существуют решения?

 , ,

Добрый день!

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

Добавлением в /etc/pulse/default.pa следующих строк:

load-module module-echo-cancel source_name=noechosource sink_name=noechosink
set-default-source noechosource

…включил встроенный модуль подавления шума и эха PulseAudio.

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

debiani
()

Вопрос по новому QEMU 5.1

 ,

Там поддержку AVR (в том числе и ATmega 328) добавили. А как этим пользоваться и можно ли GDB прицепиться?

Meyer
()

Работа с файлом виртуального терминала

 ,

Смотрю текущий файл терминала: tty. Допустим, показало /dev/pts/1. Потом с другого терминала посылаю на этот команду: echo ls > /dev/pts/1. Команда не работает. Что не так?

fingolfin
()

Captive Portal для самых маленьких

 , ,

Здравствуйте мои маленькие любители авиационного спирта =) !

Последние пару дней занимался настройкой Wi-Fi, да не простого, а стильного-модного-молодёжного, со своим Captive Portal. Для тех, кто в танке: это когда ты подключаешься к Wi-Fi сети, но прежде чем допускать тебя к интернетам и ЛОРу в частности, нужно пройти какую-никакую дополнительную авторизацию на веб-страничке, third-party так сказать.

Такой подход я считаю более секурным, потому как, доступ каждого клиента по Wi-Fi регулируется лично через iptables, а не тупо форвардится всё подряд. Какой простор для творчества! Во-вторых, авторизация происходит через веб-страничку, а не WPA и прочие нативные механизмы wireless-сетей, которые как и всё в нашем мире, не вечны и надёжность их хромает.

После вступления, приступим.

hostapd? checked!

iptables? checked!

nginx? checked!

Рассказывать о настройке NAT лишний раз не буду, думаю, у вас уже должна быть настроена раздача Wi-Fi, и всё, что вам ненужно, это только Captive Portal.

wlan0 — имя интерфейса Wi-Fi
eth0 — имя интерфейса с интернетами
192.168.0.0/24 — локалка

# создаём кольцо
iptables -t mangle -N captive

# все пакеты из ви-фи отправляем в это кольцо
iptables -t mangle -A PREROUTING -i wlan0 -j captive

# доверенные клиенты из кольца выходят сразу же (адреса инсертим в начало списка)
# фильтр хоть по MAC, хоть по IP
# этот список должен редактироваться через сайт (Captive Portal)
# iptables -t mangle -I captive -m mac --mac-source 00:00:00:00:00:00 -j RETURN
# iptables -t mangle -I captive -s 192.168.0.137 -j RETURN

# если ты всё ещё в кольце, тогда ставим метку
iptables -t mangle -A captive -j MARK --set-mark 1

# всех с меткой перенаправляем к себе, когда они открывают сайты 80
# про 443 забудьте
iptables -t nat -A PREROUTING -i wlan0 -m mark --mark 1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1

# всех с меткой при прочем трафике просто дропаем
iptables -t filter -A FORWARD -i wlan0 -m mark --mark 1 -j DROP

# успешно натим оставшихся доверенных
iptables -t filter -A FORWARD -i wlan0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

Вот и всё. Здесь включена проверка через -i wlan0, таким образом это не вызовет никаких конфликтов с другими сетями, т.к. у меня в продакшене под кроватью очень много правил iptables и я знаю, о чём говорю.

Подводные камни, на которые я наткнулся и спешу поделиться с вами. В соседнем треде мне научно-популярно объяснили, что тщетно пытаться настроить редирект по HTTPS на свой Captive Portal, это просто не сработает, это уже MitM атака. Не очень-то и хотелось! ;p

Если у вас используются личные DNS, то наверняка у вас есть правило, разрешающее локальные запросы к серверу (tcp/53 udp/53). Не забудьте разрешить запросы и к локальному веб-серверу (tcp/80). Но а если вы сообщаете Wi-Fi клиентам какие-то публичные NS, то не забудьте разрешить доступ клиентам к ним: iptables -t filter -I FORWARD -i wlan0 -s 192.168.0.0/24 -d 8.8.8.8/32 -j ACCEPT. А суть такова. Когда клиент подключается к Wi-Fi, он проверяет доступность интернета в целом, для этого смартфоны качают со своих серверов файлы и проверяют корректность полученных данных. Если оно не сможет резолвить хост запрашиваемого сайта, то на этом и споткнётся и проверка на наличие Captive Portal в сети не пройдёт.

Собственно, теперь к механизму Captive Portal.

Как уже замечено, это личная прерогатива каждого клиента, проверять доступность интернета, и если в результате проверки что-то пошло не так, — значит либо интернета нет, либо Captive Portal.

Мы перенаправили все запросы на 80 порт к себе, на свой локальный сервер. Теперь nginx должен в ответ на все HTTP запросы отвечать кодом 302. Не 200, не 301, не 511, а именно 302, а затем перенаправлять вас на страничку с third-party авторизацией, и только таким макаром например мой Андрюша-9 смог обнаружить, что у меня таки Captive Portal, а не какой-то сломанный интернет. В результате сразу после подключения к Wi-Fi сети должно появиться Push-уведомление: Скриншот #1, при нажатии которого откроется страничка, куда редиректит nginx Скриншот #2.

Сам скрипт странички я оставляю вам на откуп: думаю, вам не составит никакого труда наслюнявить однострочник на php добавляющий $_SERVER['REMOTE_ADDR'] в iptables через shell_exec(); или типа того. Да? Да. Ваш Captive Portal полностью в ваших руках.

Вот и весь механизм работы Captive Portal. Спрашивайте ответы.

Spoofing
()

Multiple pulseaudio

 

Есть какой нибудь нормальный способ урегулировать ситуацию, когда имеется больше одного пользователя, которые используют PA для вывода звука?
По умолчанию у второго и последующих пользователей звук просто отваливается

ia666
()

Останов скрипта из /etc/xdg/autostart/

 ,

Есть у меня .desktop файл в /etc/xdg/autostart/ который запускает маленький скрипт при логине в DE. Но при выходе из DE скрипт не завершается. Как сделать что бы при выходе из DE скрипт завершался?
P.S. В моём случае DE = GNOME3, Debian7

sergijoo
()

Производительность; илитный запил оптимальных реализаций и основы матчасти.

 , , ,

Поглядел я тут на пацанов и увидел прогресс в их глазах. Поэтому я решил вести тут свой бложик, в котором я буду толкать матчасть, разбирать/разрушать всякие мифы и легенды, а так же их обсуждать с пацанами. Банить меня не надо - тут всё будет очень культурно.

Это будет формат для самых маленьких, где я буду показывать как что-то пилится по-пацаночке. Его задача - на примерах пересказать штеудмануал тем, кому лень его читать, но кто очень любит спорить про код, перфоманс и матчасть. Ну и просто интересные наблюдения.

Изначально я хотел написать про то: что такое бесплатные вычисления на примере is_range() + сумма елементов массива, но тут выявилась смешная особенность, поэтому пока без is_range().

Начнём с простого - сумма елементов(float) массива. Как написать её быстро? Обычный крестопоц сделает так:

auto summ = accumulate(begin(vec), end(vec), 0.)

Этот код выдаёт 5.6GB/s(мы всё бенчим в л1д 32килобайта массив). Казалось бы, если бы мы слушали всяких «гуру», которые нам говорят: accumulate() - оптимизирован, «ты что умнее создатели stl"а?», «конпелятор умнее тебе - сам всё делает оптимально», «руками что-то делать слишком сложно и не нужно» - то мы бы там и остались с этими 5.6ГБ, но мы пойдём дальше и поймём почему так, и является ли это тем, что намн ужно.

Но посмотрев на код - он не векторизован:

	addq	$4, %rdx
	vcvtss2sd	-4(%rdx), %xmm2, %xmm2
	vaddsd	%xmm2, %xmm1, %xmm1

Почему? Патамучто это основная флоатпроблема: Он не ассоциативен - флоат не имеет в себе точных представлений всех чисел входящих в диапазон его «представления» т.е. порядкопроблемы.

Поэтому конпелятор НЕ ВЕКТОРИЗУЕТ флоат по умолчанию, ну никак. Даже такую банальщину.

Для решения этих проблем - есть ключик -funsafe-math-optimizations, который входит в -ffast-math, который кладёт на точность при вычислениях. Добавив его мы получаем уже 44.9GB/s.

Но теперь мы получаем ещё одну проблему - надо думать: «как бэ сунуть эту ключик не повредив там, где этот ключик не нужен».

Поэтому ноцанам, которые хотят быстро и не хоятт рандомных жоп из-за тупости конпелятора - пишут всё руками. Допустим на той же сишке это пишется так:

double memadd_autovec(buf_t buf) { //5.609465GB/s, либо 44.969652GB/s с ffast-math
  float * it = buf_begin(buf), * end = buf_end(buf), summ = 0.;
  do {
    summ += *it++;
  } while(it != end);
  return summ;
}

double hsumf(__v8sf v) {
  return (v[0] + v[1] + v[2] + v[3] + v[4] + v[5] + v[6] + v[7]);
}

double memadd_vec(buf_t buf) { //45.652002GB/s и класть на ffast-math
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = {};
  do {
    summ += *it++;
  } while(it != end);
  return hsumf(summ);
}

Т.е. разницы никакой нет, кроме нужной нам реализации горизантального сложение вектора. Когда я говорил пацану: «векторную сишку для написания быстрого кода юзать намного проще, чем плюсы» - поцан нипонимэ, да и любые пацаны скажут - ну дак с -ffast-math оба выдают по 45гигов - нахрен эта сишка нужна?

А вот зачем:

double memadd(buf_t buf) { //132.878440GB/s
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = {};
  do {
    summ += *it++;summ += *it++;summ += *it++;summ += *it++;
  } while(it != end);
  return hsumf(summ);
}

Это называется пацанский анролл копипастой, а вот заставить конпелятор нормально что-то разанролить очень сложно.

Если бы мы слушали всяких «гуру», которые нам вещают: «анрол говно и не нужен» - мы бы так и седели с 45-ю гигами, а так мы сидим с 132.878440GB/s. Т.е. анролл нам дал немного не мало ~300%.

Но основная мысль, которую толкают всякие «гуру» - это не надо следить за тактами/считать такты и прочее. Но мы о5 сделаем наоборот и посмотрим что будет.

Т.к. наш юзкейс упирается на 99% в throughput и дёргается одна инструкция, то нам достаточно просто считать теоретическую производительность для моего камня. 4.5(частота камня)*8(т.е. у нас камень с avx, то там вектор 32байта, либо 8флоатов.)*1(throughput нашей инструкции - в данном случае vpaddps из интел мануала). Т.е. 36гигафлопс, либо ~144гига. Т.е. мы сняли овер 90% теоретической производительности - остальные 10% у нас ушли в наши циклы, всякие горизонтальные суммы вектора и прочее, ну и конечно же чтение данных из кеша.

Но самое смешное - на моём хасвеле умножение имеет throughput 0.5 - т.е. на хасвеле умножение быстрее сложения. Это новая забористая трава у интела.

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

Поэтому очень смешно слушать, когда какие-то пацаны говорят: «float point имеет такую же производительность как и инты» - нет, оно имеет такоу же производительность лишь по причине того, что на штеуде инты тормазят так же, как и float.

И чтобы окончательно в этом убедится - мы взглянем на fma(вариации умножения со сложением/вычитанем), которые имеют throughput 0.5 - да, да - на хасвеле умножение+сложение в 2раза быстрее просто сложения. Это уже не просто трава - это что-то принципиально новое.

У целочисленного сложения же throughput 0.5 и казалось бы, если мы поменяем в нашей функции float на int - у нас будет сложение работать в 2раза быстрее, но это не так. Оно выдаёт те же 130гигов, а почему?

Вообще у камня есть такая фича, допустим у нас:

add $1, %reg0//вот тут инструкция add залочит регистр reg0
add $1, %reg0//а эта инструкция уйдёт в лок до особождения предыдущей инструкцией регистра reg0

Чтобы такой жопы небыло - есть специальная фича:

add $1, %reg0//lock reg0
add $1, %reg0//И тут вместо того, чтобы уйти в лок - камень вместо reg0 даёт инструкции любой свободный регистр.

Эта фича называется прееименование регистров, либо как-то так - мне лень гуглить.

Дак вот штука в том, что фича работает через жопу. Мне лень читать мануал и искать почему так, но штука в том, что она ограничивает throughput. На умножении и целочисленном сложении она огранивает throughput c 0.5 до 1.

И вот я решил заюзать сложении через fma:

__v8sf fmaadd(__v8sf a, __v8sf b) {
  return _mm256_fmadd_ps(_mm256_set1_ps(1.), a, b);// a + b * 1. == a + b.
}

double memadd_fma(buf_t buf) {
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = {};
  do {
    summ = fmaadd(summ, *it++);
  } while(it != end);
  return hsumf(summ);
}

Но меня ждала жопа: 27.347290GB/s, причем не анролл и ничего не помогал. Я уж подумал, что мануал наврал, но позже до меня допёрло: у неё latency 5тактов и ((4.5×8)÷5)×4 ~= 29гигов - т.е. я получаю производительность с её latency, но какой жопой оно так?

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

add $1, %reg0
add $1, %reg0
//а не
add $1, %reg0
add $1, %reg1

Т.е. на неё вообще не работает переименовывание регистров - и инструкции постоянно в локе. Я это проверил и оказался прав. Ну и я написал такой мемадд:


__v8sf fmaadd(__v8sf a, __v8sf b) {
  return _mm256_fmadd_ps(_mm256_set1_ps(1.), a, b);
}

inline void fma_10way_finality(__v8sf * cache, __v8sf * it, __v8sf * end) {
  switch(end - it) {
    case 8:
      *(cache + 7) = fmaadd(*(cache + 7), *(it + 7));
      *(cache + 6) = fmaadd(*(cache + 6), *(it + 6));
    case 6:
      *(cache + 5) = fmaadd(*(cache + 5), *(it + 5));
      *(cache + 4) = fmaadd(*(cache + 4), *(it + 4));
    case 4:
      *(cache + 3) = fmaadd(*(cache + 3), *(it + 3));
      *(cache + 2) = fmaadd(*(cache + 2), *(it + 2));
    case 2:
      *(cache + 1) = fmaadd(*(cache + 1), *(it + 1));
      *(cache + 0) = fmaadd(*(cache + 0), *(it + 0));
    case 0:
      break;
    default: error_at_line(-1, 0, __FILE__, __LINE__, "bad_aligned");
  }
}

double memaddfma_10way(buf_t buf) {
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = (__v8sf){};
  __v8sf * cache = (__v8sf[10]){{}};
  uint64_t i = 0;
  while((it += 10) <= end) {
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    i = 0;
  }
  fma_10way_finality(cache, (it - 10), end);
  summ = (*(cache + 0) + *(cache + 1) + *(cache + 2) + *(cache + 3) +
	  *(cache + 4) + *(cache + 5) + *(cache + 6) + *(cache + 7) +
	  *(cache + 8) + *(cache + 9));
  return hsumf(summ);
}

Пришлось хреначить финалити, ибо тут «анролл» на 10, а почему на 10 - для максимального throughput"а - надо, чтобы каждый каждый регистр юзался через 5тактов - т.е. 10регистров.

И вся эта порятнка нужна для борьбы с тупостью конпелятора.

Это уже: 214.167252GB/s(раельно там в районе 250 - просто мой бенч говно). 107 гигафлопс на ведро. Из теоретических 144, но тут уже влияние кеша. Причем 50+ из которых выкидываются и просто бесплатные.

Теперь вопрос к пацанам - что нам дадут эти гагфлопсы, когда у нас будет массив не 32килобайта, а 32мегабайта? Зачем нужно выживать максимум, когда скорость памяти отсилы 20-30гигабайт и нам хватит даже С++ кода с ffast-math?

Ну и призываются упомянутые мною пацаны: mv - этот тот експерт, что вещал про «руками переименовывать регистры не надо» и «анрол ваще ненужен», emulek вещал про ненужность счёта тактов, и не понимал что такое «беслпатно», AIv - не понимал в чем проблема плюсов, ck114 - так же не понимал в чем проблема плюсов.

Бенчи: https://gist.github.com/superhackkiller1997/606be26fa158ef75501d - вроде я там ничего не напутал.

P.S. - не выпиливайте пж, пусть пацаны «нужно» или «не нужно». Мне интеерсно. Ну и там рекомендации пацанов.

Carb_blog
()

Добавить значение к CXXFLAGS не редактируя Makefile, реально?

Добрый вечер. Скорее всего вопрос нубский, и если так то не ругайтесь пожалуйста если он уже где-то обсуждался или описывался и дайте ссылку.
А вопрос в следующем, существует ли универсальный способ добавить значение к какой нибудь переменной в Makefile (нп пр. CXXFLAGS), не редактируя сам файл и не копаясь в нем? Повторюсь, именно добавить значение, а не заменить. Благодарю.

normann
()

Палю годноту: халявный собственный git/GitLab/etc без белого IP

 ,

Смеркалось Самоизоляция. Я тут открыл для себя тор.

Заводим виртуалку/старый_комп ставим туда git bare или целый GitLab. На этой виртуалке ставим тор и выкидываем как сервис 22-й порт и 80-й. Получаем .onion-адреса.

На клиентских компьютераъх для доступа к веб-интерфейсу гиталба используем тор браузер, а в консоли делаем torify git clone git@blablabla.onion:user/your_repo_name.git, затем пользуемся гитом как обычно, а вместо git push/pull делаем torify git push/pull

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

Раньше я юзал OpenVPN, но там была морока с ключами, при переезде менялся айпи и настраивалось чуть больше, чем за 10 мин, если бы я знал раньше – было бы круто. Вдруг кому поможет сей пост.

pihter
()

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

 ,

Подскажите программу для управления мобильным устройством через Wi-Fi. Нужно что-то типа радмина, но для мобильника. Не через инет. Желательно клиенты и для компа и для мобильника (но можно и для чего-то одного, если нет для обоих).
Кейс: обитаю на даче. В качестве роутера с вайфаем используется старый телефон на Android 6.0, приклеенный белым рулонным пластырем (внезапно, он хорошо держит) к окну террасы (там лучше сигнал). Хочу им управлять с компа или мобильника через wi-fi, а не бегать к нему за любым чихом вроде включения VPN.
Есть что-то работающее через локалку, а не тимвьюер?

Qwentor
()

хэш каждого мегабайта архива php bash

 , ,

Здравствуйте!
Подскажите как написать скрипт желательно на php, но можно и на bash.
Есть архив 21МБ, нужно посчитать хэш каждого мегабайта, то есть на выходе получить 21 хешей md5.

kozanostra
()

Телефонный антиспам

 , ,

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

В тред призывается theNamelessOne.

ncrmnt
()

[uvcvideo] Auto Exposure реально выключить?

Зависит от камеры или средствами драйвера можно отключить?

uvcdynctrl -c
Listing available controls for device video0:
  Brightness
  Contrast
  Saturation
  Hue
  Gamma
  Power Line Frequency
  White Balance Temperature
  Sharpness
  Backlight Compensation

Как видно самый тривиальный способ не катит...

$ v4l-info 

### v4l2 device info [/dev/video0] ###
general info
    VIDIOC_QUERYCAP
	driver                  : "uvcvideo"
	card                    : "iSlim 1320"
	bus_info                : "usb-0000:00:1d.7-4"
	version                 : 3.2.5
	capabilities            : 0x4000001 [VIDEO_CAPTURE,STREAMING]

standards

inputs
    VIDIOC_ENUMINPUT(0)
	index                   : 0
	name                    : "Camera 1"
	type                    : CAMERA
	audioset                : 0
	tuner                   : 0
	std                     : 0x0 []
	status                  : 0x0 []

video capture
    VIDIOC_ENUM_FMT(0,VIDEO_CAPTURE)
	index                   : 0
	type                    : VIDEO_CAPTURE
	flags                   : 0
	description             : "YUV 4:2:2 (YUYV)"
	pixelformat             : 0x56595559 [YUYV]
    VIDIOC_ENUM_FMT(1,VIDEO_CAPTURE)
	index                   : 1
	type                    : VIDEO_CAPTURE
	flags                   : 1
	description             : "MJPEG"
	pixelformat             : 0x47504a4d [MJPG]
    VIDIOC_G_FMT(VIDEO_CAPTURE)
	type                    : VIDEO_CAPTURE
	fmt.pix.width           : 640
	fmt.pix.height          : 480
	fmt.pix.pixelformat     : 0x47504a4d [MJPG]
	fmt.pix.field           : NONE
	fmt.pix.bytesperline    : 0
	fmt.pix.sizeimage       : 307200
	fmt.pix.colorspace      : SRGB
	fmt.pix.priv            : 0

controls
    VIDIOC_QUERYCTRL(BASE+0)
	id                      : 9963776
	type                    : INTEGER
	name                    : "Brightness"
	minimum                 : 0
	maximum                 : 255
	step                    : 1
	default_value           : 128
	flags                   : 0
    VIDIOC_QUERYCTRL(BASE+1)
	id                      : 9963777
	type                    : INTEGER
	name                    : "Contrast"
	minimum                 : 0
	maximum                 : 100
	step                    : 1
	default_value           : 0
	flags                   : 0
    VIDIOC_QUERYCTRL(BASE+2)
	id                      : 9963778
	type                    : INTEGER
	name                    : "Saturation"
	minimum                 : 0
	maximum                 : 200
	step                    : 1
	default_value           : 100
	flags                   : 0
    VIDIOC_QUERYCTRL(BASE+3)
	id                      : 9963779
	type                    : INTEGER
	name                    : "Hue"
	minimum                 : -180
	maximum                 : 180
	step                    : 1
	default_value           : 0
	flags                   : 0
Ничего нового :(
$ modinfo uvcvideo 
filename:       /lib/modules/3.2.5-030205-generic/kernel/drivers/media/video/uvc/uvcvideo.ko
version:        1.1.1
license:        GPL
description:    USB Video Class driver
author:         Laurent Pinchart <laurent.pinchart@ideasonboard.com>
srcversion:     8C7099B998ADA2049B68BD6
...
$ apt-cache show uvcdynctrl
Package: uvcdynctrl
Status: install ok installed
Priority: extra
Section: libs
Installed-Size: 83
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: i386
Source: libwebcam
Version: 0.2.1-1build1
...

Suntechnic
()

Запись видеопотока в виртуальное устройство v4l2loopback

 ,

Суть такова, есть такой проект v4l2loopback, который представляет собой модуль ядра, который создаёт виртуальные V4L2 устройства, и в них можно писать видео и читать его обратно другими программами

https://github.com/umlaeute/v4l2loopback/

Проблема в том, что в документации V4L2 нету примеров кода для работы с OUTPUT девайсами, только разрозненные рекомендации в описаниях ioctl-ов. Примеры есть только для capture девайсов.

И когда я делаю тестовую программу, использующую mmap метод для записи в сабжевый виртуальный девайс, на выходе читается только первый кадр, дальше чтение виснет. Когда я использую метод write(), то всё работает, но выстреливает кадры на максимальной скорости, ибо таймстампы и другая метаинформация в этом режиме не поддерживается.

Подозреваю, что в v4l2loopback кривая и бажная реализация получения кадров через mmap, а мой код всё делает правильно, как в мануале. Но полностью в этом не уверен, ибо железных V4L2 ouput девайсов у меня в наличии нету и протестировать не могу, чтобы сравнить результаты.

Собственно, кому-нибудь из ЛОРовцев приходилось писать видео в V4L2 девайсы используя mmap (Streaming I/O в терминах V4L2)?

Примеры кода не гуглятся

Harald
()

Самый простейший и легковесный http-сервер?

 , ,

Какой простейший и самый легковесный HTTP сервер вы можете посоветовать? Чтобы никаких лишних примочек, никакой поддержки интерпретаторов. Чтобы умел только показывать файлы и содержимое директории и занимал минимум памяти. Хочется воткнуть такой на Raspberry Pi.

Rinaldus
()

Запись потока RTSP с уличной камеры в файл

 , ,

Здравствуйте, коллеги!

Пытаюсь на коленках организовать запись с наружных камер видеонаблюдения на локальный HDD. Камеры простые, отдают поток RTSP по ссылке вида

rtsp://111.222.333.444:554/user=user&password=password&channel=1&stream=0?.sdp

В качестве граббера потока выбрал ffmpeg, который (теоретически) должен уметь выполнять конструкцию вида

/usr/bin/ffmpeg -i ‘rtsp://111.222.333.444:554/user=user&password=password&channel=1&stream=0?.sdp’ ~/Videos/cam01.mp4

Поток живой, VLC открывает и показывает с минимальной разумной задержкой (секунда-две). При этом ffmpeg пытается подключиться, пасует на UDP, переключается на TCP но и там отваливается по тайм-ауту со словами «Output file #0 does not contain any stream».

При этом, на этапе записи НЕ стоит задача перекодировки потока. Только захват и запись, остальное, при необходимости, можно будет выполнить позже. Для этого попробовал указать -vcodec copy -acodec copy, но ffmpeg version 3.4.7 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-39) отказался. Говорит: «Unknown decoder ‘copy’».

Планирую загнать под cron и запускать процесс, скажем, каждый час, убив его предшественника с задержкой в несколько секунд, чтобы обеспечить незначительный перехлёст в записи, исключив разрывы.

В общем, прошу помощи: как правильно должна выглядеть строка запуска ffmpeg под мою задачу?

Заранее признателен!

P.S. Сюда, по понятным причинам, выложить не могу, но, если кому-то будет нужно для исследования данной проблемы, в личку готов дать ссылку на реальный поток.

root66
()

Создание виртуалки, на основе образа своего компа

 ,

Всем привет. На машине стоит Ubuntu 18.04 с настроенным стеком программ для работы. Сейчас нужно перенести все это добро на отдельную виртуалку на сервер. Каким образом можно создать виртуальный открытый образ для того чтобы отзеркалиться?

full_nub
()

wine: перенаправить вызов с dll на нативный so

 , , ,

Нужно перехватить вызовы к определенной dll и перенаправить на вызовы нативного в системе so. Набор API (названия функций и т.д.) полностью совпадают.

Как такое реализовать?

xDShot
()

Infra Red Scanner — свободный приёмник-передатчик IrDA-сигналов на базе Arduino

 , , , transmitter

Группа Hardware and Drivers

Соджи Ямакава (Soji Yamakawa), профессор Университета Карнеги-Меллона и разработчик бесплатного авиасимулятора YSFlight, опубликовал исходники собственного приёмника-передатчика инфракрасных сигналов на базе Arduino, который позволяет записать IrDA-сигнал, а потом воспроизвести его.

Для работы с данным девайсом также разработано свободное кроссплатформенное ПО, которое может быть собрано как в варианте с GUI, так и в виде CLI-программы. Бинарные пакеты данного ПО подготовлены для ОС Windows.

ПРИМЕЧАНИЕ: Если кто сможет опакетить данное ПО с GUI для Debian 9.x - дайте ссылку на DEB в комментариях!

>>> Подробности (coocan.jp)

atsym
()

Выбор паяльной станции

 ,

Господа, посоветуйте бюджетную паяльную станцию. Фен, подставки,крепеж вот это вот всё.


Перемещено leave из linux-hardware

Deleted
()