LINUX.ORG.RU

Сообщения wolverin

 

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

Приветствую

Продолжаю мучать перекодировку из 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

Приветствую

Пытаюсь перекодировать 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

Приветствую

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

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 и маски?

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

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

в 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
()

Отдать RTSP из Си библиотек FFMPEG

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

Буду благодарен подсказке направления или примеру куда двигаться.

Скачал git исходники, собрал, подключил к своему Сишному проекту библиотеки, получаю в нем кадры с usb камеры и пишу их на диск - как бы теперь не изобретая велосипед самими библиотеками организовать и слушающий сокет и запись в него SDP и RTP потока.

Просто в море информации не могу найти то что нужно для решения задачи. Вроде бы ffmpeg умеет стримить в rtsp

 ,

wolverin
()

fread/fwrite

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

Продолжаю мучать тему С++ vs прямая запись на флешку

Как я понял эти методы буферные и фактическая запись осуществляется либо по fflush, либо где то задан системный размер кеша? как его менять? а «померить» можно текущий размер буфера? например, делать ффлуш через заданный размер, а не количество циклов записи или держать кеш выравненной длины относительно размера сектора

актуально для ubuntu/debian

 ,

wolverin
()

_FILE_OFFSET_BITS вкуда?

Приветствую, опять мучения с GCC ))

Вроде уже запихал во все места этот дефайн, не указывал только при компиляции

#define _FILE_OFFSET_BITS 64

один фиг ftell вываливается на больше 2гб с

Value too large for defined data type

 

wolverin
()

GCC как прочитать и задать частоту ЦПУ?

Так чтоб без отличий по архитектуре и желательно ядер (хотя бы в пределах ветки) на ubuntu/debian

Так понимаю надо что надо в каких то файлах здесь читать-писать?

/sys/devices/system/cpu

или еще лучше governor=ondemand менять с ondemand на турбабуст

 ,

wolverin
()

C++ вызвать указатель на метод класса внутри метода класса?

Приветствую

Объявил внутри класса «переменную» как void (CJpgFrame::*Write)();

Внутри метода класса присваиваю этой «переменно» функцию как Write = &CJpgFrame::WritePckWithTime;

Понятно, что вне класса вызов

CJpgFrame jpg();
(jpg.*jpg.Write)();

но как вызвать ВНУТРИ метода самого класса? или это не поддерживается?

валится ошибка

Recoder.cpp:85:11: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘((CJpgFrame*)this)->CJpgFrame::Write (...)’, e.g. ‘(... ->* ((CJpgFrame*)this)->CJpgFrame::Write) (...)’
     Write();
           ^

Переопределять не хочется, т.к. там всего лишь ветвление в if чтобы не повторять.

 ,

wolverin
()

Как make C vs C++

Подскажите, как правильно сделать make?

Есть мейкфайл с содержимым

gcc -c RecoderFDisk.c -I./util-linux/ -Wall -pedantic -O3
gcc -c RecoderFFmpeg.c -I./FFmpeg/ -Wall -pedantic -O3
gcc -o Recoder Recoder.c RecoderFDisk.o RecoderFFmpeg.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/libswscale/libswscale.a                                            \
    ./FFmpeg/libswresample/libswresample.a                                      \
    ./FFmpeg/libavutil/libavutil.a                                              \
    -ltinfo -lpthread -lm -lx264 -lv4l2 -lpostproc -lasound -lvdpau -lX11 -Wall -pedantic -O3

все прекрасно компилится, как только просто меняю расширение Recoder.c на Recoder.cpp (векторами захотелось побаловаться в main), получаю
Recoder.cpp:(.text.startup+0x9a): undefined reference to
на то, что лежит в RecoderFDisk.o RecoderFFmpeg.o

 ,

wolverin
()

Си hex to file

Извините, жестко туплую, как покороче буфер наполнить нужными хекс символами? а то мой код ниже как то криво выглядит

еще бы в 4-5 байты записать длину time(NULL)+2байта и после само это значение

uint8_t * buf = malloc(1024 * sizeof(uint8_t));

