LINUX.ORG.RU

Сообщения wolverin

 

Файлы через NAT - libjingle или libnice или ...?

Форум — Development

Приветствую, нуждаюсь в совете.

Надо файл перекинуть через пару NATов, свой лисапед на С/C++ я уже попробовал с какой то чужой либой, возвращающей мне параметры ната от чужого STUN сервера - вроде все не сложно, обмениваемся получаемыми параметрами от стуна через какой то сигнальный сервер (в моем случае MQTT), создаем маршрут в НАТе посылкой UDP пакета и погнали качать.

НО во всей этой канители напрягает пара моментов, под которые нужно продолжать пилить лисапед

  1. обеспечение корректности полученных данных
  2. шифрование трафика

Последнее важно, но не так как первое.

Посоветуйте НЕБОЛЬШУЮ широко используемую либу под эти цели???

 , ,

wolverin
()

Линковка библиотек с одинаковыми именами функций

Форум — Development

Не было печали, пока не решил еще одну библиотеку в проект засунуть и оказалось что имена функций повторяются

Как победить можно???

# make -j2 -B Recorder
rm -f Recorder
gcc -c RecorderFDisk.c -I./util-linux/ -Wall -pedantic -O3
gcc -c RecorderArchive.c -I./paho.mqtt.c/src/ -Wall -pedantic -O3
gcc -c RecorderFFmpeg.c -I./FFmpeg/ -Wall -pedantic -O3
gcc -c RecorderFFserver.c -I./FFmpeg/ -O3
g++ -o Recorder Recorder.cpp ./libcommon/Sys.cpp                                \
    RecorderFDisk.o RecorderArchive.o RecorderFFmpeg.o RecorderFFserver.o       \
    ./util-linux/libblkid/src/libblkid_la-probe.o                               \
    ./util-linux/libuuid/src/libuuid_la-parse.o                                 \
    ./util-linux/libuuid/src/libuuid_la-unparse.o                               \
    ./util-linux/libuuid/src/libuuid_la-gen_uuid.o                              \
    ./util-linux/disk-utils/fdisk-fdisk-list.o                                  \
    ./util-linux/.libs/libcommon.a                                              \
    ./util-linux/.libs/libsmartcols.a                                           \
    ./util-linux/.libs/libtcolors.a                                             \
    ./util-linux/.libs/libblkid.a                                               \
    ./util-linux/.libs/libuuid.a                                                \
    ./util-linux/.libs/libfdisk.a                                               \
    ./FFmpeg/libavdevice/libavdevice.a                                          \
    ./FFmpeg/libavfilter/libavfilter.a                                          \
    ./FFmpeg/libavformat/libavformat.a                                          \
    ./FFmpeg/libavcodec/libavcodec.a                                            \
    ./FFmpeg/libavutil/libavutil.a                                              \
    ./FFmpeg/libswscale/libswscale.a                                            \
    ./FFmpeg/libswresample/libswresample.a                                      \
    ./paho.mqtt.c/build/src/libpaho-mqtt3a.a                                    \
    -lpthread -ltinfo -lm -lx264 -lv4l2 -lasound -Wall -pedantic -O3
./paho.mqtt.c/build/src/libpaho-mqtt3a.a(WebSocket.c.o): In function `uuid_generate':
WebSocket.c:(.text+0x11): multiple definition of `uuid_generate'
./util-linux/libuuid/src/libuuid_la-gen_uuid.o:/root/utils/util-linux/libuuid/src/gen_uuid.c:551: first defined here
./paho.mqtt.c/build/src/libpaho-mqtt3a.a(WebSocket.c.o): In function `uuid_unparse':
WebSocket.c:(.text+0xc0): multiple definition of `uuid_unparse'
./util-linux/libuuid/src/libuuid_la-unparse.o:/root/utils/util-linux/libuuid/src/unparse.c:74: first defined here
collect2: error: ld returned 1 exit status
Makefile:39: ошибка выполнения рецепта для цели «Recorder»
make: *** [Recorder] Ошибка 1

 , ,

wolverin
()

Принудительно I-frame для libx264

Форум — Development

Приветствую.

