получить rtsp из zoneminder ?
Приветствую.
zoneminder захватывает в том числе с аналоговых камер видео, как то можно из него вытащить rtsp поток? что то не гуглится никак.
Приветствую.
zoneminder захватывает в том числе с аналоговых камер видео, как то можно из него вытащить rtsp поток? что то не гуглится никак.
Приветствую.
В debian 9 в /etc/network/interfaces прописано для влана
auto eth0
iface eth0 inet static
address zzz
netmask 255.255.255.0
post-up ethtool -K eth0 tx off rx off
auto eth0.24
iface eth0.24 inet static
address xxx
netmask 255.255.255.252
gateway yyy
post-up /bin/ip rule add from xxx table rostelecom
post-up /bin/ip route add default via yyy dev eth0.24 table rostelecom
post-down /bin/ip rule del from xxx table rostelecom
post-down /bin/ip route del default via yyy table rostelecom
vlan_raw_device eth0
вроде как первый для етх0 работает post-up, а для етп0.24 приходится после ребута вручную маршруты добавлять, что я делаю не так?
Приветствую.
Передаю браузеру кандидатов в sdp виде
...
a=setup:passive
a=ice-ufrag:IT54
a=ice-pwd:OnFL2Ee+hnsKEX4xh+jl4e
a=candidate:1 1 UDP 2013266431 fe80::ca4d:44ff:fe20:1e8b 39133 typ host
a=candidate:2 1 TCP 1015023359 fe80::ca4d:44ff:fe20:1e8b 9 typ host tcptype active
...и тд...
a=end-of-candidates
a=send
Все ок, браузер понял, отвечает мне своим кандидатом
...
a=candidate:3891818760 1 udp 2113937151 f971c089-ea36-4c38-8395-864a79fc694f.local 60013 typ host generation 0 network-cost 999
a=ice-ufrag:EU/h
a=ice-pwd:z+rv7a3jPh/i9bzs9JGJHS0a
a=ice-options:trickle
...
Как теперь вот это f971c089-ea36-4c38-8395-864a79fc694f.local непонятное, конвернуть в то, что поймет getaddrinfo ? И что вообще это такое и с чем едят?
Приветствую.
Через прокси mediamtx на централизованном сервере забирается стрим с условной «камеры», RTP в UDP, OpenVPN тоже UDP, VLC не показывает ничего (битрейт показывает порядка 10-20кбс), на прокси в логах потери ртп пакетов, если пущу трафик через TCP напрямую на проксю - видео показывает.
В чем может быть причина? Самое непонятное для меня - проблема всплывает на конкретных адресах, не везде, бывает уходит сама собой, что вообще можно продиагностировать?
Если глянуть tcpdump на сервере, то на впн интерфейсе вижу пакеты по 1472, которые местами уменьшаются до меньших величин, при этом если на сервере уже на интерфейсе с адреса, то всегда пакеты не более 784/780 байт, меньше могут, больше редкие исключения.
В traceroute криминала не вижу, до 30мс после 9 прыжков (но до шлюза провайдера или роутера, точно не знаю, адрес от stun сервера получаю)
Приветствую.
В продолжении темы RAID10 в mdadm сломался
Где сейчас можно взять НОВЫЙ ентерпрайз 2тб по цене не за 8тб???
Чот в магазах аля ситилинк/днс такие под 30к, чуть добавить и 8тб можно взять.
ЗЫ. Взял на озоне ST2000NM0008 за 15к - привезли конечно же восстановленную паль.
Приветствую.
Такая картина, выпало одновременно 2 диска
# cat /proc/mdstat
Personalities : [raid10] [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4]
md1 : active raid10 sdc2[1] sdb2[2]
1848402944 blocks super 1.2 512K chunks 2 near-copies [4/2] [_UU_]
bitmap: 1/14 pages [4KB], 65536KB chunk
md0 : active raid10 sdc1[1] sdb1[2]
104792064 blocks super 1.2 512K chunks 2 near-copies [4/2] [_UU_]
# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Jul 21 10:03:05 2020
Raid Level : raid10
Array Size : 104792064 (99.94 GiB 107.31 GB)
Used Dev Size : 52396032 (49.97 GiB 53.65 GB)
Raid Devices : 4
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Mon Jan 12 11:48:06 2026
State : clean, degraded
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Consistency Policy : resync
Number Major Minor RaidDevice State
- 0 0 0 removed
1 8 33 1 active sync set-B
2 8 17 2 active sync set-A
- 0 0 3 removed
Теперь в файловой системе ничего не дается сделать и обратно добавить диски тоже не хотит, советов много, но что сделать чтобы все окончательно не рухнуло? резервного сервера и дисков (пока) нет
# mdadm --manage /dev/md0 --add /dev/sda1
mdadm: cannot load array metadata from /dev/md0
Приветствую.
Подскажите, что то никак не гуглится у меня
<div id="date">Дата работ<br><br>
<div id="date_adr">Адрес</div><br>
<label id="date_old"><input type="radio" name="date_sel" value="123" checked="checked">321</label><br>
<label>
<input type="radio" name="date_sel">
<input type="date" id="date_new">
<input type=text id="date_exp" maxlength="128">
</label>
</div>
Как в через jquery поменять текст 321 без добавления span???
Простой $('#date_old').text('блабла') затирает input.
Приветствую.
Пытаюсь с хромом по webrtc поговорить, обменялся sdp описанием содержащим sha-256 отпечаток, произошло ice соединение и теперь шлет мне браузер какие то 157 байт аж 3 раза для создания DTLS подключения, делаю что то вроде
SSL_CTX * ssl_ctx = SSL_CTX_new(DTLS_method());
SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, cb_dtls_verify);
SSL_CTX_set_tlsext_use_srtp(ssl_ctx, "SRTP_AEAD_AES_256_GCM:SRTP_AEAD_AES_128_GCM:SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32");
...dtls_generate_keys(&ssl_cert, &ssl_key)...;
SSL_CTX_use_certificate(ssl_ctx, ssl_cert);
SSL_CTX_use_PrivateKey(ssl_ctx, ssl_key);
SSL_CTX_check_private_key(ssl_ctx);
SSL_CTX_set_read_ahead(ssl_ctx, 1);
...fingerprint...
SSL * ssl = SSL_new(ssl_ctx)
SSL_set_info_callback(ssl, cb_dtls);
BIO * read_bio = BIO_new(BIO_s_mem());
BIO_set_mem_eof_return(read_bio, -1);
.....
SSL_set_bio(ssl, read_bio, write_bio);
.....
int written = BIO_write(read_bio, buf, len);
char data[DTLS_BUFFER_LEN];
--->int read = SSL_read(ssl, &data, DTLS_BUFFER_LEN);
if(read < 0)
{
if(SSL_get_error(ssl, read) == SSL_ERROR_SSL)
{
char err[256];
ERR_error_string_n(ERR_get_error(), err, sizeof(err));
g_printerr("ERROR SSL handshake (%s)\n", err);
}
else
g_printerr("ERROR SSL read (%s)\n", ERR_reason_error_string(ERR_get_error()));
return;
}
И получаю ошибку в этом месте SSL_ERROR_SSL error:140DF114:SSL routines:SSL_read:uninitialized
Приветствую.
Пока на берегу рассудите меня все таки - начал потихоньку втаскивать это чудище в свой проект по записи архивов на soc, для такой же распределенной трансляции в первом пределе только как p2p. За базу беру libnice и libav, примером использую код Janus.
Но вот уже на который техсобес хожу в работающие проекты - ну как бэ НИКТО такой «ерундой» не занимается, старый rtsp или подобное, сегодня так рассказали как все это дело еще и инкапсулируют в свой протокол чтоб от vpn уйти… Разрабы из OpenIPC говорят тяжёлый он и не будут они его на камерах внедрять…
Нет в вакансиях в новые проекты смотрю бывает указывают, но как исключение как будто!?
Приветствую.
Высылает банк письма в формате DIRECTUM ESD с вложением, которое почтовые клиенты (например, munpack) видят как smime.p7m, при этом само описание вложения письма имеет вид
Content-Type: application/pkcs7-mime; smime-type=enveloped-data;
Content-Disposition: attachment; filename="smime.p7m"
Content-Transfer-Encoding: base64
вариации в духе
openssl smime -decrypt -in smime.p7m -recip bank.crt -noverify -inkey primary.key -out txt.txt
пишут ошибку
unable to load signing key file
139705852929216:error:0909006C:PEM routines:get_name:no start line:../crypto/pem/pem_lib.c:745:Expecting: ANY PRIVATE KEY
очевидно потому что openssl ничего не знает про шифрование ГОСТ
если ключи засунуть в аутлук, то он видит файл ESD в письме и нормально его извлекает
Приветствую )
Имеется большой список со значениями (пускай будет vector, хотя использую deque) - как бы найти первый ближайший элемент, который меньше или равен значению???
На основании (а так же из-за наличия только 11/14) запили реплику
ssize_t cnt = q.size() - 1;
size_t m, l = 0, i = 0;
while (cnt > 0)
{
i = l;
m = cnt / 2;
i += m;
if (q.at(i) < val)
{
l = ++i;
cnt -= m + 1
}
else
cnt = m;
}
все бы хорошо, НО находится всегда первый после val, std::upper_bound тоже пробовал реализовать, но всегда получаю последний элемент, поскольку почти никогда не имею значения val в массиве.
З.Ы. сдвинуться на назад можно на элемент, но хочется понять почему при бинарном поиске получается индекс справа, а не слева!?
или например еще один из вариантов бинарного поиска
size_t m, l = 0, r = q.size() - 1;
while (l < r)
{
m = (l + r) / 2;
if (q.at(m) < val)
l = m + 1;
else if (q.at(m) > val)
r = m - 1;
else
break;
}
Но при этом получаю то слева, то справа индекс очевидно в зависимости от результата целочисленного деления.
З.Ы. и тут результат конечно можно перепроверить после цикла, но как бы гарантированно сразу получить элемент слева от числа???
Приветствую.
Как бы вот так настроить на порту тегированный и не тегированный трафик из дефолтного влан 1, чтобы находясь на этом порту через ssh не потерять доступ?
имею вот такую штуку, где 13 и 24 порты должны быть четко в своем влане
switch#show vlan
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Gi0/1, Gi0/2, Gi0/3, Gi0/4, Gi0/5, Gi0/6, Gi0/7, Gi0/8, Gi0/9, Gi0/10, Gi0/11, Gi0/12, Gi0/14, Gi0/15
Gi0/16, Gi0/17, Gi0/18, Gi0/19, Gi0/20, Gi0/21, Gi0/22, Gi0/23
13 Souz active Gi0/13
24 Rostelecom active Gi0/24
1002 fddi-default act/unsup
1003 token-ring-default act/unsup
1004 fddinet-default act/unsup
1005 trnet-default act/unsup
VLAN Type SAID MTU Parent RingNo BridgeNo Stp BrdgMode Trans1 Trans2
---- ----- ---------- ----- ------ ------ -------- ---- -------- ------ ------
1 enet 100001 1500 - - - - - 0 0
13 enet 100013 1500 - - - - - 0 0
24 enet 100024 1500 - - - - - 0 0
1002 fddi 101002 1500 - - - - - 0 0
1003 tr 101003 1500 - - - - - 0 0
1004 fdnet 101004 1500 - - - ieee - 0 0
1005 trnet 101005 1500 - - - ibm - 0 0
Remote SPAN VLANs
------------------------------------------------------------------------------
Primary Secondary Type Ports
------- --------- ----------------- ------------------------------------------
Но нужно чтобы 23 порт получал нетегированный vlan 1 и тегированный vlan 13, при этом я сам нахожусь на этом порту через SSH (через несколько комков)
т.е. если я сделаю
interface GigabitEthernet 0/23
switchport trunk allow vlan 13
то мне уже не удастся выполнить!?
switchport trunk native vlan 1
Приветствую.
Подскажите где свободно в нынешних условиях скачать можно? Сейчас 12.2(35)SE5 C2960-LANBASE-M
Приветствую.
Не понимаю из документации так можно зачем то
std::unordered_map<std::string, Т> umap;
umap["блабла"] = blabla;
auto hash_fn = umap.hash_function();
size_t hash_value = hash_fn("блабла");
Но вот если ключ длинный - как избежать повторного вычисления? Хотелось бы дополнительно использовать это значение.
ЗЫ. C++11/14
Приветствую.
От рута и через судо все работает, никак не удается с пользователем в группе выполнить asterisk -r
Варианты ошибок в зависимости от пользовательской учетки
$ asterisk -r
-bash: asterisk: команда не найдена
Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)
Все права файловые права есть на этот run
$ ls -l /var/run/asterisk/
итого 8
-rwxr-xr-x 1 asterisk asterisk 786 дек 11 18:40 alt.asterisk.canary.tweet.tweet.tweet
srwxr-xr-x 1 asterisk asterisk 0 дек 10 18:11 asterisk.ctl
-rw-r--r-- 1 asterisk asterisk 4 дек 10 18:11 asterisk.pid
подозреваю selinux но это не точно
Приветствую.
Как я понимаю обычное решение это скопировать куда то новый бинарник, затем запустить его с какими то параметрами из своего процесса через exec* и уже в нем положить себя на свое старое место - неудобно в этом то, что нужно проверяться из какого места загружен и либо снова запускаться из старого места либо все время помнить что запущен из «клона», а нет ли более хитрого способа без внешнего кода на C/C++ подменить свой бинарник во время его исполнения???
может есть какие то штатные средства ОС?
Приветствую.
Нужно скачать с http сервера файл и посчитать его md5, взял из документации пример, все в нем работает пока не вставляю в него свой кривой код вместо cout - в зависимости от размера файла получаю то корректные данные, то нет
#include <openssl/md5.h>
#include <fstream>
#include <iomanip>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
bool HTTPDownload(const std::string & host, const std::string & port, const std::string & file_src, const char * file_dst, const std::string & md5)
{
std::ofstream outfile(file_dst, std::ios::binary);
if (!outfile.is_open())
{
fprintf(stderr, "ERROR %s\n", file_dst);
return false;
}
MD5_CTX md5Context;
MD5_Init(&md5Context);
try
{
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(host, port);
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::socket socket(io_service);
boost::asio::connect(socket, endpoint_iterator);
{
boost::asio::streambuf request;
std::ostream request_stream(&request);
request_stream << "GET " << file_src << " HTTP/1.0\r\n"
<< "Host: " << host << "\r\n"
<< "Accept: */*\r\n"
<< "Connection: close\r\n\r\n";
boost::asio::write(socket, request);
}
boost::asio::streambuf response;
boost::asio::read_until(socket, response, "\r\n");
std::istream response_stream(&response);
std::string http_version;
response_stream >> http_version;
unsigned int status_code;
response_stream >> status_code;
std::string status_message;
std::getline(response_stream, status_message);
if (!response_stream || http_version.substr(0, 5) != "HTTP/")
{
fputs("ERROR HTTP response\n", stderr);
return false;
}
if (status_code != 200)
{
fprintf(stderr, "ERROR %u\n", status_code);
return false;
}
boost::asio::read_until(socket, response, "\r\n\r\n");
std::string header;
while (std::getline(response_stream, header) && header != "\r") fprintf(stdout, "%s\n", header.c_str());
fputc('\n', stdout);
boost::system::error_code error;
while (boost::asio::read(socket, response, boost::asio::transfer_at_least(1), error));;
if (error != boost::asio::error::eof) return false;
if (response.size() > 0)
{
auto response_data = boost::asio::buffer_cast<const char*>(response.data());
MD5_Update(&md5Context, response_data, response.size());
outfile << response_data;
}
else return false;
}
catch (std::exception& e)
{
fprintf(stderr, "ERROR [%s]: %s\n", file_dst, e.what());
return false;
}
unsigned char md5hash[MD5_DIGEST_LENGTH];
MD5_Final(md5hash, &md5Context);
std::stringstream md5ss;
md5ss << std::hex << std::setfill('0');
for (const auto & byte: md5hash) md5ss << std::setw(2) << (int)byte;
fprintf(stdout, "\n%s\n", md5ss.str().c_str());
return true;
}
Приветствую.
Начал ловить SIGSEGV в непредсказуемые моменты в многопоточке через несколько часов штатной работы, как обычно запустил приложуху в gdb глянул backtrace после падения, вроде ничего криминального, но увеличил область видимость переменных и сделал копию памяти, теперь тот же bt выдает такое
ПРОЧИЙ-ВЫХОЛОП
[New Thread 0xb58ff410 (LWP 16262)]
[Thread 0xb58ff410 (LWP 16262) exited]
БЛА-БЛА-ВЫХЛОП-ПРИЛОЖУХИ
[New Thread 0xb58ff410 (LWP 16292)]
БЛА-БЛА-ВЫХЛОП-ПРИЛОЖУХИ
[Thread 0xb58ff410 (LWP 16292) exited]
БЛА-БЛА-ВЫХЛОП-ПРИЛОЖУХИ
[New Thread 0xb58ff410 (LWP 16418)]
Thread 14 "Recorder" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb0fff410 (LWP 14943)]
malloc_consolidate (av=av@entry=0xb1000010) at malloc.c:4174
4174 malloc.c: No such file or directory.
(gdb) bt
#0 malloc_consolidate (av=av@entry=0xb1000010) at malloc.c:4174
#1 0xb6abff54 in _int_malloc (av=av@entry=0xb1000010, bytes=bytes@entry=1264) at malloc.c:3457
#2 0xb6ac14a2 in __GI___libc_malloc (bytes=bytes@entry=1264) at malloc.c:2920
#3 0xb6ac1aca in __GI___libc_realloc (oldmem=0x0, bytes=1264) at malloc.c:3001
#4 0x00227164 in av_buffer_realloc (pbuf=pbuf@entry=0xb0ff9eb8, size=size@entry=1264) at libavutil/buffer.c:192
#5 0x0011113a in packet_alloc (size=1200, buf=0xb0ff9eb8) at libavcodec/avpacket.c:88
#6 av_new_packet (pkt=pkt@entry=0x6fb020, size=size@entry=1200) at libavcodec/avpacket.c:100
#7 0x00109736 in ff_h264_handle_frag_packet (nal_header_len=1, nal_header=<synthetic pointer>, start_bit=0, len=1200,
buf=0x71265e "\212\225杖A\357̰\f\356\243\315\300\066T\353US{7\231^\035\271\214>Q\n\346\232{b<\032\067\070y\203_\277M\004l7\240\301\005\305\332\334\304\006\361\366K\310>\377|\310$\020\233\334\030\363L\212\224)b\207\n_\325_\023\321囖\022\062\034\254X\341\205A\353\035", pkt=0x6fb020) at libavformat/rtpdec_h264.c:273
#8 h264_handle_packet_fu_a (nal_counters=0x0, nal_mask=31, data=<optimized out>, len=1200,
buf=0x71265e "\212\225杖A\357̰\f\356\243\315\300\066T\353US{7\231^\035\271\214>Q\n\346\232{b<\032\067\070y\203_\277M\004l7\240\301\005\305\332\334\304\006\361\366K\310>\377|\310$\020\233\334\030\363L\212\224)b\207\n_\325_\023\321囖\022\062\034\254X\341\205A\353\035", pkt=0x6fb020, ctx=<optimized out>) at libavformat/rtpdec_h264.c:308
#9 h264_handle_packet (ctx=<optimized out>, data=<optimized out>, st=0x6fea10, pkt=0x6fb020, timestamp=0xb0ff9f48,
buf=0x71265c "|\001\212\225杖A\357̰\f\356\243\315\300\066T\353US{7\231^\035\271\214>Q\n\346\232{b<\032\067\070y\203_\277M\004l7\240\301\005\305\332\334\304\006\361\366K\310>\377|\310$\020\233\334\030\363L\212\224)b\207\n_\325_\023\321囖\022\062\034\254X\341\205A\353\035", len=1202, seq=4736, flags=0) at libavformat/rtpdec_h264.c:359
#10 0x00107308 in rtp_parse_packet_internal (s=0x6ff020, pkt=0x6fb020,
buf=0x71265c "|\001\212\225杖A\357̰\f\356\243\315\300\066T\353US{7\231^\035\271\214>Q\n\346\232{b<\032\067\070y\203_\277M\004l7\240\301\005\305\332\334\304\006\361\366K\310>\377|\310$\020\233\334\030\363L\212\224)b\207\n_\325_\023\321囖\022\062\034\254X\341\205A\353\035", len=1202) at libavformat/rtpdec.c:762
#11 0x001080ce in rtp_parse_one_packet (len=1214, bufptr=<optimized out>, pkt=0x6fb020, s=0x6ff020) at libavformat/rtpdec.c:916
#12 ff_rtp_parse_packet (s=0x6ff020, pkt=pkt@entry=0x6fb020, bufptr=bufptr@entry=0x6fd490, len=len@entry=1214)
at libavformat/rtpdec.c:950
#13 0x000e8f98 in ff_rtsp_fetch_packet (s=s@entry=0x6fabb0, pkt=pkt@entry=0x6fb020) at libavformat/rtsp.c:2276
#14 0x000ead78 in rtsp_read_packet (s=0x6fabb0, pkt=0x6fb020) at libavformat/rtspdec.c:912
#15 0x000b58a4 in ff_read_packet (s=s@entry=0x6fabb0, pkt=pkt@entry=0x6fb020) at libavformat/demux.c:570
#16 0x000b6288 in read_frame_internal (s=0x6fabb0, pkt=0x6fb020) at libavformat/demux.c:1248
#17 0x000b6cf0 in av_read_frame (s=0x6fabb0, pkt=0x6fb020) at libavformat/demux.c:1455
#18 0x000301dc in CHandleH264::HandleRead(CHandlers::stPkt_t&) ()
#19 0x0002e7ea in CHandlers::VideoReaderLoop() ()
#20 0xb6c87dc8 in ?? () from /usr/lib/arm-linux-gnueabihf/libstdc++.so.6
#21 0xb6f2d5b4 in start_thread (arg=0x0) at pthread_create.c:335
#22 0xb6b01c3c in ?? () at ../sysdeps/unix/sysv/linux/arm/clone.S:89 from /lib/arm-linux-gnueabihf/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Вродь ничего в HandleRead эдакого у меня нет с выделением памяти или выходом за границы, обычный кольцевой буфер по модулю
Погуглил про malloc_consolidate, пишут сделать export MALLOC_CHECK_=3 для поиска кривого места в коде и теперь уже скоро сутки не могу уронить приложение как не гоняю, хотя падало вообще даже не под особой нагрузкой, почти в простое, через 2-6 часов…
Осталось еще valgrind попробовать, но раньше использовал его только для поиска места утечки в чужом коде, но визуально за 12 часов процессорного времени течи не наблюдаю (26мб памяти + 140мб виртуальной).
Приветствую.
В продолжении темы
Задача отдать одновременно записываемый видео архив в сеть с флешки без файловой системы в один поток после успешного боевого тестирования идеи rtsp публикацией перетекла в задачу многопотока (предварительно до 50 штук). Как советовали в той теме решил попробовать mmap всего сырого носителя иба ручное управление буфером как то не улыбает.
Наваял нечто похожее
if ((fd = open(device, O_RDONLY)) < 0)
fprintf(...);
else if ((md = mmap(NULL, partition_size, PROT_READ, MAP_SHARED, fd, (first_lba - 1) * sector_size + 1)) == MAP_FAILED)
close(fd);
else if (madvise(md, partition_size, MADV_SEQUENTIAL) < 0)
fprintf(...);
Вопросы
offset с учетом того что он не нулевой только на величину partition_size?(uint8_t*)md + позиция_байта offset надо учитывать?fwrite/fflush со своим дескриптором?| следующие → |