buf[0] = strtol("FF", NULL, 16);
buf[1] = strtol("D8", NULL, 16);
buf[2] = strtol("FF", NULL, 16);
buf[3] = strtol("FE", NULL, 16);
buf[4] = strtol("00", NULL, 16);
buf[5] = strtol("04", NULL, 16);

buf[10] = '\0';

FILE * pf = fopen("./test.jpg", "wb");
fwrite(buf, 1, 11, pf);
fclose(pf);

free(buf);

 , ,

wolverin
()

MJPEG + ffmpeg + прямая запись на флешку

Продолжаю вникать вопрос записи MJPEG на флешку без файловой системы С++ vs прямая запись на флешку

Удалось прикрутить fdisk и ffmpeg, имею такую тестовую приблуду

root@NanoPi-NEO-Core:/home/pi# head -c 200 /dev/mmcblk1 | xxd
00000000: fab8 0010 8ed0 bc00 b0b8 0000 8ed8 8ec0  ................
00000010: fbbe 007c bf00 06b9 0002 f3a4 ea21 0600  ...|.........!..
00000020: 00be be07 3804 750b 83c6 1081 fefe 0775  ....8.u........u
00000030: f3eb 16b4 02b0 01bb 007c b280 8a74 018b  .........|...t..
00000040: 4c02 cd13 ea00 7c00 00eb fe00 0000 0000  L.....|.........
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000c0: 0000 0000 0000 0000                      ........
root@NanoPi-NEO-Core:/home/pi# ./Recoder /dev/mmcblk1 /dev/video0
Device: /dev/mmcblk1 Physical sector size: 512 bytes First unpartitioned space: 29.14 GiB LBA begin: 2048 end: 61120511
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 959002.771778, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 15 fps, 15 tbr, 1000k tbn
Packet 901l size 57940 bytes Total capture 52918224l bytes
root@NanoPi-NEO-Core:/home/pi# head -c 200 /dev/mmcblk1 | xxd
00000000: ffd8 ffdb 0043 0002 0202 0202 0202 0202  .....C..........
00000010: 0202 0202 0203 0604 0303 0303 0705 0504  ................
00000020: 0609 0709 0908 0708 080a 0b0e 0c0a 0a0d  ................
00000030: 0a08 080c 100c 0d0e 0f0f 100f 090b 1112  ................
00000040: 110f 120e 0f0f 0fff db00 4301 0202 0203  ..........C.....
00000050: 0303 0704 0407 0f0a 080a 0f0f 0f0f 0f0f  ................
00000060: 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f  ................
00000070: 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f  ................
00000080: 0f0f 0f0f 0f0f 0f0f 0f0f 0f0f ffc0 0011  ................
00000090: 0801 e002 8003 0121 0002 1101 0311 01ff  .......!........
000000a0: c400 1f00 0001 0501 0101 0101 0100 0000  ................
000000b0: 0000 0000 0001 0203 0405 0607 0809 0a0b  ................
000000c0: ffc4 00b5 1000 0201                      ........

В целом что то пишется, пока не понятно кратно сектору в 512 байт такая кривота пишет или нет?

    pf = fopen(dev_disk, "wb");
    if (!pf)
    {
        fprintf(stderr, "Open frame data %s failed\n", dev_disk);
        rt = -1;
        goto END;
    }

unsigned int i = 0, l = 0;
    while ((rt = av_read_frame(pFormatCtx, packet)) >= 0)
    {
        l += packet->size;
        fprintf(stdout, "Packet %ul size %d bytes Total capture %ul bytes\r", i, packet->size, l);
        fwrite(packet->data, 1, packet->size, pf);
        av_packet_unref(packet);
if (i++ > 15*60) break;
    }

Вопрос больше в другом - наблюдаю что при avformat_find_stream_info(pFormatCtx, NULL) появляется как я понимаю временная метка start: 959002.771778, как я понимаю штатно в мжпег кадре нет временной метки и она появляется только в заголовке «пакета» из ффмпег? а где бы ее надыбать теперь на сыром диске? т.е. какая структура это «пакета» от ффмпег с мжпег кадром???