Суть проблемы - мой перекодировщик (написанный на либах от ffmpeg) из мжпег в х264 отправляет пакеты в мой ртсп сервер (написанный на основе исходника ffserver), проблема в том, что если сервер перестает читать, а перекодировщик писать в произвольном месте - приходится долго ждать на просмотр первый И(idr) кадр, когда требуется продолжить просмотр новому клиенту.

Можно как то принудительно заставлять кодек его генерировать в произвольном месте???

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

 , ,

wolverin
()

POCO vs GCC

Форум — Development

Предстоит перелопатить говнопроект, написанный с помощью этой библиотеки для ARMHF архитектуры.

как то все «в блокноте» писал раньше небольшое, потом через gcc собирал, хотя вряд ли для армки можно что то архисложное написать (ffmpeg + ffserver удалось «в блокноте» втащить в своей проект)

Есть смысл выкидывать это поделие или лучше с ним разбираться? Проблемы говнопроекта сами по себе многогранны, хотя и используются доступы в БД и HTTP, многопоточность очевидно, может что то еще (XML и JSON точно понадобятся)

В задаче есть ограничение на ресурсы как по памяти, так и высоконагруженное цпу

 ,

wolverin
()

iptables с localhost до lan

Форум — Admin

Подключаюсь к сервису на сервере через проброс порта через ссш тунель, все работало замечательно, пока сервис не переехал дальше за шлюз.

Можно как то подключение к порту локалхоста перенаправить на порт в локальной сети через iptables ???

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

 , ,

wolverin
()

Режет ли NAT скорость паков SIP/RTP и MQTT?

Форум — Admin

Сгорела значит у меня сервачная плата, старая как .овно мамонта на 775 сокете еще, крутился там одинокий астериск, глянул на авиту - ба, да 2х процессорные 1366 платы + камни сущие копейки (за новые сервачные БП только ценнег дерут), заказал - пришло.

И тут мысль свербит значит куда девать такую мощу то теперь, а не перенести ли мне задачи из облачного астериска и не добавить ли туда москиту, одно напрягает - сервак за НАТом (с фаерволом конеш) на другой теперь уже сравнительно более слабой железке.

Ваше мнение?

 , ,

wolverin
()

Цикл в thread по mutex или atomic_bool в С++?

Форум — Development

Если нужно просто из цикла условно одновременно во ВСЕХ потоках выходить, то что разумней цикл по мутексу делать или по atomic_bool ??? или вообще это все работает одинаково и на атомике просто кода будет меньше

Оговорюсь С++20 недоступен, поэтому atomic_flag урезан.

Конструкция класса мутекса (заимствовано)

class multithr_off
{
private:
    using guard = unique_lock<mutex>;

    bool _on;
    mutable condition_variable cv;
    mutable mutex lock;

public:
    using ptr_t = shared_ptr<multithr_off>;

    multithr_off() : _on(true) {}

    bool isOn() const
    {
        guard g(lock);
        return _on;
    }

    void off()
    {
        guard g(lock);
        _on = false;
        g.unlock();
        cv.notify_all();
    }

};

auto poff = make_shared<multithr_off>();

Варианты проверок (все имеют тело цикла с обработкой)

1. ожидание вода с клавиатуры (вообще выходит отсюда по isOn!?)
 while ((c = getchar()) != EOF && poff->isOn())

2. ожидание семафора, который отпустят из другого потока
 while (sem_wait(psem) == 0 && poff->isOn())

3. ожидание сброса атомика из другого потока
 atomic_bool abRunRead(false);

 abRunRead.store(true);
 while (abRunRead.load() && poff->isOn())

Честно говоря даже не знаю - проверяются сразу оба условия или последовательно и, например, второе не проверяется если первое ложно.

 , , ,

wolverin
()

Конкурирующая очередь в thread C++ (код)

Форум — Development

В продолжении темы Конкурирующая очередь в thread C++

суть которой в кратце

  • 3 конкурирующие потока
    • п1 самый быстрый читает кадры с камеры
    • п2 записывает кадр как есть на диск через интервалы времени
    • п3 декодирует кадр, затем кодирует в отдельном потоке и пишет в сеть
  • для потоков создан буфер заранее выделенных кадров (длинной 5 шт должно хватать!?)
  • алгоритм конкуренции выглядит следующим образом - двунаправленный список из структур временной метки и индекса буфера, п1 забирает GetIdxPkt из начала списка индекс, пишет кадр по этому номеру буфера и добавляет PutIdxPkt индекс в конец, п2 и 3 забирают индекс с конца списка и после обработки кадра добавляют индекс в начало.

