LINUX.ORG.RU

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

 , ,


0

1

Продолжаю вникать вопрос записи 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 (всего исправлений: 1)

Ответ на: комментарий от naKovoNapalBaran

Пападробности?

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

wolverin ★★★
() автор топика

Уточни, у тебя MJPEG — входной поток, его камера формирует?

MJPEG это всего лишь последовательность JPEG-кадров, которые можно выделить по маркерам начала и конца (FF D8, FF D9). Временные метки как отдельная сущность там вряд ли есть. Но можно распотрошить EXIF в заголовке этих JPEGов — теоретически время камера может писать туда.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

hobbit

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

да про кадры я посмотрел между FF D8 (FF FE) и FF DB теоретически я же могу комментарий внедрять и туда метку ставить, поскольку наблюдаю что этого поля вовсе нет https://habr.com/ru/post/102521/

а вот как сделать чтобы камера или скорее ффмпег сам писал временную метку конечно вопрос???

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 4)
Ответ на: комментарий от wolverin

может еще не сжатый отдавать

Совсем несжатый — это уже перебор. Для видео есть кодеки со сжатием без потерь, HUFFYUV, например. И даже они жрут довольно много.

а вот как сделать чтобы камера или скорее ффмпег сам писал временную метку

Подумай сначала, для чего она нужна. У тебя частота кадров постоянна? Если да, то в каждый кадр её пристёгивать необязательно. Мне вот как-то переменная попадалась, это была отдельная история.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

hobbit

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

в принципе я пока пришел к тому, что нужно писать метку в комментарий жпег файла через заданное число кадров (условно в этот промежуток теоретически должна влазить минута записи)

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

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

Если постоянная — возможно, в JPEG её совать и не надо, а оборачивать при записи в MKV, как посоветовали выше, и вставлять время начала и частоту в заголовок mkv. Заодно убьёшь и второго зайца — получаемые файлы уже будут готовы для воспроизведения любым приличным программным плеером.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

hobbit

я все это делаю на арм, возможно оборачивание в мкв не сильно ресурсно затратно, но следующим этапом мне нужно будет помимо поиска нужного места в архиве - отдать найденный фрагмент через rtsp, а потом еще сжимать перед отдачей в h264. Да, возможно лучше сразу сжимать в h264 перед записью - но это ресурсозатратно с хорошим тепловыделением, а просмотр архива существенно редкая операция в сравнении с записью, которая в таком варианте не потребляет ни цпу, ни рам.

я конечно предполагаю что первоначально буду использовать dd для выдергивания нужных кусков архива и тут мне бы очень пригодилось что там все уже обернуто (хотя мжпег влц хоть и ускоренно, но все таки воспроизводит), но в конечном итоге придется все равно переходить на камеры отдающие h264.

wolverin ★★★
() автор топика
Ответ на: комментарий от hobbit

получаемые файлы

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

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)

ты меня конечно извини, но если ты не знаешь структуру mjpeg потока, не знаешь, как и куда там писать метки времени и для тебя mkv сложновато, то с какой целью ты ещё и хочешь писать на диск без ФС?

Ты же не думаешь, что у тебя получится «быстрее» чем с ФС?

max_lapshin ★★★★★
()
Ответ на: комментарий от wolverin

Ты хочешь хранить mjpeg, который в 10 раз жирнее H264. За 13 лет создания и продажи видеостримингового софта, я один раз встретился с требованием на mjpeg и оно было просто написано под конкретного вендора.

Ты теряешь 90% места и пытаешься сэкономить 0,01% на отказе от отлаженной структуры ФС?

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

Ну не 0.01, а скорее 10-20% + да может и запись пошустрее + ресурс флешки наверно на те же +20%

Хотеть х264 не вредно, но куча камер уже куплено и они отдают только жпег

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

куча камер уже куплено и они отдают только жпег

Камеры, которые отдают только mjpeg перестали продаваться более 10 лет назад. Те камеры не имеют никакой ценности, им место в помойке, потому что у них за это время пришла в негодность матрица.

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

Про x264 вообще никто не говорит, это нерентабельная штука с видеонаблюдением. Речь идет об H264

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