т.е. вопрос в том, как продолжить запись и перечитывать временные метки для поиска???

 , ,

wolverin
()

c.h как без ошибки подключить?

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

Нужен некий функционал из fdisk (проблема не в нем), взял его с git, собрал, все работает, пытаюсь тянуть инклуды в свой проект простым

#include "./util-linux/include/c.h"

после чего получаю ошибку

In file included from Recoder.cpp:30:0:
./util-linux/include/c.h:402:3: error: #error "System with usleep() or nanosleep() required!"
 # error "System with usleep() or nanosleep() required!"
   ^~~~~
./util-linux/include/c.h: In function ‘void errmsg(char, int, char, const char*, ...)’:
./util-linux/include/c.h:222:39: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   prog_inv_sh_nm_from_file(__FILE__, 1)
                                       ^
./util-linux/include/c.h:251:26: note: in expansion of macro ‘program_invocation_short_name’
  fprintf(stderr, "%s: ", program_invocation_short_name);
                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
makefile:37: ошибка выполнения рецепта для цели «Recoder»
make: *** [Recoder] Ошибка 1

Сам c.h понимаю стандартный, но что нужно компилятору не понимаю в этом месте, подскажите???

static inline int xusleep(useconds_t usec)
{
#ifdef HAVE_NANOSLEEP
        struct timespec waittime = {
                .tv_sec   =  usec / 1000000L,
                .tv_nsec  = (usec % 1000000L) * 1000
        };
        return nanosleep(&waittime, NULL);
#elif defined(HAVE_USLEEP)
        return usleep(usec);
#else
# error "System with usleep() or nanosleep() required!"
#endif
}

 ,

wolverin
()

Падает «сеть» на ядре 4.14.111

Есть железка в хозяйстве Нанопи Нео Коре, там убунта 16.04 ЛТС, поднял на ней для теста v4l2rtspserver на усб uvc камеру, смотрю rtsp с нее в максималках mjpeg 1920х1080 на 30 кадрах в VLC

На некоторых железках на одном потоке, на других только на 3х клиентах vlc отваливается сеть с таким вот dmeg

[  260.070727] INFO: rcu_sched self-detected stall on CPU
[  260.076830]  0-...: (4190 ticks this GP) idle=70e/140000000000002/0 softirq=17072/17072 fqs=1976
[  260.079968] INFO: rcu_sched detected stalls on CPUs/tasks:
[  260.085937]
[  260.091905]  (t=4204 jiffies g=8837 c=8836 q=1672)
[  260.093825]  0-...: (4190 ticks this GP) idle=70e/140000000000002/0 softirq=17072/17072 fqs=1978
[  260.102957]
[  260.103041] NMI backtrace for cpu 0
[  260.103318] CPU: 0 PID: 29 Comm: kworker/0:1 Tainted: G         C O    4.14.111 #126
[  260.104951] (detected by 1, t=4206 jiffies, g=8837, c=8836, q=1672)
[  260.105020] Hardware name: sun8i
[  260.105412] Workqueue: events dbs_work_handler
.......................
[  260.125393] Sending NMI from CPU 1 to CPUs 0:
[  270.155454] rcu_sched kthread starved for 2000 jiffies! g8837 c8836 f0x0 RCU_GP_DOING_FQS(4) ->state=0x0 ->cpu=2
[  270.165927] rcu_sched       R  running task        0     8      2 0x00000000
[  270.166732] [<c0a2f9b8>] (__schedule) from [<c0a300d8>] (preempt_schedule_common+0x1c/0x2c)
[  270.167133] [<c0a300d8>] (preempt_schedule_common) from [<c0a30124>] (_cond_resched+0x3c/0x44)
[  270.167538] [<c0a30124>] (_cond_resched) from [<c0292824>] (rcu_gp_kthread+0x57c/0x928)
[  270.167960] [<c0292824>] (rcu_gp_kthread) from [<c025d020>] (kthread+0x128/0x158)
[  270.168347] [<c025d020>] (kthread) from [<c0222058>] (ret_from_fork+0x14/0x3c)
[  270.173442] NMI backtrace for cpu 0
[  270.173601] CPU: 0 PID: 29 Comm: kworker/0:1 Tainted: G         C O    4.14.111 #126
[  270.173668] Hardware name: sun8i
[  270.173743] Workqueue: events dbs_work_handler
[  270.173881] task: db1c0000 task.stack: db1ba000
[  270.173968] PC is at __usb_hcd_giveback_urb+0x80/0x148
[  270.174044] LR is at ehci_urb_enqueue+0xa3c/0xd98
[  270.174136] pc : [<c06d9da0>]    lr : [<c06f39d8>]    psr: 60010113
[  270.174216] sp : db1bbc60  ip : db001a80  fp : 40000000
[  270.174295] r10: c1202080  r9 : c1061520  r8 : c9ff9ce8
[  270.174390] r7 : 00000000  r6 : c9ff9c00  r5 : 60010113  r4 : d98cc000
[  270.174483] r3 : bf544f8c  r2 : 00000003  r1 : 00000000  r0 : 00000000
[  270.174582] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
[  270.174666] Control: 30c5387d  Table: 5a761240  DAC: fffffffd
[  270.174780] CPU: 0 PID: 29 Comm: kworker/0:1 Tainted: G         C O    4.14.111 #126
[  270.174845] Hardware name: sun8i
[  270.174912] Workqueue: events dbs_work_handler