Собсна код очереди, указатель на которую передам в эти потоки, нуждаюсь в оценке его адекватности

typedef struct
{
    time_t ts;
    uint8_t pos;
} stPktLive_t;

enum eQueuePos_t
{
    FRONT,
    BACK
};

class CQueue
{
private:
    const uint8_t maxQ;

    uint8_t cntQ;
    list<stPktLive_t> ltQ;

    mutex mtx;
    condition_variable cvPut, cvGet;
    using guard = unique_lock<mutex>;

public:

CQueue(uint8_t lQueue)
    : maxQ(lQueue), cntQ(0)
{}

~CQueue()
{
    if (ltQ.size() > 0) ltQ.clear();
}

int PutIdxPkt(stPktLive_t stV, eQueuePos_t pos)
{
    guard g(mtx);
    while (cntQ == maxQ) cvPut.wait(g);

    mtx.lock();

    if (pos == FRONT) ltQ.push_front(stV);
    else ltQ.push_back(stV);
    cntQ++;

    cvGet.notify_all();//notify_one()

    mtx.unlock();

    return cntQ;
}

int GetIdxPkt(stPktLive_t & stV, eQueuePos_t pos)
{
    guard g(mtx);
    while (cntQ == 0) cvGet.wait(g);

    mtx.lock();

    if (pos == FRONT)
    {
        stV = ltQ.front();
        ltQ.pop_front();
    }
    else
    {
        stV = ltQ.back();
        ltQ.pop_back();
    }
    cntQ--;

    cvPut.notify_all();

    mtx.unlock();

    return cntQ;
}
};

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

 ,

wolverin
()

Конкурирующая очередь в thread C++

Форум — Development

Продолжаю мучить сообщество своими хлупыми вопросами на похожие темы ) Вернуть результат thread в С++ без мутексов?

Необходимо запараллелить 3 потока

  1. получение данных (чтение с камеры)
  2. пересжатие и запись в сеть (декодировани в основном и кодирование в дополнительном уже выполняется кажется эффективно в 2х потоках на Си через 2 семафора, по очереди отпускающие поток друг друга через условную «очередь» из массива 2х указателей, в которой меняется только индекс)
  3. запись данных из п.1 на диск

В однопоточной реализации вариантов 1+3 или 1+2 все работает вроде эффективно, задача 1 выполняется менее 30 мс, 2 - от 30 до 100мс, 3 - в районе 50мс

Теоретически конечно потоки 2 и 3 должны только читать память из потока 1 (хотя что происходит внутри сторонней либы потока 2 я не знаю) и теоретически можно было бы обойтись одним семафором для основного потока 1, НО поток 3 должен читать и записывать данные (кадры) на диск через равные промежутки времени, а поток 2 читать все данные (кадры) без задержек.

В предыдущей теме меня пнули в сторону атомиков, из чтения всяких хабров я понял следующее - работающие только с памятью атомик существенно быстрее, чем системный вызов мьютекса/семафора, однако как я понял в этом случае предлагается ждать в бесконечном цикле изменение атомика - но ведь это загрузит поток на 100%, а у меня только поток 2 грузит оставшиеся 300% на 4х ядрах

При этом как бы еще решить проблему конкуренции за ПОСЛЕДНИЙ кадр, все что раньше попало в очередь уже не имеет значения и просто считаю дропнутым

ЗЫ. Извините за многобукав! ЗЫ1. хотелось бы понять направление в которое двигаться.

 ,

wolverin
()

Вернуть результат thread в С++ без мутексов?

Форум — Development

Можно так?

Логика - запускаю thread.detach(), который либо после проверок сразу завершается, если проверки пройдены встает на ожидание внешнего события (слушает на сокете порт), как только событие наступает делает некоторые действия и завершается - так вот из основного потока хотелось бы знать выполняется ли еще этот поток, если нет, то получить из него значение БЕЗ блокировки основного потока?