с чего бы вдруг перестали? у меня их почти 1000 куплена заказчиком в прошлом году за копейки новыми в Китае и отдают они 2 МП

зы. разговор ниачем.

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)

Ну раз ты пошёл по пути переизобретения всего на свете, то и кодек свой сделай с контейнером, который будет хранить метки времени. Прошивку для камеры тоже переписать нужно. Там ведь используется готовая ФС, а то вдруг она неэффективно использует ресурс флешки.

ox55ff ★★★★★
()
Ответ на: комментарий от max_lapshin

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

поэтому могу сказать только то что мне сообщил «сборщик» приблуды - камеры якобы OV2710 и AR0230

судя по беглому поиску по алишке в сравнении с КАРТИНКАМИ что то вроде этого https://aliexpress.ru/item/4000129576752.html

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

это не камеры, а сенсоры. Они подключаются по шлефу типа CSI к чипсету, который уже кодирует видео.

Целиковый компьютер на плате, с линуксом, с энкодером видео, с сенсором стоит менее 15 баксов.

Найти что-то, что не может кодировать h264 практически невозможно или будет очень дорого стоить, потому что очень специфичное.

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

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

они подключены через усб и отдают либо иув, либо сжимают в мжпег, на них даже вроде как флешка есть - а говорили не бывает, все пропало 10 лет назад ))

целиковый компьютер к которому они подключены кроме ендкодить еще кучу всего должен делать, поэтому используется nanopi neo core, в котором хардварное кодирование видеопотока отдельная проблема.

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

так это не IP камеры, а смешная костыльная нелепица, на которую развели лоха заказчика, так бы сразу и сказал =)

Ты вообще представляешь себе, что такое калибровка сенсора?

Короче, стыдно должно быть. Человек деньги отдает, а ему говно впихивают и вместо простых рабочих решений за разумные деньги получает пионерство уровня «напишу свою ФС» и втыкания сенсоров вместо нужной дырки в какой-то безумный переходник с csi на usb.

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

разве я говорил что они ип? это вы выдумали как про несуществующие мжпег камеры не умеющие х264

заказчику надо было сэкономить, он сэкономил на железе, я к этому отношения не имею, мне же надо чтоб это колесо поехало.

и я не понимаю причем тут своя ФС, работаешь как с файлом с сырым диском, ничего сверх естественного, одни плюсы, вапще никаких минусов не вижу.

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

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 2)
Ответ на: комментарий от wolverin

короче, никто ни на чём не сэкономил. Получилось накроить и десятикратно потерять на сторадже и ненужной бессмысленной работе по попыткам писать на флешку напрямую без ФС.

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

max_lapshin ★★★★★
()
Ответ на: комментарий от TheAnonymous

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

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

У usb sd и подобных «флешек» есть встроенный контроллер, который распределяет запись самостоятельно.

naKovoNapalBaran
()
Последнее исправление: naKovoNapalBaran (всего исправлений: 2)
Ответ на: комментарий от naKovoNapalBaran

распределять то он распределяет, но таблица трансляции КАЖДЫЙ РАЗ зависит от контроллера, поэтому елозить один сектор ради нескольких байт нет никакого смысла заморачивая сырой записью на диск

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

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от naKovoNapalBaran

и кстати по поводу убогих контроллеров флешек, а тем более сд флешек - не зря придуманы в попытке натянуть сову на глобус такие ФС как F2FS, JFFS и тд, имеющие преимущества перед «обычными» только в узком диапазоне применения.

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 2)
Ответ на: комментарий от wolverin

ну и да - первый сектор диска всегда при первом проходе содержит начало целикового кадра, в котором в комментарии время и размер кадра, а при следующий кругах уже время, размер кадра и адрес на предыдущий пакет

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 2)
Ответ на: комментарий от wolverin

JFFS для без контроллерных флеш, с ней понятно.
F2FS если выровнены группы распределения, на ssd записывает намного быстрее подтверждаю, но экономит ли это ресурсы неизвестно.

naKovoNapalBaran
()
Последнее исправление: naKovoNapalBaran (всего исправлений: 1)