предполагаю, что одно ядро не успевает отрабовать прерывания ИСХОДЯЩЕГО трафика, умозаключения сделал на основе темы Расшифровка краха

Судя по предложенным там к просмотру счетчикам, у меня занимается отправкой пакетов NET_TX только 1 ядро, как бы починить-сбалансировать???

Every 2.0s: cat /proc/softirqs               Fri Jun 10 07:52:46 2022

                    CPU0       CPU1       CPU2       CPU3
          HI:    4241341          8          0          7
       TIMER:    1051360     966099     993020     922395
      NET_TX:      40438       8454       5959       6224
      NET_RX:      36476        317        374        123
       BLOCK:          0          0          0          0
    IRQ_POLL:          0          0          0          0
     TASKLET:       1371        149         21         20
       SCHED:     736057     759687     765668     686260
     HRTIMER:          0          0          0          0
         RCU:     702873     605518     618290     591059

Every 2.0s: cat /proc/interrupts                                          Fri Jun 10 07:52:47 2022

           CPU0       CPU1       CPU2       CPU3
 16:          0          0          0          0     GICv2  25 Level     vgic
 17:          0          0          0          0     GICv2  50 Level     /soc/timer@01c20c00
 18:          0          0          0          0     GICv2  29 Level     arch_timer
 19:    4656560    6907099    7007158    7089333     GICv2  30 Level     arch_timer
 20:          0          0          0          0     GICv2  27 Level     kvm guest timer
 22:          0          0          0          0     GICv2 120 Level     1ee0000.hdmi, dw-hdmi-cec
 24:          0          0          0          0     GICv2 118 Level     1c0c000.lcd-controller
 25:          0          0          0          0     GICv2  82 Level     1c02000.dma-controller
 26:         25          0          0          0     GICv2  92 Level     sunxi-mmc
 27:      32580          0          0          0     GICv2  94 Level     sunxi-mmc
 28:          1          0          0          0     GICv2 103 Level     musb-hdrc.4.auto
 29:          0          0          0          0     GICv2 104 Level     ehci_hcd:usb1
 30:          0          0          0          0     GICv2 105 Level     ohci_hcd:usb2
 31:          0          0          0          0     GICv2 106 Level     ehci_hcd:usb3
 32:          0          0          0          0     GICv2 107 Level     ohci_hcd:usb6
 33:          0          0          0          0     GICv2 108 Level     ehci_hcd:usb4
 34:          0          0          0          0     GICv2 109 Level     ohci_hcd:usb7
 35:    4316809          0          0          0     GICv2 110 Level     ehci_hcd:usb5
 36:          0          0          0          0     GICv2 111 Level     ohci_hcd:usb8
 39:      31658          0          0          0     GICv2  63 Level     1c25000.ths
 41:      35715          0          0          0     GICv2 114 Level     eth0
 42: 1373870485          0          0          0     GICv2  97 Level     sun6i-spi
 45:        462          0          0          0     GICv2  32 Level     ttyS0
 46:       8732          0          0          0     GICv2  33 Level     ttyS1
 49:          0          0          0          0     GICv2  38 Level     mv64xxx_i2c
 50:          0          0          0          0     GICv2  39 Level     mv64xxx_i2c
 51:          0          0          0          0     GICv2  40 Level     mv64xxx_i2c
 52:          0          0          0          0     GICv2  72 Level     1f00000.rtc