Показалось future с его async() подойдет, но оказалось valid() проверяет всего лишь был ли async() и не делали ли еще get(), а не отсутствие результата для get(), следовательно если поток не завершился get() блокирует основной поток.

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

 ,

wolverin
()

Горячее подключение SD карты в Ubuntu ARM

Форум — General

Подскажите, как сделать?

Все что вижу

root@NanoPi-NEO-Core:~# ls -l /sys/class/mmc_host/mmc*
lrwxrwxrwx 1 root root 0 Feb 11 18:22 /sys/class/mmc_host/mmc0 -> ../../devices/platform/soc/1c11000.mmc/mmc_host/mmc0
lrwxrwxrwx 1 root root 0 Feb 11 18:22 /sys/class/mmc_host/mmc1 -> ../../devices/platform/soc/1c0f000.mmc/mmc_host/mmc1

Видится только /dev/mmcblk0, а должен еще появиться /dev/mmcblk1

В dmesg тишина, как будто и флешку не вставлял.

Понятно, что могу ребутнуться и флешка увидится, но мне на нее изменения внести надо сначала иба она загрузочная.

 , ,

wolverin
()

Как RTP соединение после RTSP ???

Форум — Development

Приветствую.

Продолжнаю мучать тему Свой RTSP север для ffmpeg

Покамесь удалось скомпилировать ffserver.c от версии 3.4 с библиотеками 5.1, вроде разобрался как там диалог производится между RTSP сервером и клиентом (правда оказалось что ffplay шлет одну последовательность ртсп команд - нет команды SETUP, только OPTIONS, DESCRIBE и потом PLAY, а vlc нескольку другую).

Надо бы теперь RTP поток стримануть на клиента, с наскока не удается сообразить - а для ртп тоже что ли нужен слушающий пишущий сокет или «клиентская» сторона все таки выступает в роли ртп сервера?

 , ,

wolverin
()

Свой RTSP север для ffmpeg

Форум — Development

Приветствую.

Сейчас удалось с помощью библиотек ффмпега стримануть видео на другой ртсп сервер (сейчас использую rtps-simple-server) через функции avformat_alloc_output_context2(&pFmtCtxOut, NULL, «rtsp», rtsp_url) и av_interleaved_write_frame, но нужна более сложная логика работы с сами видео, а не ртсп сервером, поэтому сторонний сервер не очень подходит.

Да я знаю что поддержка ffserver закончилась в 3.4 версии ффмпега, но можно ли что то простое наваять в с последней версией, например, в логике

  1. слушать сокетом порт
  2. при подключении писать в него(? или очевидно должно быть создано еще одно соединение, но как это согласовать с «клиентом»?) этими же функциями, как пишу на сервер

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

 , , , ,

wolverin
()

Потоки и мутексы в Си

Форум — Development

Нуждаюсь в ликбезе )

Раньше как то приходилось использовать только в С++ для контроля изменении в объекте класса, а что то в процедурном варианте не соображу как безопасно?

Есть 2 потока декодирования и кодирования, в неком участке кода декодирования мне нужно скопировать память для потока кодирования, понятно что это место нужно защитить мьютексом и хотелось бы это сделать в потоке кодирования, однако как правильно обрабатывать

  1. переменную int состояния ошибок в потоках - нужно ли 2 таких переменных (ошибка в любом потоке должна останавливать оба), можно ли писать и читать из разных потоков одновременно без мутексов когда их 2 (каждый либо пишет, либо читает), чтобы не тормозить выполнение?

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

или вообще какой то спецфический тип мутекса нужен!?

ПС. а то у меня получается 3 или 5 мутексов мне нужно чтоб каждую операцию обрабатывать.

 ,

wolverin
()

FFmpeg libav сыпется изображение на h264

Форум — Development

Приветствую

Продолжаю мучать перекодировку из mjpeg в libx264 с отдачей в rtsp

Запускаю ffmpeg с параметрами и смотрю на другой локальной машине в ffplay (или через rtsp-simple-server в vlc)

# ./ffmpeg -f v4l2 -input_format mjpeg -video_size 640x480 -i /dev/video0 -c:v libx264 -pix_fmt yuv422p -preset ultrafast -r 30 -b:v 500k -minrate:v 300k -maxrate:v 500k -bufsize 1000k -f rtsp -rtsp_transport udp rtsp://192.168.36.212:554/cam
ffmpeg version N-107213-gfed07ef Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.12) 20160609
  configuration: --prefix=/usr --enable-nonfree --enable-gpl --enable-version3 --enable-libx264 --enable-libv4l2 --disable-libxcb --disable-vaapi --disable-bzlib --disable-zlib --disable-postproc --disable-xlib
  libavutil      57. 27.100 / 57. 27.100
  libavcodec     59. 33.100 / 59. 33.100
  libavformat    59. 25.100 / 59. 25.100
  libavdevice    59.  6.100 / 59.  6.100
  libavfilter     8. 41.100 /  8. 41.100
  libswscale      6.  6.100 /  6.  6.100
  libswresample   4.  6.100 /  4.  6.100
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 260677.910302, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 30 fps, 30 tbr, 1000k tbn
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[swscaler @ 0x14b65c0] [swscaler @ 0x14bfb20] deprecated pixel format used, make sure you did set range correctly
................
[swscaler @ 0x14b65c0] [swscaler @ 0x1536f00] deprecated pixel format used, make sure you did set range correctly
[libx264 @ 0x14a0b40] using cpu capabilities: ARMv6 NEON
[libx264 @ 0x14a0b40] profile High 4:2:2, level 3.0, 4:2:2 8-bit
[libx264 @ 0x14a0b40] 264 - core 148 r2643 5c65704 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc_lookahead=0 rc=cbr mbtree=0 bitrate=500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=500 vbv_bufsize=1000 nal_hrd=none filler=0 ip_ratio=1.40 aq=0
Output #0, rtsp, to 'rtsp://192.168.36.212:554/cam':
  Metadata:
    encoder         : Lavf59.25.100
  Stream #0:0: Video: h264, yuv422p(tv, bt470bg/unknown/unknown, progressive), 640x480, q=2-31, 500 kb/s, 30 fps, 90k tbn
    Metadata:
      encoder         : Lavc59.33.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 500000/0/500000 buffer size: 1000000 vbv_delay: N/A
frame=  964 fps= 29 q=26.0 size=N/A time=00:00:31.86 bitrate=N/A dup=227 drop=0 speed=0.957x

Выхлоп ffplay

Input #0, rtsp, from 'rtsp://192.168.36.212:554/cam':    0B f=0/0   
  Metadata:
    title           : No Name
  Duration: N/A, start: 0.130000, bitrate: N/A
    Stream #0:0: Video: h264 (High 4:2:2), yuv422p(tv, bt470bg/unknown/unknown), 640x480, 30 fps, 30 tbr, 90k tbn, 60 tbc
 117.44 M-V: -0.030 fd=   5 aq=    0KB vq=   11KB sq=    0B f=1/1

ВСЕ ИДЕАЛЬНО!!! сравнительно конечно

запускаю свой говнокод, дампы

Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 260917.808496, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 30 fps, 30 tbr, 1000k tbn
[libx264 @ 0x14e82c0] using cpu capabilities: ARMv6 NEON
[libx264 @ 0x14e82c0] profile High 4:2:2, level 3.0, 4:2:2 8-bit
[libx264 @ 0x14e82c0] 264 - core 148 r2643 5c65704 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc_lookahead=0 rc=cbr mbtree=0 bitrate=500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=500 vbv_bufsize=1000 nal_hrd=none filler=0 ip_ratio=1.40 aq=0
Output #0, rtsp, to 'rtsp://192.168.36.212:554/cam':
  Stream #0:0: Video: h264, yuv422p, 640x480, q=2-31, 500 kb/s, 90k tbn

Выхлоп ffplay

Input #0, rtsp, from 'rtsp://192.168.36.212:554/cam':    0B f=0/0   
  Metadata:
    title           : No Name
  Duration: N/A, start: 0.406333, bitrate: N/A
    Stream #0:0: Video: h264 (High 4:2:2), yuv422p, 640x480, 30 fps, 30 tbr, 90k tbn, 60 tbc
   7.28 M-V:  7.655 fd= 147 aq=    0KB vq=    0KB sq=    0B f=727/727