106:          1          0          0          0  sunxi_pio_edge  44 Edge      usb0-id-det
129:          1          0          0          0  sunxi_pio_edge   3 Edge      k1
IPI0:          0          0          0          0  CPU wakeup interrupts
IPI1:          0          0          0          0  Timer broadcast interrupts
IPI2:    3920333   14075889   14485381   14792281  Rescheduling interrupts
IPI3:         56        280        309         68  Function call interrupts
IPI4:          0          0          0          0  CPU stop interrupts
IPI5:       4367       1341       1399       1418  IRQ work interrupts
IPI6:          0          0          0          0  completion interrupts
Err:          0

 ,

wolverin
()

RTSP через ffserver

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

Подскажите, что не так в моем конфиге?

Нужно стримануть усб камеру через rtsp рабочая команда ffmpeg выглядит так

./ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -c:v cedrus264 -r 5 -pix_fmt nv12 -f rtp rtp://127.0.0.1:554/

то что удалось наваять в ffserver.conf

RTSPPort 554

<Feed blabla.ffm>
    File /tmp/blabla.ffm
    FileMaxSize 10M
    Launch ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -c:v cedrus264 -r 5 -pix_fmt nv12
</Feed>

<Stream cam>
    Feed blabla.ffm
    Format rtp
    VideoCodec cedrus264
    VideoSize 640x480
    AVOptionVideo flags +global_header

    Noaudio
</Stream>

 ,

wolverin
()

Исправить DTS для ffmpeg vs Cedrus H264

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

Как бы включить аппаратную поддежку кодирования h264 на железке Nanopi neo core с ядром

# uname -a
Linux NanoPi-NEO-Core 4.14.111 #126 SMP Mon Feb 22 17:04:18 CST 2021 armv7l armv7l armv7l GNU/Linux

Скомпилил и установил ffmpeg с Cedrus H264 и cedar_ve.ko


# dmesg | grep cedar
[    4.982170] cedar_ve: loading out-of-tree module taints kernel.
[    4.988972] sunxi cedar version 0.1

правлю /boot/sun8i-h3-nanopi-neo-core.dts

        reserved-memory {
                #address-cells = <0x01>;
                #size-cells = <0x01>;
                ranges;

                cma@43c00000 {
                        compatible = "shared-dma-pool";
                        reusable;
                        reg = < 0x57c00000 0x6000000 >;
                        linux,cma-default;
                        phandle = < 0x84 >;
                };
        };

..................
                video-engine@01c0e000 {
                        compatible = "allwinner,sunxi-cedar-ve";
                        reg = < 0x1c0e000 0x1000 0x1c00000 0x10 0x1c20000 0x800 >;
                        memory-region = < 0x84 >;
                        syscon = < 0x15 >;
                        clocks = < 0x03 0x29 0x03 0x6c 0x03 0x61 >;
                        clock-names = "ahb", "mod", "ram";
                        resets = < 0x03 0x1a >;
                        interrupts = < 0x00 0x3a 0x04 >;
                        status = "okay";
                };

теперь имеем

# dmesg | grep CMA
[    0.000000] Reserved memory: created CMA memory pool at 0x000000004a000000, size 96 MiB