И с середины изображения сыпется вниз и тормоза...

Подскажите, если есть телепаты куда смотреть, замучался уже гадать.

 ,

wolverin
()

FFmpeg libav и многопоточность?

Форум — Development

Приветствую

Продолжаю мучать перекодировку из mjpeg в libx264 с отдачей в rtsp

В целом задача выглядит как писать на флешку mjpeg 1920х1080 хотя б по 15 кадров и отдавать по запросу максимально возможное fps в rtsp с разрешением 640х480, но не меньше 15 кадров

И тут опять затык, требующий совета или поругайте идею, пожалста.

Стандартная последовательность действий такова:

  1. Захватываем пакет (и скорее всего его тут же пишем, но через каждый 2 кадр из 30 фреймрейт)
  2. Декодируем пакет во фрейм
  3. Масштабируем фрейм
  4. Кодируем фрейм в пакет
  5. Отправляем пакет в сокет

Как уже до меня дошло

  • как минимум п.4 (кодирование) выполняется на всех ядрах цпу
  • п.2 (декодирование) непонятно, полагаю в один поток идет mjpeg -> raw
  • если исключить п.3 (масштабирование) с 1920х1080 -> 640x480, то фпс растет в 4 раза (получается 0.25 сек. каждый кадр, вместо 0.06 сек.)

Работа в одном потоке очевидно похожа на эстафету, когда «бежит» только один участок, поэтому очевидно надо вводить мутексы и разделять ими все участки, чтобы пока предыдущий бежит, следующий за ним этап ждет, т.е. создаем 4 потока, в котором одновременно выполняются 1 и 3, а 2 и 4,5 ждут, либо наоборот

Но насколько это поможет? ведь п.3 (масштабирование) занимает больше всего времени и получается нужно держать какой то массив входящих-исходящих фреймов (видимо по 5 пар судя по времени выполнения) и заполнять ее еще 5 потоками *безумныйсмайл*

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

 , ,

wolverin
()

FFmpeg libav какие настройки для H264???

Форум — Development

Приветствую

Продолжаю мучать перекодировку из mjpeg в libx264 с отдачей в rtsp

Имею вот такие дампы входного-выходного потоков

Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 360486.479951, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 15 fps, 15 tbr, 1000k tbn
[libx264 @ 0x14e82c0] using cpu capabilities: ARMv6 NEON
[libx264 @ 0x14e82c0] profile Main, level 2.2
[libx264 @ 0x14e82c0] 264 - core 148 r2643 5c65704 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=15 b_pyramid=2 b_adapt=0 b_bias=0 direct=1 weightb=0 open_gop=0 weightp=0 keyint=450 keyint_min=30 scenecut=0 intra_refresh=0 rc=abr mbtree=0 bitrate=500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 pb_ratio=1.30 aq=0
Output #0, rtsp, to 'rtsp://IP:554/cam':
  Stream #0:0: Video: h264, yuv420p, 640x480, q=2-31, 500 kb/s, 15 tbn

Из всего этого выхлопа для х264 мной явно задано

bframes=15
b_adapt=0
keyint=450
keyint_min=30
bitrate=500

+    av_dict_set(&pOutDic, "rtsp_transport", "udp", 0);
+    av_dict_set(&pOutDic, "preset", "ultrafast", 0);

И решил значит глянуть а что же там с размерами, почему видео тормозит (хоть и не рассыпается)

fprintf(stdout, "Packet size inp: %d out: %d bytes Frame type: %d/%d\n", pInpPkt->size, pOutPkt->size, pFrm->key_frame, pFrm->pict_type);