# dmesg | grep cedar
[    4.944911] cedar_ve: loading out-of-tree module taints kernel.
[    4.951697] sunxi cedar version 0.1
[    4.955629] [cedar]: install start!!!
[    4.959521] cedar_ve: cedar-ve the get irq is 55
[    4.964193] sunxi-cedar 1c0e000.video-engine: assigned reserved memory node cma@43c00000
[    4.972512] sunxi-cedar 1c0e000.video-engine: syscon failed...
[    4.998164] sunxi-cedar 1c0e000.video-engine: failed to get ahb clock

теперь правлю syscon

                syscon@1c00000 {
                        compatible = "allwinner,sun8i-h3-system-controller", "syscon";
                        reg = < 0x1c00000 0x1000 >;
                        #address-cells = < 0x01 >;
                        #size-cells = < 0x01 >;
                        ranges;

                        sram@1d00000 {
                            compatible = "mmio-sram";
                            reg = < 0x1d00000 0x80000 >;
                            #address-cells = < 0x01 >;
                            #size-cells = < 0x01 >;
                            ranges = < 0x00 0x1d00000 0x80000 >;

                            sram-section@0 {
                                compatible = "allwinner,sun8i-h3-sram-c1", "allwinner,sun4i-a10-sram-c1";
                                reg = < 0x00 0x80000 >;
                            };
                        };
                };

и все, больше железка не бутиться ((

 , , ,

wolverin
()

mount файла как?

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

mount –bind /usr/bin/qemu-arm-static /sandbox/usr/bin/

mount: mount(2) failed: Not a directory

 

wolverin
()

Как запустить Ubuntu ARMHF ???

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

Есть у меня NanoPi Neo Core, на нем крутится friendlyarm, которая представляет из себя сборку Ubuntu 16.04.7 LTS 4.14.111 с архитектурой ARMHF

Необходимо запустить все это дело под виндой для сборки-компиляции под эту архитектуру.

Попробовал два пути решения проблемы

1. Qemu, поскольку оказалось обычно используемый мной кликабельный VirtualBox просто не поддерживает ARM
- вставил флешку в сд разьем на плате, склонировался на нее через ссш с помощью dd

- переставил флешку на винду, слил с нее IMG образ с помощью win32diskimager

- поставил qemu-w64-setup-20220419.exe и оказалось что поддержки именной этой платы в кему нет, из всего существующего подошел только orangepi-pc, немного подровняв образ до 8Гб удалось запустить

"C:\Program Files\qemu\qemu-system-arm.exe" -M orangepi-pc -no-reboot -serial stdio -drive file=nanopi-neo-core.img,format=raw

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

2. Песочница
- на VirtualBox поднимаю виртуалку 4.15.0-142-generic #146~16.04.1-Ubuntu x86_64 (которая вопщим то используется мной для других целей)

- качаю в ней debootstrap

debootstrap --arch armhf xenial /sandbox/ http://ports.ubuntu.com/ubuntu-ports/
НО!!! только доходит до chroot /sandbox/

chroot: failed to run command ‘/bin/bash’: Exec format error

что вопщим то говорит, что о невозможности работать из архитектуры amd64 c armhf

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

 , , , ,

wolverin
()

С++ vs прямая запись на флешку

Поругайте или предложите более разумную идею, пожалуйста

Нужно писать (иногда одновременно читать записанное) с камеры видеоархив на USB или SD карты в формате MJPEG, для максимального сохранения ресурса и объема планирую выполнять ЦИКЛИЧЕСКУЮ запись без файловой системы напрямую в физические блоки, выделив в начале область под «журнал» из пары 32 байта временная метка + 32 байта адрес физического блока флешки.

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

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

 

wolverin
()

С++ vs RTSP proxy/server

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

Посоветуйте, пожалуйста, библиотеку какую нибудь для GCC - необходимо, чтобы обращаясь на железку, она отдавала поток с ip (еще лучше и с usb) камер.

Вообще суть идеи - аля «регистратор» с доступом через NAT (если точнее через NAT с обеих сторон) - пока удалось сделать получение адреса и порта NAT на STUN сервере и передача их через MQTT сервер - тоже хотелось бы услышать советы или просто поругайте идею )

 , ,

wolverin
()

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