Packet size inp: 70736 out: 50267 bytes Frame type: 1/1
Packet size inp: 70924 out: 49739 bytes Frame type: 1/1
Packet size inp: 70896 out: 49747 bytes Frame type: 1/1
Packet size inp: 70992 out: 49694 bytes Frame type: 1/1
Packet size inp: 70948 out: 49946 bytes Frame type: 1/1
Packet size inp: 70960 out: 49851 bytes Frame type: 1/1
Packet size inp: 70992 out: 88760 bytes Frame type: 1/1
Packet size inp: 71120 out: 154355 bytes Frame type: 1/1
Packet size inp: 71160 out: 161420 bytes Frame type: 1/1
Packet size inp: 71244 out: 161778 bytes Frame type: 1/1
Packet size inp: 71216 out: 161368 bytes Frame type: 1/1
Packet size inp: 71420 out: 161916 bytes Frame type: 1/1
Packet size inp: 71308 out: 161637 bytes Frame type: 1/1
Packet size inp: 71440 out: 162195 bytes Frame type: 1/1
Packet size inp: 71564 out: 162253 bytes Frame type: 1/1
Packet size inp: 71516 out: 162041 bytes Frame type: 1/1
Packet size inp: 71712 out: 162148 bytes Frame type: 1/1
Packet size inp: 71880 out: 162662 bytes Frame type: 1/1

А как так получается, что кодированный поток х264 занимает БОЛЬШЕ места, чем мжпег??? и почему у меня каждый кадр ключевой?

Если не сложно, может еще что важно указать??? Нужно более менее качество, чтоб без квадратов, главное чтобы не тормозило видео.

 ,

wolverin
()

FFmpeg libav* time_incr

Форум — Development

Приветствую

Пытаюсь перекодировать mjpeg в h264, при попытке кодировать фрейм через avcodec_send_frame(pOutCdcCtx, pFrm) получаю ошибку

mpeg4 time_incr 12884901888 too large

time_base вроде задал

ошибка описана в исходнике mpeg4videoenc.c, как вычисление из MpegEncContext->time, но где задать это время???

во входном потоке с усб камеры как бы и нету такого значения временной метки...

 ,

wolverin
()

FFmpeg libav av_find_input_format + avformat_find_stream_info

Форум — Development

Приветствую

Вдруг кто знает

1. Так и должно быть, что avformat_open_input обнуляет параметр AVDictionary ? Если да, то как правильно тогда проинициализировать?

const AVInputFormat * pInpFmt = av_find_input_format("v4l2");
AVDictionary * pInpDic = NULL
av_dict_set(&pInpDic, "pixel_format", format, 0);
av_dict_set(&pInpDic, "video_size", size, 0);
av_dict_set(&pInpDic, "framerate", rate, 0);
avformat_open_input(&pInpFmtCtx, device, pInpFmt, &pInpDic)

2. Четко после вызова avformat_find_stream_info если попытаться сразу освободить ресурсы, то вываливается ошибка

avformat_find_stream_info(pInpFmtCtx, NULL);

if (pInpDic) av_dict_free(&pInpDic);
ЗДЕСЬ ---» if (pInpFmtCtx) avformat_close_input(&pInpFmtCtx);


video4linux2,v4l2 @ 0x14dcf10] Some buffers are still owned by the caller on close.
ioctl(VIDIOC_QBUF): Bad file descriptor

 ,

wolverin
()

iptables и маски?

Форум — Admin

Приветствую, подскажите, в чем косякнул?

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

в mangle

-A PREROUTING -p tcp -m tcp --dport 5060 -j asterisk
-A PREROUTING -p udp -m udp -m multiport --dports 4569,5060,10000:20000 -j asterisk
-A PREROUTING -i eth1 -j CONNMARK --set-xmark 0x100/0xfff
-A PREROUTING -i eth0.41 -j CONNMARK --set-xmark 0x100/0xfff
-A asterisk -s ИП.1/32 -j asterisk_nat
-A asterisk -s ИП.2/32 -j asterisk_nat
-A asterisk -s ИП.3/32 -j asterisk_nat
-A asterisk -s ИП.4/32 -j asterisk_nat
-A asterisk -s ИП.N/32 -j asterisk_nat
-A asterisk_accept -j CONNMARK --set-xmark 0x1/0xfff
-A asterisk_nat -j CONNMARK --set-xmark 0x10/0xfff
-A asterisk_nat -j asterisk_accept

в nat

-A PREROUTING -m connmark --mark 0x10/0xfe -m comment --comment VoIP -j DNAT --to-destination ИПЛОКАЛЬНЫЙ

в фильтре

-A FORWARD -m connmark --mark 0x1/0x1 -m comment --comment VoIP -j ACCEPT

 

wolverin
()

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