Re[22]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 17.08.23 16:55
Оценка: 12 (2) +1
Здравствуйте, sergey2b, Вы писали:

C>>1. Разрешение, fps?

S>Hd 60 fps

C>>2. Что на входе?

S>4 потолка raw video в yuv420 or rgb
S>На выходе 4 mp4

C>>3. Во что кодируем — h264?

S>Да h264

C>>4. Железо какого уровня? 1G — только для его нужд?

S>12th cpu 64 g ram но под запись видео ram 1g

C>>5. ОС?

S>Linux например Ubuntu

Ну, провёл я эксперимент. 12-го поколения у меня нет, у меня 9-ое (i5). Debian 10. К своей тестовой аппликухе я новый gstreamer не цеплял, поэтому версия 1.14.4, параметры по умолчанию.
Почему-то (надо будет разобраться почему) среди доступных muxer'ов она мне mp4 не выдаёт, поэтоому на выходе matroska (mkv). На входе — raw, 720p, 60 fps, динамичная картинка.
Результаты (загрузка процессора в % total cpu load):

1. Один экземпляр: CPU на процесс — 34%, ram — 128 МБ.
2. Два экземпляра: загрузка CPU на процесс — такая же или чуть больше, ram — такая же.
3. Три экземпляра и далее: загрузка CPU на процесс начинает снижаться (при 3 процессах — 24%, при 4 процессах — 20%), общая загрузка CPU растет ступенчато. Я довёл до 12 процессов, при этом общая загрузка процессора — 95% (соответственно, загрузка на процесс ~7%), память чуть подрастает, но остаётся в пределах 256 МБ на процесс.
Почему так происходит: при увеличении числа процессов больше 2-х, снижается битрейт. Если запись осуществляется одним процессом, то битрейт — 7 МБ/с, при 12 одновременно работающих процессах битрейт — 3 МБ/с.

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

Вывод: задача может быть решена, и поскольку планируется использование CPU более нового поколения, весьма вероятно, что не придётся использовать пониженный битрейт. По памяти всё вписывается в обозначенные условия и на более старом железе.
Re[28]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 26.08.23 02:16
Оценка: 4 (2)
Здравствуйте, sergey2b, Вы писали:

S>надо принять 4 видеопотока в 4k и сделать из них один mp4 в котором совмещенны видео из каждого потока те multivew


Правильно ли я понял: результирующий файл должен содержать 4 синхронизированных видеопотока и при воспроизведении они должны отображаться синхронно ("решётка" или на отдельных экранах), так?

S>каке я понял человек которому поручили это сделать столкнулся с проблемами производительности


Охотно верю.

S>мне поручили изучить gstreamer что я конечно сделаю

S>и собрать его с поддержкой onevpl

Ну, мы на Nvidia-решения завязаны.
Для сборки используем cerbero и для lin-версии, и для win (кросскомпиляция). Как показала практика, работает вполне нормально. Относительно использования Intel'овских решений в мануале:

Enabling Hardware Codec Support

Starting with version 1.15.2, Cerbero has built-in support for building and packaging hardware codecs for Intel and Nvidia. If the appropriate variant is enabled, the plugin will either be built or Cerbero will error out if that's not possible.
Intel Hardware Codecs

For Intel, the variant to enable is intelmsdk which will build the msdk plugin.

You must set the INTELMEDIASDKROOT env var to point to your Intel Media SDK prefix, or you must have the SDK's pkgconfig prefix in PKG_CONFIG_PATH


Так что — тоже вполне решаемо.

S>я уже начал ходить по собеседованиям, если начинают пугать уволнением лучше самому уйти


Я читал твои темы в других разделах, в частности "visibility at work". Могу сказать только одно: тут как в анекдоте про раввина, еврейскую невесту и еврейского колхозника — если они хотят (решили) уволить, то, на мой взгляд, без разницы — решишь ты задачу, не решишь...
Re[18]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 16.08.23 19:33
Оценка: 2 (1) :)
Здравствуйте, Sharov, Вы писали:

S>Речь идет о (максимум) 8 rtsp потоках, которые надо в mp4 загнать. Неужели это так дорого по cpu?


Я же сказал "может понадобиться". С одной стороны тебе по rtsp h264 уже приходит, так что если ты на этой машине только записью файлов будешь заниматься, то, видимо, ресурсов хватит. А вот если на этой же машине нужно какие-то доп. операции делать, кодирование/декодирование, доп. обработка и т.д., то тогда могут быть вопросы. Ведь бывает же так, что в процессе выполнения работ требования меняются. Ведь бывает же так иногда
Re: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 08.08.23 13:29
Оценка: 21 (1)
Имею в виду "How to reuse pipeline to read different mp4 files. Few questions." и "Pipeline set state to Ready hangs pipeline.".

1. decodebin и playbin — это, грубо говоря, такие хитрые элементы, которые, фактически, служат всего лишь для того, чтобы подобрать правильные элементы для построения графа. По моему опыту с точки зрения быстродействия что filesrc + decodebin, что playbin — один хрен. Особенно если учеть, что основные затраты времени — они уже после формирования, непосредственно при воспроизведении. Если ты посмотришь результирующий граф, то увидишь, насколько он изменился.

2. Относительно переиспользования и зависания. У нас в своё время не получилось, правда, это было раннем этапе. Именно поэтому я полез в реализацию qt multimedia, и, собственно, перетащил её вариант, использующий gstreamer на винду, полагая, что qt-шникам виднее, как правильно использовать. Там на каждой изменение, например, для записи (preview -> record, record -> preview) строится новый pipeline. Сейчас сильно подозреваю, что проблема с переиспользованием в том, что при завершении воспроизведения файла приходит eos, и какие-то элементы переходит в условно "невосстановимое" состояние. Но надо, конечно, включать более детальный лог и смотреть исходники.

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

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

Надеюсь, что был полезен. Удачи!
Re[3]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 08.08.23 20:38
Оценка: 21 (1)
Здравствуйте, Sharov, Вы писали:

S>С playbin у меня вообще не пошло: пытался добавить свой appsink вместо video-sink -- вылетало окно с показом кадра,

S>пытался линковать playbin и appsink -- просто падало. Т.е. пока filesrc + decodebin+appsink без альтернативы.

Сложно так сказать почему — смотреть надо.

S>Да, я еще погоняю под Debug. У меня такой вариант использования -- нахожу нужный кадр, конвертирую в jpeg, перевожу pipe в Ready.

S>И далее по кругу, с другим файлом. Ну т.е. один pipe для чтения файлов, а не 1 к 1. Ну так вот, после pipe.SetState(Ready) -- блочится
S>на этой строке. Буду более детально смотреть, т.к. совершенное не понятно что не так. Тут пишут, что надо в Ready переводить.

У тебя там блочится на первой же итерации? И такой вопрос: а не занимает ли у тебя перевод конвертация достаточно продолжительное время? По моему опыту в большинстве случаев виснет если буфера переполнены. Я бы попробовал queue в пайплайн добавить. Сначала без ограничения размера и посмотрел бы, как размер памяти процесса себя ведёт. Ну и менял бы параметры, если используется SetState, только после того, как получено сообщение, что состояние изменено. Ты bus-овские сообщения обрабатываешь?

S>Благодарю! Кстати, я там еще один вопрос задал: зная номер n кадра из видео как быстрее его получить --

S>frame stepper (pullsample) n-1 раз, или можно как-то сделать Seek с буфферами?

Хороший вопрос. Сам не пробовал, но из общих соображений понятно, что gst_element_seek должен быть быстрее, однако ограничение есть:

GST_FORMAT_DEFAULT (1) –

the default format of the pad/element. This can be samples for raw audio, frames/fields for raw video (some, but not all, elements support this; use GST_FORMAT_TIME if you don't have a good reason to query for samples/frames)


У тебя же не raw. Можно, конечно, еще попробовать по требуемому номеру кадра и fps расчитать временную метку и уже по ней seek делать. Ну и проверить, насколько точно получается.

И такой вопрос: ты решения вопросов по времени получаемых кадров в результате нашёл (предыдущие темы)?
У нас в конечном счёте решение такое сложилось (камеры в 85-90% случаев аналоговые, без времени, для оставшихся 10-15% rtsp-случаев используется тот же механизм): используем время того компа, на котором осуществляется запись — есть буфер текущего кадра, и приходящее от камеры обновляет его, запись осуществляется с фиксированным fps (appsrc) и данные берёт из буфера текущего кадра. Таким образом отвязываясь от состояния камеры, потерь кадров и т.д. Что есть в буфере кадра на текущий момент, то и считаем актуальным для камеры. Понятно, что в случае rtsp есть задержка, но для наших задач приемлемо.
Re[14]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 11.08.23 11:06
Оценка: 15 (1)
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Sharov, Вы писали:


S>>>>И как побороть, а главное понять почему он там еще работает? Какой это может быть компонент?

C>>>Ну он же тебе в логах говорит про d3d11bufferpool2, явно намекая на d3d11. Визуализировать сформированный decodebin'ом пайплайн не хочешь? Думаю, что и прояснится многое и, если сам будешь формировать (о чём ты в следующем сообщении пишешь), поможет. И если явно будет виден пул как элемент, то тогда можно будет ему max_buffers выставить.
S>>http://files.rsdn.org/79401/graphviz.svg

S>Кажется, что такое на коленке собрал по образу и подобию, но не уверен, что все правильно и оптимально:


У тебя видеокарта на боевых машинах предполагается, и если да, то какая, NVidia? Сколько видеопотоков одновременно? Нужно смотреть загрузку CPU. Ежели всё устраивает, дык и ладно. С GPU свои заморочки есть (с ограничением экземпляров кодирования на процесс).
Decodebin у тебя d3d11h264dec выбирал, он же, вроде, hardware использует, значит, условия соответствуют. Выбор осуществляется из элементов, которые могут работать в данных условиях, элемента с максимальным рангом.

https://developer.ridgerun.com/wiki/index.php?title=GStreamer_modify_the_elements_rank

S>Не до конца понимаю, почему простой варинат filesrc ! queue ! h264parse ! appsink не сработал...


А декодировать h264 кто будет в этом пайплайне? А сейчас у тебя этим avdec занимается.

S>Методом тыка что-то заработало.


S>Смущает несколько моментов:


S>1)код saveimg имеет такую строчку

S>var neededFrame = Global.VideoConvertSample(sample, new Caps("image/jpeg"), Constants.MSECOND * 100);
S>и что-то первое время по таймауту во время отладки падало, пришлось увеличить. Сейчас откатил как выше, вроде нормально, но что это было??

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

S>2) сыпятся такие сообщения

S>0:00:11.961293800 30572 000002232259B7E0 WARN basesrc gstbasesrc.c:3693:gst_base_src_start_complete:<filesrc> pad not activated yet
S>0:00:11.963705700 30572 000002232218CF00 WARN qtdemux qtdemux.c:3245:qtdemux_parse_trex:<qtdemux> failed to find fragment defaults for stream 1

S>Что с этим делать?


Дык, видимо, не раскочегарилось ещё. У тебя readerPipe.SetState(State.Playing) GST_STATE_CHANGE_ASYNC возвращает? А в лог плюётся во время PullSample()? Не хочешь GetState'ом подождать завершения изменения состояния? Оно как часто эти сообщения выдаёт?
Re[9]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 10.08.23 15:48
Оценка: 12 (1)
Здравствуйте, Sharov, Вы писали:

S>>>Вот если Paused, то не виснет. Правда пишет после

S>>>

S>>>** WARNING **: 13:07:57.677: Changing the `location' property on filesrc when a file is open is not supported.

S>>>и по сути работает с одним файлом (самым первым), т.е. читать будет только из него.
C>>Ну вот, а теперь, дождавшись того, что он перешёл в Paused, если его в Null перевести, зависнет?

S>Тоже самое. Собственно, если автомат состояний у них так и работает -- в Null через Paused,

S>соотв. что так что так результат одинаков. Виснет на SetState(Null).
Сдаётся мне, что в paused пайплайн у тебя так и не переходит. ::gst_element_set_state(m_pipeline, GST_STATE_PAUSED) возвращает GST_STATE_CHANGE_ASYNC, в отличии от GST_STATE_NULL, установка которого GST_STATE_CHANGE_ASYNC никогда не возвращает. И, предполагаю, что если ты после установки Paused запросишь state, то у тебя и на этом вызове повиснет, потому что в шарповом свойстве на get скорее всего используется что-то вроде ::gst_element_get_state(m_pipeline, &state, &pending, GST_CLOCK_TIME_NONE).
Автомат автоматом, но ведь по логам что получается: элементы паплайна переходят в новое состояние, но пока всё не встало кто-то еще работает и в результате заканчиваются буфера. Почему, собственно, я и подумал, что если у тебя он Paused успешно перейдёт, то и в Null потом сможет перейти.
Попробовал я под виндой — то же самое, не виснет. С разными файлами по разрешению и форматам, с задержками и без.
Отличия: 1. использование в плюсовом коде (фактически, сишном), не думаю, что это принципиально; 2. версия 1.20.6 (mingw), а не 1.22, как у тебя, здесь сказать ничего не могу, т.к. не смотрел, чего они там при переходе к 1.22 понаизменяли.

S>Выше код приложил. Может что-то не так с параметрами appsink?

Можно, конечно, попробовать с appSink["sync"] = true, но боюсь, что не поможет.
Отредактировано 10.08.2023 15:51 Conductor . Предыдущая версия .
Re[20]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 17.08.23 01:35
Оценка: 9 (1)
Здравствуйте, sergey2b, Вы писали:

S>Скажите пожалуйста как вы считаете сможет gstreamer записывать 4 потока без GPU

S>И хватит ли ему например 1g ram если это mp4 по 3 часа каждый

Маловато данных:
1. Разрешение, fps?
2. Что на входе?
3. Во что кодируем — h264?
4. Железо какого уровня? 1G — только для его нужд?
5. ОС?

Лучше всего эксперимент провести, если appsrc не требуется, то можно через gst-launch-1.0.
Re[14]: Есть специалисты по gstreamer'у?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 22.09.23 00:02
Оценка: 9 (1)
Здравствуйте, sergey2b, Вы писали:

S>если не секрет а вы где то используйте gstreamer в нагруженных приложениях

Делал заказ на gstream чуваку который разрабатывал север умного видеонаблюдения. Были заказы на встройку, есть челики которые на Jetson делали шлем со встроенной камерой и даже, вроде, HUD.
S>а то я почитал статью https://developer.ridgerun.com/wiki/index.php/Embedded_GStreamer_Performance_Tuning
S>и насторожило везде пишут что стример всего на 10 проц медленней чем ffmpeg а из статьи по сылки получаеться что разработчик прикладывает усилия что записать поток всего 30fps
КМК, что-то подобное было бы и для ffmpeg. Всегда есть какой-то гемор когда дело доходит до оптимизации, особенно с памятью.
Sic luceat lux!
Re: Есть специалисты по gstreamer'у?
От: reversecode google
Дата: 14.08.23 11:10
Оценка: 7 (1)
когда плясать с гстримером надоест вашему дателю
нанимаются прогеры и делается решение под себя
либо выбирается готовое что присутсвует на рынке

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

я бы дал максимум полтора года от начала прод использования гстримера
Re[3]: Есть специалисты по gstreamer'у?
От: reversecode google
Дата: 14.08.23 12:16
Оценка: 7 (1)
пилятся исходя из бюджета
нет денег, хотим попробовать mvp — берут как вы gstreamer/ffmpeg/vlc итд

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

есть много денег
на честно порядочность кодера
может сказать что запилил свое с нуля, а внутри запихнет какое нибудь опенсорсное решение с гитхаба
либо опять же gstreamer/ffmpeg итд запихнет

либо реально запилит все с нуля

gstreamer это уровень, скрутил запустил, как то работает
да, некоторые ко умудряются занянуть его как либу/фреймворк
те же вон с хаха ру которые постоянно вак крутят
или во всяких месседжерах он как av либа интегрирован

но это уже про то как умеет продавать бизнесс
некоторым важно позицировать свой продукт как что то новое(и я такое увжаю и люблю обращать свое внимание)
а некоторым не важно что это сумер мега новый инновационные не имещий аналогов продукт построенные на основе gstreamera
а таким, пронюханого потребителя не купить, и они этого не понимают
Re[26]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 22.08.23 17:34
Оценка: 6 (1)
Здравствуйте, sergey2b, Вы писали:

S>Привет


Привет.

S>one more a question more please.


S>насколько трудно сделать на gstreamer получать несколько видеопотока и записывать полученное в один mp4, а если они с разными fps

S>интерестно понять такое принципиально возможно или нет

Не понял, что требуется. Уточни, пожалуйста. Получение от нескольких источников — понял (можно, естественно). Запись в один файл — тоже понял (тоже можно).
Вопрос, как именно компоновать требуется данные от этих источников: накладывать кадр один на другой; на одном большом кадре несколько кадров; кадр от одного, кадр от другого; как-то ещё?
И с разным fps можно: у меня, например, в процессе экспорта на видео с 25 fps накладываются субтитры в виде картинки (там не только текст — значки ещё, да и текст в произвольном положении, поэтому стандартный вариант не проходит) со значительно меньшим fps.
По большому счёту — всё можно сделать, было бы желание.
Вот "улучшить" по всем параметрам зачастую сложно. Как известно: "изображение в результате обработки можно только испортить", тем или иным образом.
Re[13]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 11.08.23 11:17
Оценка: 3 (1)
Здравствуйте, Sharov, Вы писали:

S>Мне казалось, что если необходимо гибкое настраиваемое решение, то надо руками все собирать -- линковать,

S>добавлять пробы. А launch -- коробочный пайплайн для классических сценариев. Т.е. в случае launch контроля меньше.

Ну, согласись, что decodebin, например, не очень способствует гибкости и настраиваемости решения.

Launch же просто по текстовому описанию формирует пайплайн, как напишешь — так и сформирует. А ежели ты элементам имена дашь, то потом запросто из сформированного паплайна получешь требуемый элемент по имени и делай с ним всё, что хочешь. Особенно при исследовании разных вариантов пайплайна удобно: каждый раз всё в коде переписывать — застрелиться, а с launch — текстовое описание изменил и всё.
Re[16]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 14.08.23 11:04
Оценка: 3 (1)
Здравствуйте, Sharov, Вы писали:

C>>У тебя видеокарта на боевых машинах предполагается, и если да, то какая, NVidia? Сколько видеопотоков одновременно?


S>Вообще планируется 8 потоков, 8 камер. Про gpu не знаю, но скорее всего нет.


8 HD потоков? Что-то мне подсказывает, что gpu может понадобиться.

S>>>Не до конца понимаю, почему простой варинат filesrc ! queue ! h264parse ! appsink не сработал...

C>>А декодировать h264 кто будет в этом пайплайне? А сейчас у тебя этим avdec занимается.

S>Ну вот я не очень в предметной области разбираюсь, а зачем тогда h264parse нужен? Сразу декодировать нельзя?


Ну, насколько я понимаю, парсер, грубо говоря, данные для декодера готовит, временем опять же заведует, запросы обрабатывает ("handles queries (POSITION/DURATION/SEEKING/FORMAT/CONVERT)"). Декодер что: ему сказали декодировать — он декодирует.

https://gstreamer.freedesktop.org/documentation/base/gstbaseparse.html?gi-language=c

Кроме того, декодеры для одного и того же формата могут быть разные, hard/soft. Да ты же и сам по меньшей мере с двумя уже дело имел для одного и того же видео (d3d11h264dec, avdec_h264). А есть ещё и nvh264dec, например...
Re[3]: Еще пару вопросов
От: Conductor СССР  
Дата: 16.08.23 20:19
Оценка: 3 (1)
Здравствуйте, Sharov, Вы писали:

S>1) А каков жизненный цикл буффера, от src до sink'а, это что-то типа tcp\ip, когда каждый элемент(слой) добавляет

S>к буфферу какую-то конкретную инф-ию или как? Вот например на вход h264parse идет сырое видео из src, а что на выходе --
S>какой-то новый буффер или старый с какой-то инф-ей, пригодной для следующих эл-ов, типа, avdec_h264?

Ну, так глубоко я этот вопрос не копал — ты же понимаешь, что проработкой вопроса начинаешь заниматься только тогда, когда этот вопрос жмёт. В nvh264enc плотно копался, даже результаты лучше чем у них получились (форкнулся от них лет 5 назад, а они потом серьёзно переделали многое). А вот в парсерах не копался. Вот, можешь посмотреть, чего они там делают:

https://github.com/GStreamer/gst-plugins-bad/tree/master/gst/videoparsers

S>2) Как можно хранить метаинф-ию в mp4 файле для каждого фрейма, у меня был вопрос -- https://lists.freedesktop.org/archives/gstreamer-devel/2023-July/081587.html

S>Я не нашел как это можно сделать. Т.е. когда открою файл для чтения, например в цикле PullSample, как мне извлекать эту инф-ию?
S>Ответ выше по ссылке был не очень полезен...

Ну, тут опять же, я такую задачу не решал, и чтобы ответить на этот вопрос мне копать надо. У нас в проекте большой объём доп. инфо, привязанной к видео, (значения датчиков, состояние оборудования, измерения, комментарии и т.д.) Когда принималось решение о стратегии реализации всего этого, занимался этим другой человек. Было принято решение сохранять всё это как отдельный объект и синхронизировать с видео по timeline. Для наших задач достаточно точности синхронизации в 1 сек. Так что...
Отредактировано 17.08.2023 2:24 Conductor . Предыдущая версия .
Re[2]: I have jpeg files in memory, how to transform them into mjpeg file?
От: Conductor СССР  
Дата: 27.08.23 21:59
Оценка: 3 (1)
Здравствуйте, Sharov, Вы писали:

S>I have jpeg files in memory (byte[] in terms of C#), how to transform them into mjpeg file?


На основе использования appsrc не прокатит? Что-то вроде:

appsrc name=_appsrc ! image/jpeg,framerate=25/1,width=768,height=576 ! avimux ! filesink location=mjpeg.avi
Re[4]: I have jpeg files in memory, how to transform them i
От: Conductor СССР  
Дата: 28.08.23 14:22
Оценка: 3 (1)
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Conductor, Вы писали:


C>>На основе использования appsrc не прокатит? Что-то вроде:

C>>appsrc name=_appsrc ! image/jpeg,framerate=25/1,width=768,height=576 ! avimux ! filesink location=mjpeg.avi

S>Благодарю, а можно сразу в mp4?


S>Еще вопрос: "! image/jpeg,framerate=25/1,width=768,height=576 !" -- это caps для кого эл-та, для appsrc или *mux?


Для appsrc. Точнее так: ты информируешь, что именно твой appsrc отдавать будет, чтобы muxer на это ориентировался. Ведь что в рельности отдает appsrc именно ты определяешь. Так что можно сказать, что и для *mux.
Кстати, может быть и прокатит без указания width/height, в jpeg они же внутри есть. Попробовать надо.

S>Упд: Как-то так appsrc name=_appsrc ! image/jpeg,framerate=25/1,width=768,height=576 ! mp4mux ! filesink location=mjpeg.mp4 ?


mp4mux — не поддерживает для sink image/jpeg. qtmux поддерживает, если он тебя устроит.

А ежели надо jpegs в mp4 с h264 внутри, то можно, например, так попробовать:

appsrc name=_appsrc ! image/jpeg,framerate=25/1,width=768,height=576 ! jpegdec ! x264enc ! mp4mux ! filesink location=mjpeg.mp4

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

gst-launch-1.0 videotestsrc num-buffers=500 ! video/x-raw, framerate='(fraction)'25/1 ! jpegenc ! image/jpeg,framerate=25/1,width=768,height=576 ! jpegdec ! x264enc ! mp4mux ! filesink location=mjpeg_h264.mp4
Отредактировано 28.08.2023 14:34 Conductor . Предыдущая версия .
Re[6]: I have jpeg files in memory, how to transform them i
От: Conductor СССР  
Дата: 29.08.23 09:36
Оценка: 3 (1)
Здравствуйте, Sharov, Вы писали:

S>Вот только смущает наличие таких сообщений в консоле: GStreamer-CRITICAL gst_segment_to_running_time: assertion 'segment->format == format' failed

S>Это что такое может быть?

Тут дело вот в чём: буфера gstreamer могут иметь разный формат — см. https://gstreamer.freedesktop.org/documentation/gstreamer/gstformat.html?gi-language=c#GstFormat
Для apsrc формат по умолчанию — GST_FORMAT_BYTES (2). Muxer же ожидает GST_FORMAT_TIME (3), соответственно в пайплайн нужно добавить

appsrc name=_appsrc format=3 ! ...

И понятно почему он такой формат ожидает: ему же поступают просто кадры, какой именно временной метке они соответствуют у него информации нет. Поэтому он ждёт, что метка будет прописана внутри буфера. Что он делает по умолчанию в том случае, если метки нет — это хороший вопрос (видеофайл же в конечном счёте формируется), в исходниках надо смотреть. Но корректный способ — это для буферов обозначать timestamp/duration (timestamp, насколько я понимаю, минимум). В С-шном варианте для этого есть макросы GST_BUFFER_TIMESTAMP, GST_BUFFER_DURATION и т.д.:

        GstBuffer* buffer = gst_buffer_new_and_alloc(size);
        ...
        GST_BUFFER_TIMESTAMP(buffer) = frameTimestamp;
        GST_BUFFER_DURATION(buffer) = frameDuration;


Что для этого есть в C# варианте — не знаю.

S>Протестировал и "appsrc name=_appsrc ! image/jpeg, framerate=16/1,width=768,height=576 ! jpegdec ! x264enc ! mp4mux ! filesink location=d:\\\\qqq.mp4";

S>Работает! Файл mp4 более чем в 10 раз меньше avi файла, впечатляет.

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


S>А вот тут подробнее, зачем нужна очередь и какие возможны сюрпризы?


Ну, сюрприз простой — пайплайн раком встанет (зависнет), и ничего с этим уже не сделаешь. У меня это происходило, например, потому, что скорость кодирования энкодера в определённый момент была недостаточна для объема поступающих данных (и это даже при том, что очередь перед ним была, но со значениями по умолчанию, проблема была решена увелечением значений параметров очереди max-size-buffers, max-size-bytes и max-size-time). С одной стороны, appsrc вроде как данные запрашивает (need data), когда уже всё переварено, тем не менее такая ситуация у меня встречалась с определёнными типами muxer'ов, даже при том, что у пайплана стояло sync=true. (Кстати, может пригодиться: если пайплайну с appsrc выставить sync=true, то callback need_data будет вызываться через промежутки, соответствущие продолжительности отображения кадра, т.е. для 25 fps, например, через ~40 мс).

C>>gst-launch-1.0 videotestsrc num-buffers=500 ! video/x-raw, framerate='(fraction)'25/1 ! jpegenc ! image/jpeg,framerate=25/1,width=768,height=576 ! jpegdec ! x264enc ! mp4mux ! filesink location=mjpeg_h264.mp4


S>Этот пайплайн для каких целей?


Просто для тестирования из консоли основной части предполагаемого функционала — не всё же сразу в коде писать. Чтобы не быть голословным, мне ж проверить надо было.
Re[8]: Конкатенировать два mp4
От: Conductor СССР  
Дата: 29.08.23 15:14
Оценка: 3 (1)
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте.


S>Тут встала необходимость конкатенировать два mp4 файла, смотрю на concat и сюда. Пока не получилось -- создается файл размера 2х от обоих (2 файла по 10 секунд, размер x байт каждый), но проигрывается

S>только 10 секунд 1-го файла:

S>

S>gst-launch-1.0 concat name=c ! filesink location=result.mp4 filesrc location=1.mp4 ! c. filesrc location=2.mp4 ! c.


S>Второй вариант рабочий, пока возьму его, но почему concat не до конца работает?


S>Заранее благодарю.


S>Упд:


S>Нашел работающее решение, но пока не очень понимаю, почему оно работает:


S>

S>gst-launch-1.0 concat name=c ! queue ! m.video_0 qtmux name=m ! filesink location=result.mp4 filesrc location=1.mp4 ! qtdemux ! h264parse ! c. filesrc location=2.mp4 ! qtdemux ! h264parse ! c.


S>Правда, автор решения пишет, что работает не всегда -- https://stackoverflow.com/q/68024094/241446

S>Тут еще есть обсуждение.
S>По итогу, все переходят на splitmuxsrc, хотя мне concat нравится больше.

В первом случае ("gst-launch-1.0 concat name=c ! filesink location=result.mp4 filesrc location=1.mp4 ! c. filesrc location=2.mp4 ! c.") он тебе сделал ровно то, что ты просил — объединил два файла как файлы, а не их содержимое (не потоки), и ему было абсолютно пофигу, что у них внутри. С тем же успехом можно было (вообще без gstreamer'а) выделить элементарный буфер размером в сумму размеров исходных файлов, и скопировать как есть в первую часть данные первого файла, а во вторую — второго. Эффект был бы тот же самый — воспроизведение доходит до конца данных первого файла и завершает работу.

Ведь в твоей же ссылке https://coaxion.net/blog/2014/08/concatenate-multiple-streams-gaplessly-with-gstreamer явно написано:

# Basically: $ cat file1 file2 > both
gst-launch-1.0 concat name=c ! filesink location=both filesrc location=file1 ! c. filesrc location=file2 ! c.


А во втором случае объединяется уже содержимое — ты же видишь: demux + parse + mux.
Отредактировано 29.08.2023 15:18 Conductor . Предыдущая версия .
Re[30]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 30.08.23 19:09
Оценка: 3 (1)
Здравствуйте, sergey2b, Вы писали:

S>Здравствуйте, Conductor, Вы писали:


C>>Правильно ли я понял: результирующий файл должен содержать 4 синхронизированных видеопотока и при воспроизведении они должны отображаться синхронно ("решётка" или на отдельных экранах), так?


S>да именно так


Ну, пайплайн-то накидать для этого варианта можно и не так сложно. Другой вопрос, что, на мой взгляд, будет минимум 2 проблемы:
1. Где именно окажется bottleneck и как его обойти;
2. Вопрос синхронизации: ежели можно принять концепцию "то, что сейчас имеется для записи, и является текущим", то — хорошо (повторюсь, для нас, например, такой вариант приемлем), а вот если нужно брать за базу значения времени камер (то, над чем Антон бьётся), то тут, конечно, забавы будет достаточно.

S>скажите пожалуйста а вам приходилось записывать mp4 используя gstreame одним файлом 4-5 часов подряд


4-5 — нет, у нас сложилось, что используются часовые фрагменты. Кстати, в gstreamer 1.16.1 баг был, что максимальный размер записанного файла 2 GB (если память мне не изменяет). А потом процесс как бы шёл (ошибка не выдавалась), но реальной записи не было. На эти грабли мы наступили, весело было.

S>я тоже думаю что на текущей работе меня уволят как только сделапю то что им срочно нужно


Уволить-то дело не хитрое, но, как грится, есть нюанс: а поддерживать разработанное решение (особенно на первых порах) им Пушкин будет или кто? Не, каждый, безусловно, кузнец своего НЕсчастья, но с их стороны будет абсолютным идиотизмом полностью рвать отношения. Может, кстати, имеет смысл целенаправленно усложнить им вопросы сопровождения?

S>поэтому ищу новую работу


Удачи и результативного поиска!
Re[32]: cerbero
От: Conductor СССР  
Дата: 30.08.23 21:07
Оценка: 3 (1)
Здравствуйте, sergey2b, Вы писали:

S>я пытался собрать эти контейнеры у меня не получилось

S>различные ошибки при сборки часть я исправил


S>https://github.com/maxmcd/gstreamer-docker/blob/master/1.14/cerbero/Dockerfile


S>https://github.com/restreamio/docker-gstreamer/


Ну, фиг знает, я по этой инструкции делал:

https://gstreamer.freedesktop.org/documentation/installing/building-from-source-using-cerbero.html?gi-language=c

С учётом того, что:

Linux Setup
On Linux, you will only need a distribution with python >= 3.6. Cerbero will use your package manager to install all other required packages during bootstrap.


там проблем быть не должно.

А, вспомнил нюанс: они начиная с 1.20 многое переделали (сейчас уже не помню, с репами вроде что-то), я, когда вопрос изучал, это для себя отметил, и мы, собственно, тогда и приняли решение на 1.20 перейти, потому что процесс сборки простой получился.

В https://github.com/maxmcd/gstreamer-docker/blob/master/1.14/cerbero/Dockerfile смущает меня url для скачивания (старый?):
git://anongit.freedesktop.org/gstreamer/cerbero

В доках:
https://gitlab.freedesktop.org/gstreamer/cerbero
Re[34]: cerbero
От: Conductor СССР  
Дата: 31.08.23 18:01
Оценка: 3 (1)
Здравствуйте, sergey2b, Вы писали:

S>Здравствуйте, Conductor, Вы писали:


S>у нас базовая ОС ubuntu 20.04

S>поэтому пришлось использовать последний docker-gstreamer поддерживающий ubuntu 20.04 docker-gstreamer-2020-12-30T23-16-11Z

S>может вы сталкивались с такой ошибкой


Правильно понимаю, что говорим про https://github.com/restreamio/docker-gstreamer.git , бранч 20-04?

1. Чего-то я там использования cerbero не вижу.

2. Не принципиально, но 1.20 — это бранч, я tags использую (типа 1.20.6).

3. Как видно из логов, ошибка возникает при попытке переключиться на бранч/tag в gst-plugins-base и понятно почему: нет его там. И опять же понятно почему его там нет (я же писал об этом):

GStreamer 1.20 Release Notes
Development in GitLab was switched to a single git repository containing all the modules

https://gstreamer.freedesktop.org/releases/1.20/

Ты не хочешь собственный docker-контейнер замастрячить: типа, взять за основу убунтовый требуемой версии, поставить там питон (если нет его там), а дальше нехай cerbero работает — его для того и делали. Не думаю, что это будет сложно.
Re[36]: cerbero
От: Conductor СССР  
Дата: 08.09.23 13:00
Оценка: 3 (1)
Здравствуйте, sergey2b, Вы писали:

S>привет


Привет.

S>но когда я полпытался сделать dockerfile столкнулся с такой проблеммой

S>оргинальный файл не мой но я его творчески слегка изменил

S>Dockerfile:39

S>--------------------
S> 37 | # hack: to pass "-y" argument to apt-get install launched by "cerbero bootstrap"
S> 38 | RUN sed -i 's/apt-get install/apt-get install -y/g' ./cerbero/bootstrap/linux.py
S> 39 | >>> RUN ./cerbero-uninstalled bootstrap
S> 40 | #RUN ./cerbero-uninstalled bootstrap \
S> 41 | # && ./cerbero-uninstalled build glib \
S>--------------------
S>ERROR: failed to solve: process "/bin/sh -c ./cerbero-uninstalled bootstrap" did not complete successfully: exit code: 1

S>я не смог найти как подставит N


S>164.4 Need to get 148 MB of archives.

S>164.4 After this operation, 562 MB of additional disk space will be used.
S>164.4 Do you want to continue? [Y/n] Abort.
S>164.4 Traceback (most recent call last):

1. Я не понял: почему ты пытался поставить N, почему ты не хочешь поставить Y? Как он будет работать, если не установлены требуемые ему пакеты?
2. У тебя же вот это обламывается, потому что там -y нет, почему там её нет — отдельный вопрос:

163.0 Running command 'sudo apt-get install autotools-dev ...


(Ктати, похоже, что твой оригинальный файл довольно старый, потому что, судя по содержимому ./cerbero/bootstrap/linux.py, вот это "RUN sed -i 's/apt-get install/apt-get install -y/g' ./cerbero/bootstrap/linux.py" уже не требуется.)

Ну, минимум два варианта: либо через типа APT_CONFIG сделать — https://stackoverflow.com/questions/69745803/how-to-make-apt-assume-yes-and-force-yes-for-all-installations-in-a-bash-script, либо, НЕ универсально, до запуска bootstrap'a установить требуемые пакеты.
Re[40]: cerbero
От: Conductor СССР  
Дата: 16.09.23 23:12
Оценка: 3 (1)
Здравствуйте, sergey2b, Вы писали:

S>Здравствуйте, Conductor, Вы писали:



S>>>декодер HD видео 60 fps на 12700k использует 48% GPU


C>>1 поток? 720p? Приходит h264? Декодируется для отображения? Загрузку GPU каким инструментом анализируешь, чем-нибудь типа intel-gpu-top? С общей загрузкой CPU что получилось?

C>>48% что-то до фига.

S>примеры для тестирования придумал не я


S>1) gst-launch-1.0 filesrc location=/temp/test.mp4 ! qtdemux ! h264parse ! vaapih264dec ! fakesink


S>2) gst-launch-1.0 filesrc location=/temp/test.mp4 ! qtdemux ! h264parse ! avdec_h264 ! fakesink


Ну, ёпрст... Кто тебе эти примеры в таком виде дал (если тестируется для отображения)?! Ведь здесь будет пахать с МАКСИМАЛЬНО ВОЗМОЖНОЙ скоростью (без привязки к реальному времени). Ведь для отображения тестируем, так? Я правильно понимаю?

Выставь sync=true, и оцени загрузку ещё раз:
... ! fakesink sync=true
Re[44]: cerbero
От: Conductor СССР  
Дата: 28.09.23 16:15
Оценка: 3 (1)
Здравствуйте, sergey2b, Вы писали:

S>Здравствуйте, Conductor, Вы писали:


S>добрый день скажите пожалуйста как вы считаете насколько ревльно сделать на gstreamer — multivew

S>когда видео с 4 разных камер отображаються на одном мониторе и сохраняеться в mp4

Ну, можно. И по-разному можно сделать. Я ж не знаю, какая там архитектура софта — что до gstreamer'а идет (appsrc или v4l2src или ещё что), что после. Так что решение будет зависеть от конкретной постановки задачи.
Re: Есть специалисты по gstreamer'у?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 17.07.23 09:50
Оценка: +1
Здравствуйте, Sharov, Вы писали:

S>Заранее благодарю.


Про pts уже написали, но это не с каждой камеры есть и не всегда означает именно таймстемп.
Если у тебя rtsp камера, то в каждом пакете с кадром есть ntp таймстемп. В зависимости от условий, для сетевых камер такая штука может быть намного лучше и полезнее, чем pts. Например, для синхронизации видео с нескольких разных камер. Или для установления времени какого-нибудь события.
Как получить тайкой таймстемп? Ручками при разборе протокола. Например, он есть в ffmpeg, но оно дальше никуда не идёт и остаётся внутри ffmpeg.
Вот тут есть патч для ffmpeg, который ntp таймстемп не теряет, а прикрепляет к AVPacket'у. Такого в стандартном ffmpeg нет и не будет. Как можно такое получить от gstreamer — хз, надо искать, но сомневаюсь, что есть.
Re[5]: Есть специалисты по gstreamer'у?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 17.07.23 11:08
Оценка: +1
Здравствуйте, Sharov, Вы писали:

S>Посмотрю, но это для сервера. Я же выступаю клиентом.


Кажется, в в gstreamer можно назначать callback в любое место пайплайна. Что-то похожее
Re[8]: Есть специалисты по gstreamer'у?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 04.09.23 20:09
Оценка: +1
Здравствуйте, reversecode, Вы писали:

R>и с точки зрения маркетинга "более привлекательнее"

Специализированные решения буду ещё и более оптимальны и быстрее, но это уже заточка под архитектуру.
R>чем то как я упомянул в посте на который вы ответили
Я пытаюсь понять в чём профит взять условный NVIDIA SDK, своять на нём и получить что-то что работает только на NVIDIA, но не на АМД и интел. С другой стороны, берётся ffmpeg и почти не меняя кода у нас есть поддержка nvidia, amd, mali, intel через тот же vaapi там, куда ffmpeg портирован, а портирован он много куда.
R>кто может делает
R>кто не может берет готовое
Но можно пересобрать ffmpeg без того что не нужно и он будет компактнее.
Sic luceat lux!
Есть специалисты по gstreamer'у?
От: Sharov Россия  
Дата: 17.07.23 08:26
Оценка:
Здравствуйте.

Есть специалисты по gstreamer'у на форуме? Есть поток от ip камеры, допустим хочу нарезать
на mp4 чанки длиной по 10сек. Пайплайн сделал, несложно, но необходимо получать для каждого фрейма
capture time, т.е. timestamp камеры. Ну или для каждого чанка timestamp главного кадра.
Как это можно сделать?

Заранее благодарю.
Кодом людям нужно помогать!
gstreamer
Re: Есть специалисты по gstreamer'у?
От: DiPaolo Россия  
Дата: 17.07.23 09:36
Оценка:
Начать с функции GST_BUFFER_DTS_OR_PTS (https://gstreamer.freedesktop.org/documentation/gstreamer/gstbuffer.html?gi-language=c#GST_BUFFER_DTS_OR_PTS).

Если не получится, то хорошо бы знать, какой сорец используется (какой gst элемент).
Патриот здравого смысла
Re[2]: Есть специалисты по gstreamer'у?
От: Sharov Россия  
Дата: 17.07.23 10:16
Оценка:
Здравствуйте, DiPaolo, Вы писали:

DP>Начать с функции GST_BUFFER_DTS_OR_PTS (https://gstreamer.freedesktop.org/documentation/gstreamer/gstbuffer.html?gi-language=c#GST_BUFFER_DTS_OR_PTS).

DP>Если не получится, то хорошо бы знать, какой сорец используется (какой gst элемент).

Именно camera capture time, т.е. физ. время камеры (ну или соотв. машины).
https://gstreamer.freedesktop.org/documentation/gstreamer/gstbuffer.html?gi-language=c#GstReferenceTimestampMeta
Проблема в том, что в appsink, когда я обрабатываю new-sample событие и вызываю соотв. ф-ию на буффере,
возвращается null. Это инф-ия на уровне протокола rtsp (rtp) и ее надо как-то добавить в соотв. медиа
буфферы. Но как?
Кодом людям нужно помогать!
Re[2]: Есть специалисты по gstreamer'у?
От: Sharov Россия  
Дата: 17.07.23 10:17
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Здравствуйте, Sharov, Вы писали:


S>>Заранее благодарю.


N>Про pts уже написали, но это не с каждой камеры есть и не всегда означает именно таймстемп.

N>Если у тебя rtsp камера, то в каждом пакете с кадром есть ntp таймстемп. В зависимости от условий, для сетевых камер такая штука может быть намного лучше и полезнее, чем pts. Например, для синхронизации видео с нескольких разных камер. Или для установления времени какого-нибудь события.

Да, выше написал про физ. время камеры. Но мне для gstreamer'а нужно.
Кодом людям нужно помогать!
Re[3]: Есть специалисты по gstreamer'у?
От: DiPaolo Россия  
Дата: 17.07.23 10:28
Оценка:
Вот пример для RTSP https://github.com/pexip/gst-rtsp-server/blob/master/examples/test-mp4.c

Можно попробовать дернуть у RTSPMedia проперти clock — https://gstreamer.freedesktop.org/documentation/gst-rtsp-server/rtsp-media.html?gi-language=c#GstRTSPMedia:clock

И вот еще Гугл подсказывает https://stackoverflow.com/questions/73010596/how-to-get-camera-timestamp-for-received-frame. Лучше даже отсюда начать.
Патриот здравого смысла
Re[4]: Есть специалисты по gstreamer'у?
От: Sharov Россия  
Дата: 17.07.23 11:01
Оценка:
Здравствуйте, DiPaolo, Вы писали:

DP>Вот пример для RTSP https://github.com/pexip/gst-rtsp-server/blob/master/examples/test-mp4.c

DP>Можно попробовать дернуть у RTSPMedia проперти clock — https://gstreamer.freedesktop.org/documentation/gst-rtsp-server/rtsp-media.html?gi-language=c#GstRTSPMedia:clock

Посмотрю, но это для сервера. Я же выступаю клиентом.

DP>И вот еще Гугл подсказывает https://stackoverflow.com/questions/73010596/how-to-get-camera-timestamp-for-received-frame. Лучше даже отсюда начать.


Видел. Вот у меня пайплайн rtspsrc ! rtph264depay ! h264parse ! splitmuxsink .
При этом я использую свой sink, а не filesink (splitmuxsink["sink"] = appSink)
Вот код appsink'а:
  private static void AppSink_NewSample(object o, NewSampleArgs args)
    {
       
        if (o is AppSink aps)
        {
            var sample = aps.PullSample();
            var buf = sample.Buffer;
            buf.Map(out var info, MapFlags.Read);
     
            //application/x-rtp
            var tsMeta = buf.GetReferenceTimestampMeta();
            //NOTE tsMeta shouldn't be null there...

            buf.Unmap(info);
        }

        Counter++;
    }


И вот tsMeta возвращает пустую структуру, timestamp 0. И что надо добавить, чтобы там эта инф-ия была
Кодом людям нужно помогать!
Re[6]: Есть специалисты по gstreamer'у?
От: Sharov Россия  
Дата: 17.07.23 11:13
Оценка:
Здравствуйте, Nuzhny, Вы писали:


S>>Посмотрю, но это для сервера. Я же выступаю клиентом.

N>Кажется, в в gstreamer можно назначать callback в любое место пайплайна. Что-то похожее

Ага, probe называется -- https://gstreamer.freedesktop.org/documentation/additional/design/probes.html?gi-language=c
Вопрос только как и куда его воткнуть? Есть еще caps, но что это такое я пока не очень понял.
Кодом людям нужно помогать!
Re: Есть специалисты по gstreamer'у?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 20.07.23 09:10
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Как это можно сделать?

splitmuxsink смотри.
Sic luceat lux!
Re[2]: Есть специалисты по gstreamer'у?
От: Sharov Россия  
Дата: 20.07.23 15:09
Оценка:
Здравствуйте, Kernan, Вы писали:

S>>Как это можно сделать?

K>splitmuxsink смотри.

Само собой, выше же написал. Собственно, кажется что необходимое мне решение описано тут -- https://stackoverflow.com/a/75799182/241446
Кодом людям нужно помогать!
Re[2]: Относительно твоих вопросов в рассылке gstreamer'а
От: Sharov Россия  
Дата: 08.08.23 16:44
Оценка:
Здравствуйте, Conductor, Вы писали:

C>Имею в виду "How to reuse pipeline to read different mp4 files. Few questions." и "Pipeline set state to Ready hangs pipeline.".


О, круто благодарю.

C>1. decodebin и playbin — это, грубо говоря, такие хитрые элементы, которые, фактически, служат всего лишь для того, чтобы подобрать правильные элементы для построения графа. По моему опыту с точки зрения быстродействия что filesrc + decodebin, что playbin — один хрен. Особенно если учеть, что основные затраты времени — они уже после формирования, непосредственно при воспроизведении. Если ты посмотришь результирующий граф, то увидишь, насколько он изменился.


С playbin у меня вообще не пошло: пытался добавить свой appsink вместо video-sink -- вылетало окно с показом кадра,
пытался линковать playbin и appsink -- просто падало. Т.е. пока filesrc + decodebin+appsink без альтернативы.

C>2. Относительно переиспользования и зависания. У нас в своё время не получилось, правда, это было раннем этапе. Именно поэтому я полез в реализацию qt multimedia, и, собственно, перетащил её вариант, использующий gstreamer на винду, полагая, что qt-шникам виднее, как правильно использовать. Там на каждой изменение, например, для записи (preview -> record, record -> preview) строится новый pipeline. Сейчас сильно подозреваю, что проблема с переиспользованием в том, что при завершении воспроизведения файла приходит eos, и какие-то элементы переходит в условно "невосстановимое" состояние. Но надо, конечно, включать более детальный лог и смотреть исходники.


Да, я еще погоняю под Debug. У меня такой вариант использования -- нахожу нужный кадр, конвертирую в jpeg, перевожу pipe в Ready.
И далее по кругу, с другим файлом. Ну т.е. один pipe для чтения файлов, а не 1 к 1. Ну так вот, после pipe.SetState(Ready) -- блочится
на этой строке. Буду более детально смотреть, т.к. совершенное не понятно что не так. Тут пишут, что надо в Ready переводить.

C>3. Ну и дополнительно. Не знаю, как сделано для шарпа, но внутри там всё в основном асинхронное, т.е., если ты высталяешь некое состояние пайплайну, то это не зачит, что оно на том же стеке будет выставлено. Не учёт этого зачастую приводит к проблемам.


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

C>Ну и последнее: не ожидай, что тебе в рассылке на каждый вопрос ответят. Как показывает практика, там точно отвечают либо на критичный, либо на интересный для отвечающего вопрос.


Ну вот в июле отвечали более-менее, с августа вообще тишина -- период отпусков, видимо.

C>Надеюсь, что был полезен. Удачи!


Благодарю! Кстати, я там еще один вопрос задал: зная номер n кадра из видео как быстрее его получить --
frame stepper (pullsample) n-1 раз, или можно как-то сделать Seek с буфферами?
Кодом людям нужно помогать!
Re[4]: Относительно твоих вопросов в рассылке gstreamer'а
От: Sharov Россия  
Дата: 09.08.23 10:12
Оценка:
Здравствуйте, Conductor, Вы писали:


S>>Да, я еще погоняю под Debug. У меня такой вариант использования -- нахожу нужный кадр, конвертирую в jpeg, перевожу pipe в Ready.

S>>И далее по кругу, с другим файлом. Ну т.е. один pipe для чтения файлов, а не 1 к 1. Ну так вот, после pipe.SetState(Ready) -- блочится
S>>на этой строке. Буду более детально смотреть, т.к. совершенное не понятно что не так. Тут пишут, что надо в Ready переводить.
C>У тебя там блочится на первой же итерации?

Да.

C>И такой вопрос: а не занимает ли у тебя перевод конвертация достаточно продолжительное время?


Я вообще убрал конвертацию и просто n раз делаю pullsample в цикле (3 кадра читаю и иду дальше).

C>По моему опыту в большинстве случаев виснет если буфера переполнены. Я бы попробовал queue в пайплайн добавить. Сначала без ограничения размера и посмотрел бы, как размер памяти процесса себя ведёт.


Вот тут я добавил больше деталей и debug сообщения -- https://lists.freedesktop.org/archives/gstreamer-devel//2023-August/081632.html

C>Ну и менял бы параметры, если используется SetState, только после того, как получено сообщение, что состояние изменено. Ты bus-овские сообщения обрабатываешь?


В данном случае нет.

S>>Благодарю! Кстати, я там еще один вопрос задал: зная номер n кадра из видео как быстрее его получить --

S>>frame stepper (pullsample) n-1 раз, или можно как-то сделать Seek с буфферами?
C>Хороший вопрос. Сам не пробовал, но из общих соображений понятно, что gst_element_seek должен быть быстрее, однако ограничение есть:
C>

C> GST_FORMAT_DEFAULT (1) –
C>the default format of the pad/element. This can be samples for raw audio, frames/fields for raw video (some, but not all, elements support this; use GST_FORMAT_TIME if you don't have a good reason to query for samples/frames)

C>У тебя же не raw. Можно, конечно, еще попробовать по требуемому номеру кадра и fps расчитать временную метку и уже по ней seek делать. Ну и проверить, насколько точно получается.

mp4 файл. Наверное не raw. Хороший вариант с fps и временной меткой, попробую.

C>И такой вопрос: ты решения вопросов по времени получаемых кадров в результате нашёл (предыдущие темы)?


Пока как-то так:
 foreach (Pad pad in splitmuxsink.Pads)
            {
                if (pad.Direction == PadDirection.Sink)
                {
                    pad.AddProbe(
                        PadProbeType.Buffer,
                        (_, probeInfo) =>
                        {
                            var buf = probeInfo.Buffer;
                    var metaTs = buf.GetReferenceTimestampMeta();
                var metaTs = buf.GetReferenceTimestampMeta();
                if (metaTs.Timestamp > 0)
                    {
                     //есть точное время кадра, берем его
                }
                else
                {
                    //чего-то тут придумываем
                }
                        return PadProbeReturn.Ok;
                            });
                }
            }


Тут нашел детальное описание вопроса.

C>У нас в конечном счёте решение такое сложилось (камеры в 85-90% случаев аналоговые, без времени, для оставшихся 10-15% rtsp-случаев используется тот же механизм): используем время того компа, на котором осуществляется запись — есть буфер текущего кадра, и приходящее от камеры обновляет его, запись осуществляется с фиксированным fps (appsrc) и данные берёт из буфера текущего кадра. Таким образом отвязываясь от состояния камеры, потерь кадров и т.д. Что есть в буфере кадра на текущий момент, то и считаем актуальным для камеры. Понятно, что в случае rtsp есть задержка, но для наших задач приемлемо.


У меня для задачи критично иметь время камеры. Соотв. для случаев когда его нет, надо что-то придумывать.

Кстати, код выше (AddProbe) он вообще корректен для получения времени кадра, т.е. я могу рассчитывать на то, что в probeInfo.Buffer находится прям целый
кадр, а не какой-то чанк или вообще какие-нибудь странные данные? Пока кажется, что в буффере действительно находится фрейм.
Кодом людям нужно помогать!
Re[5]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 09.08.23 23:34
Оценка:
Здравствуйте, Sharov, Вы писали:

C>>По моему опыту в большинстве случаев виснет если буфера переполнены. Я бы попробовал queue в пайплайн добавить. Сначала без ограничения размера и посмотрел бы, как размер памяти процесса себя ведёт.


S>Вот тут я добавил больше деталей и debug сообщения -- https://lists.freedesktop.org/archives/gstreamer-devel//2023-August/081632.html


Ну вот, в пуле буфера кончились. Конкретно здесь с queue промашка вышла — я забыл, что у appsink есть своя собственная очередь с неограниченным размером по умолчанию, так что здесь дополнительная очередь проблемы не решает. А скажи, пожалуйста, если в том месте, где у тебя SetState(State.Null), вместо Null Paused выставить (у тебя же всё равно зависание на первой итерации происходит), тоже виснуть будет? Я повторил твой пример (под lin, надо будет под win попробовать, потому как по логам явная отсылка к d3d11, ты, кстати, с какой версией gstreamer работаешь?), но зависания не добился. Ежели в любом случае виснуть будет, то, на мой взгляд, следуюший шаг — это после того как все элементы в пайплайн добавятся, найти этот bufferpool и выставить ему max_buffers в 0.

S>Кстати, код выше (AddProbe) он вообще корректен для получения времени кадра, т.е. я могу рассчитывать на то, что в probeInfo.Buffer находится прям целый

S>кадр, а не какой-то чанк или вообще какие-нибудь странные данные? Пока кажется, что в буффере действительно находится фрейм.

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

"This element wraps a muxer and a sink, and starts a new file when the mux contents are about to cross a threshold of maximum size of maximum time, splitting at video keyframe boundaries."
Re[6]: Относительно твоих вопросов в рассылке gstreamer'а
От: Sharov Россия  
Дата: 10.08.23 10:17
Оценка:
Здравствуйте, Conductor, Вы писали:


S>>Вот тут я добавил больше деталей и debug сообщения -- https://lists.freedesktop.org/archives/gstreamer-devel//2023-August/081632.html

C>Ну вот, в пуле буфера кончились. Конкретно здесь с queue промашка вышла — я забыл, что у appsink есть своя собственная очередь с неограниченным размером по умолчанию, так что здесь дополнительная очередь проблемы не решает. А скажи, пожалуйста, если в том месте, где у тебя SetState(State.Null), вместо Null Paused выставить (у тебя же всё равно зависание на первой итерации происходит), тоже виснуть будет? Я повторил твой пример (под lin, надо будет под win попробовать, потому как по логам явная отсылка к d3d11, ты, кстати, с какой версией gstreamer работаешь?), но зависания не добился. Ежели в любом случае виснуть будет, то, на мой взгляд, следуюший шаг — это после того как все элементы в пайплайн добавятся, найти этот bufferpool и выставить ему max_buffers в 0.

Вот если Paused, то не виснет. Правда пишет после

** WARNING **: 13:07:57.677: Changing the `location' property on filesrc when a file is open is not supported.

и по сути работает с одним файлом (самым первым), т.е. читать будет только из него.

Версия самая последняя (1.22 что ли).

S>>Кстати, код выше (AddProbe) он вообще корректен для получения времени кадра, т.е. я могу рассчитывать на то, что в probeInfo.Buffer находится прям целый

S>>кадр, а не какой-то чанк или вообще какие-нибудь странные данные? Пока кажется, что в буффере действительно находится фрейм.
C>Врать не буду — не знаю, могу ориентироваться только на описание splitmuxsink. Вообще-то, ты же ему на вход вроде уже закодированный поток передаёшь, или я чего-то не понимаю.

pipe в этом случае такой (это не то, о чем речь выше -- там я читаю mp4 файл):
rtspsrc ! rtph264depay ! h264parse ! splitmuxsink

Получается, что да, закодированный.
Кодом людям нужно помогать!
Отредактировано 10.08.2023 10:18 Sharov . Предыдущая версия .
Re[6]: Относительно твоих вопросов в рассылке gstreamer'а
От: Sharov Россия  
Дата: 10.08.23 10:38
Оценка:
Здравствуйте, Conductor, Вы писали:

C> Я повторил твой пример (под lin, надо будет под win попробовать, потому как по логам явная отсылка к d3d11, ты, кстати, с какой версией gstreamer работаешь?), но зависания не добился. Ежели в любом случае виснуть будет, то, на мой взгляд, следуюший шаг — это после того как все элементы в пайплайн добавятся, найти этот bufferpool и выставить ему max_buffers в 0.


Код целиком:

        public static Pipeline BuildVideoReaderPipeline()
        {
            // Build video reader pipeline

            var fileSrc = ElementFactory.Make("filesrc", "filesrc");

            if (fileSrc == null)
            {
                throw new ArgumentNullException(nameof(fileSrc));
            }


            var decodebin = ElementFactory.Make("decodebin", "decodebin");
            if (decodebin == null)
            {
                throw new ArgumentNullException(nameof(decodebin));
            }

            
            var appSink = new AppSink("my_appsink");
            //appSink.NewSample += AppSink_NewSample;
            appSink.EmitSignals = true;
            appSink["sync"] = false;

            decodebin.PadAdded += (o, args) =>
            {
                var appsinkPad = appSink.GetStaticPad("sink");

                if (appsinkPad.IsLinked)
                {
                    return;
                }

                var caps = args.NewPad.QueryCaps();
                if (caps == null)
                    return;

                args.NewPad.Link(appsinkPad);
            };

            fileSrc.PadAdded += (o, args) =>
            {
                var decPad = decodebin.GetStaticPad("sink");

                if (decPad.IsLinked)
                {
                    return;
                }

                var caps = args.NewPad.QueryCaps();
                if (caps == null)
                    return;
                args.NewPad.Link(decPad);
            };


            var pipeline = new Pipeline("video reader pipe");
            pipeline.Add(fileSrc, decodebin, appSink);


            var linkResult = Element.Link(fileSrc, decodebin);
            linkResult = Element.Link(decodebin, appSink);

            return pipeline;
        }

        public static void SearchFrameByNumber(Pipeline readerPipe, IEnumerable<string> videoFiles, int frameNumber)
        {
            if (readerPipe == null) throw new ArgumentNullException(nameof(readerPipe));


            var fileSrc = readerPipe.GetByName("filesrc");


            var appSink = (AppSink) readerPipe.GetByName("my_appsink");
            readerPipe.SetName("frame_stepper");
            var decodebin = readerPipe.GetByName("decodebin");


            foreach (var videoFile in videoFiles)
            {
                fileSrc["location"] = videoFile;

                readerPipe.SetState(State.Playing);


                var step = 1; //fn тоже с 1 начинается
                while (step < frameNumber)
                {
                    appSink.PullSample();
                    step++;
                }

               
                Debug.SetDefaultThreshold(DebugLevel.Debug);

                readerPipe.SetState(State.Null); //<-- тут виснет
                
        fileSrc.Unlink(decodebin);

                fileSrc.Link(decodebin);
            }
        }
Кодом людям нужно помогать!
Re[7]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 10.08.23 11:02
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Вот если Paused, то не виснет. Правда пишет после

S>

S>** WARNING **: 13:07:57.677: Changing the `location' property on filesrc when a file is open is not supported.

S>и по сути работает с одним файлом (самым первым), т.е. читать будет только из него.

Ну вот, а теперь, дождавшись того, что он перешёл в Paused, если его в Null перевести, зависнет?
Re[8]: Относительно твоих вопросов в рассылке gstreamer'а
От: Sharov Россия  
Дата: 10.08.23 11:36
Оценка:
Здравствуйте, Conductor, Вы писали:

C>Здравствуйте, Sharov, Вы писали:


S>>Вот если Paused, то не виснет. Правда пишет после

S>>

S>>** WARNING **: 13:07:57.677: Changing the `location' property on filesrc when a file is open is not supported.

S>>и по сути работает с одним файлом (самым первым), т.е. читать будет только из него.
C>Ну вот, а теперь, дождавшись того, что он перешёл в Paused, если его в Null перевести, зависнет?

Тоже самое. Собственно, если автомат состояний у них так и работает -- в Null через Paused,
соотв. что так что так результат одинаков. Виснет на SetState(Null). Выше код приложил. Может что-то не так
с параметрами appsink?
Кодом людям нужно помогать!
Re[10]: Относительно твоих вопросов в рассылке gstreamer'а
От: Sharov Россия  
Дата: 10.08.23 19:59
Оценка:
Здравствуйте, Conductor, Вы писали:

C>Здравствуйте, Sharov, Вы писали:


S>>>>Вот если Paused, то не виснет. Правда пишет после

S>>>>

S>>>>** WARNING **: 13:07:57.677: Changing the `location' property on filesrc when a file is open is not supported.

S>>>>и по сути работает с одним файлом (самым первым), т.е. читать будет только из него.
C>>>Ну вот, а теперь, дождавшись того, что он перешёл в Paused, если его в Null перевести, зависнет?

S>>Тоже самое. Собственно, если автомат состояний у них так и работает -- в Null через Paused,

S>>соотв. что так что так результат одинаков. Виснет на SetState(Null).
C>Сдаётся мне, что в paused пайплайн у тебя так и не переходит. ::gst_element_set_state(m_pipeline, GST_STATE_PAUSED) возвращает GST_STATE_CHANGE_ASYNC, в отличии от GST_STATE_NULL, установка которого GST_STATE_CHANGE_ASYNC никогда не возвращает. И, предполагаю, что если ты после установки Paused запросишь state, то у тебя и на этом вызове повиснет, потому что в шарповом свойстве на get скорее всего используется что-то вроде ::gst_element_get_state(m_pipeline, &state, &pending, GST_CLOCK_TIME_NONE).
C>Автомат автоматом, но ведь по логам что получается: элементы паплайна переходят в новое состояние, но пока всё не встало кто-то еще работает и в результате заканчиваются буфера. Почему, собственно, я и подумал, что если у тебя он Paused успешно перейдёт, то и в Null потом сможет перейти.

И как побороть, а главное понять почему он там еще работает? Какой это может быть компонент?

Кстати, попробовал :

fileSrc.Unlink(decodebin);
var temp = readerPipe.SetState(State.Paused);
readerPipe.GetState(out State state, out State pending, Gst.Constants.MSECOND * 1000);
readerPipe.SetState(State.Null);
fileSrc.Link(decodebin);

Работает через раз, т.е. один файл проходит, а на втором стоп, и работает нестабильно, может и на первом файле
зависнуть.

C>Попробовал я под виндой — то же самое, не виснет. С разными файлами по разрешению и форматам, с задержками и без.

C>Отличия: 1. использование в плюсовом коде (фактически, сишном), не думаю, что это принципиально; 2. версия 1.20.6 (mingw), а не 1.22, как у тебя, здесь сказать ничего не могу, т.к. не смотрел, чего они там при переходе к 1.22 понаизменяли.

Попробую на этой версии.
Кодом людям нужно помогать!
Re[10]: Относительно твоих вопросов в рассылке gstreamer'а
От: Sharov Россия  
Дата: 10.08.23 20:08
Оценка:
Здравствуйте, Conductor, Вы писали:

Подумалось -- а может не использовать decodebin, может попробовать руками собрать все соотв. компоненты, которые он
использует?
Кодом людям нужно помогать!
Re[11]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 10.08.23 20:18
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Conductor, Вы писали:


S>Подумалось -- а может не использовать decodebin, может попробовать руками собрать все соотв. компоненты, которые он

S>использует?

Это, само-собой, неплохой вариант, особенно если у тебя все файлы однотипные.
Re[11]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 10.08.23 20:27
Оценка:
Здравствуйте, Sharov, Вы писали:

S>И как побороть, а главное понять почему он там еще работает? Какой это может быть компонент?


Ну он же тебе в логах говорит про d3d11bufferpool2, явно намекая на d3d11. Визуализировать сформированный decodebin'ом пайплайн не хочешь? Думаю, что и прояснится многое и, если сам будешь формировать (о чём ты в следующем сообщении пишешь), поможет. И если явно будет виден пул как элемент, то тогда можно будет ему max_buffers выставить.

S>Кстати, попробовал :


S> fileSrc.Unlink(decodebin);

S> var temp = readerPipe.SetState(State.Paused);
S> readerPipe.GetState(out State state, out State pending, Gst.Constants.MSECOND * 1000);
S> readerPipe.SetState(State.Null);
S> fileSrc.Link(decodebin);

S>Работает через раз, т.е. один файл проходит, а на втором стоп, и работает нестабильно, может и на первом файле

S>зависнуть.

И оно у тебя в логах не вопит, что отцепляешь элемент у работающего (playing) пайплайна?
Re[11]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 10.08.23 21:08
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Подумалось -- а может не использовать decodebin, может попробовать руками собрать все соотв. компоненты, которые он

S>использует?

Кстати, ты Gst.Parse.Launch по принципиальным соображениям не используешь или просто руки до него не дошли?
Re[12]: Относительно твоих вопросов в рассылке gstreamer'а
От: Sharov Россия  
Дата: 10.08.23 21:27
Оценка:
Здравствуйте, Conductor, Вы писали:

S>>Подумалось -- а может не использовать decodebin, может попробовать руками собрать все соотв. компоненты, которые он

S>>использует?
C>Кстати, ты Gst.Parse.Launch по принципиальным соображениям не используешь или просто руки до него не дошли?

Мне казалось, что если необходимо гибкое настраиваемое решение, то надо руками все собирать -- линковать,
добавлять пробы. А launch -- коробочный пайплайн для классических сценариев. Т.е. в случае launch контроля меньше.
Кодом людям нужно помогать!
Re[12]: Относительно твоих вопросов в рассылке gstreamer'а
От: Sharov Россия  
Дата: 10.08.23 22:09
Оценка:
Здравствуйте, Conductor, Вы писали:

S>>И как побороть, а главное понять почему он там еще работает? Какой это может быть компонент?

C>Ну он же тебе в логах говорит про d3d11bufferpool2, явно намекая на d3d11. Визуализировать сформированный decodebin'ом пайплайн не хочешь? Думаю, что и прояснится многое и, если сам будешь формировать (о чём ты в следующем сообщении пишешь), поможет. И если явно будет виден пул как элемент, то тогда можно будет ему max_buffers выставить.

http://files.rsdn.org/79401/graphviz.svg
Кодом людям нужно помогать!
Re[13]: Относительно твоих вопросов в рассылке gstreamer'а
От: Sharov Россия  
Дата: 11.08.23 10:07
Оценка:
Здравствуйте, Sharov, Вы писали:

S>>>И как побороть, а главное понять почему он там еще работает? Какой это может быть компонент?

C>>Ну он же тебе в логах говорит про d3d11bufferpool2, явно намекая на d3d11. Визуализировать сформированный decodebin'ом пайплайн не хочешь? Думаю, что и прояснится многое и, если сам будешь формировать (о чём ты в следующем сообщении пишешь), поможет. И если явно будет виден пул как элемент, то тогда можно будет ему max_buffers выставить.
S>http://files.rsdn.org/79401/graphviz.svg

Кажется, что такое на коленке собрал по образу и подобию, но не уверен, что все правильно и оптимально:
  код
        public static Pipeline BuildVideoReaderPipelineCustom()
        {
            // Build video reader pipeline

            var fileSrc = ElementFactory.Make("filesrc", "filesrc");
            if (fileSrc == null)
            {
                throw new ArgumentNullException(nameof(fileSrc));
            }
            
            var qtdemux = ElementFactory.Make("qtdemux", "qtdemux");
            if (qtdemux == null)
            {
                throw new ArgumentNullException(nameof(qtdemux));
            }


            var queue = ElementFactory.Make("queue", "queue");
            if (queue == null)
            {
                throw new ArgumentNullException(nameof(queue));
            }

            var h264parse = ElementFactory.Make("h264parse", "h264parse");
            if (h264parse == null)
            {
                throw new ArgumentNullException(nameof(h264parse));
            }

            var avdec = ElementFactory.Make("avdec_h264", "avdec_h264");
            if (avdec == null)
            {
                throw new ArgumentNullException(nameof(avdec));
            }


            var appSink = new AppSink("my_appsink");
            //appSink.NewSample += AppSink_NewSample;
            // appSink.EmitSignals = true;
            appSink["sync"] = true;

            h264parse.PadAdded += (o, args) =>
            {
                //args.Args[0] as 
                var appsinkPad = appSink.GetStaticPad("sink");

                if (appsinkPad.IsLinked)
                {
                    return;
                }

           
                args.NewPad.Link(appsinkPad);
            };

            fileSrc.PadAdded += (o, args) =>
            {
                //args.Args[0] as 
                var decPad = h264parse.GetStaticPad("sink");

                if (decPad.IsLinked)
                {
                    return;
                }

                args.NewPad.Link(decPad);
            };

            qtdemux.PadAdded += (o, args) =>
            {
                //args.Args[0] as 
                var qPad = queue.GetStaticPad("sink");

                if (qPad.IsLinked)
                {
                    return;
                }

                args.NewPad.Link(qPad);
            };

            var pipeline = new Pipeline("video reader pipe");
            pipeline.Add(fileSrc, qtdemux, queue, h264parse, avdec, appSink);


            var linkResult = Element.Link(fileSrc, qtdemux);
            linkResult = Element.Link(qtdemux, queue);
            linkResult = Element.Link(queue, h264parse);
            linkResult = Element.Link(h264parse, avdec);
            linkResult = Element.Link(avdec, appSink);

            return pipeline;
        }

        public static void SearchFrameByNumber(Pipeline readerPipe, IEnumerable<string> videoFiles, int frameNumber)
        {
            if (readerPipe == null) throw new ArgumentNullException(nameof(readerPipe));


            var fileSrc = readerPipe.GetByName("filesrc");

            var appSink = (AppSink) readerPipe.GetByName("my_appsink");
            readerPipe.SetName("frame_stepper");

           
            foreach (var videoFile in videoFiles)
            {
                fileSrc["location"] = videoFile;

                readerPipe.SetState(State.Playing);


                var step = 1; //fn тоже с 1 начинается
                while (step < frameNumber)
                {
                    var sample = appSink.PullSample();
                    var fn = $"{Path.GetFileNameWithoutExtension(videoFile)}_{step}.jpeg";
                    SaveImg(sample,Path.Combine("d:\\test_out\\",fn));
                    step++;
                }

                readerPipe.SetState(State.Ready);
                
            }
        }


Не до конца понимаю, почему простой варинат filesrc ! queue ! h264parse ! appsink не сработал...
Методом тыка что-то заработало.

Смущает несколько моментов:

1)код saveimg имеет такую строчку
var neededFrame = Global.VideoConvertSample(sample, new Caps("image/jpeg"), Constants.MSECOND * 100);
и что-то первое время по таймауту во время отладки падало, пришлось увеличить. Сейчас откатил как выше, вроде нормально, но что это было??

2) сыпятся такие сообщения
0:00:11.961293800 30572 000002232259B7E0 WARN basesrc gstbasesrc.c:3693:gst_base_src_start_complete:<filesrc> pad not activated yet
0:00:11.963705700 30572 000002232218CF00 WARN qtdemux qtdemux.c:3245:qtdemux_parse_trex:<qtdemux> failed to find fragment defaults for stream 1

Что с этим делать?
Кодом людям нужно помогать!
Re[15]: Относительно твоих вопросов в рассылке gstreamer'а
От: Sharov Россия  
Дата: 13.08.23 21:30
Оценка:
Здравствуйте, Conductor, Вы писали:

S>>Кажется, что такое на коленке собрал по образу и подобию, но не уверен, что все правильно и оптимально:

C>У тебя видеокарта на боевых машинах предполагается, и если да, то какая, NVidia? Сколько видеопотоков одновременно?

Вообще планируется 8 потоков, 8 камер. Про gpu не знаю, но скорее всего нет.

C>Нужно смотреть загрузку CPU. Ежели всё устраивает, дык и ладно. С GPU свои заморочки есть (с ограничением экземпляров кодирования на процесс).

C>Decodebin у тебя d3d11h264dec выбирал, он же, вроде, hardware использует, значит, условия соответствуют. Выбор осуществляется из элементов, которые могут работать в данных условиях, элемента с максимальным рангом.
C>https://developer.ridgerun.com/wiki/index.php?title=GStreamer_modify_the_elements_rank

Ок, изучу вопрос.

S>>Не до конца понимаю, почему простой варинат filesrc ! queue ! h264parse ! appsink не сработал...

C>А декодировать h264 кто будет в этом пайплайне? А сейчас у тебя этим avdec занимается.

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

S>>Методом тыка что-то заработало.


S>>Смущает несколько моментов:


S>>1)код saveimg имеет такую строчку

S>>var neededFrame = Global.VideoConvertSample(sample, new Caps("image/jpeg"), Constants.MSECOND * 100);
S>>и что-то первое время по таймауту во время отладки падало, пришлось увеличить. Сейчас откатил как выше, вроде нормально, но что это было??
C>Где-то чего-то на что-то наложилось, другой ответ мне сложно дать. А тебе и в боевой работе изображения надо будет так же сохранять? Или с ними ещё что-то делать? Там же просто плагины разные есть, может быть можно и без доп.кода обойтись. Ну и, на всякий случай, выходной формат на уровне пайплайна можно разный запросить (с помощью videconvert).

Да, надо будет сохранять. jpegenc я смотрел, возможно я вернусь к нему. Но кажется, что VideoConvertSample и jpenenc
это одно и тоже. Т.е. на первый взгляд, особой разницы нету. Я смотрел по исходникам VideoConvertSample и том строит
некий пайплайн, который, чую я, крайне похож на jpegenc. В коде я уже знаю номер интересного мне кадра, и мне нужно получить только его.
В случае использования jpegenc (... ! jpegenc ! appsink), это будет прогоняться для всех кадров, соотв. лишние накладные расходы.

S>>2) сыпятся такие сообщения

S>>0:00:11.961293800 30572 000002232259B7E0 WARN basesrc gstbasesrc.c:3693:gst_base_src_start_complete:<filesrc> pad not activated yet
S>>0:00:11.963705700 30572 000002232218CF00 WARN qtdemux qtdemux.c:3245:qtdemux_parse_trex:<qtdemux> failed to find fragment defaults for stream 1
S>>Что с этим делать?
C>Дык, видимо, не раскочегарилось ещё. У тебя readerPipe.SetState(State.Playing) GST_STATE_CHANGE_ASYNC возвращает? А в лог плюётся во время PullSample()? Не хочешь GetState'ом подождать завершения изменения состояния? Оно как часто эти сообщения выдаёт?

Попробую, благодарю.
Кодом людям нужно помогать!
Отредактировано 14.08.2023 8:13 Sharov . Предыдущая версия .
Re[2]: Есть специалисты по gstreamer'у?
От: Sharov Россия  
Дата: 14.08.23 11:33
Оценка:
Здравствуйте, reversecode, Вы писали:

R>когда плясать с гстримером надоест вашему дателю

R>нанимаются прогеры и делается решение под себя
R>либо выбирается готовое что присутсвует на рынке

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

R>любопытно только, через какое время к этому прийдет ваш датель

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

Чего так скептически? Был негативный опыт с gst?
Кодом людям нужно помогать!
Re[3]: Есть специалисты по gstreamer'у?
От: reversecode google
Дата: 14.08.23 12:44
Оценка:
если это решение как saas
когда потребителю должно быть до места что там под капотом
там начинается нагрузка на самих поддеживающих
такие mvp решения когда пользователи динамические
тяжело сопровождать
нужны как миниум пару devops шаровых которые будут постоянно следить и подкручивать подтюнивать на разные сложные кейсы новых юзерей
скрипты и прочая хрень
а с учетом того что это не все кейсы покрывает
то нужно будет держать под рукой еще и кодера который будет лезть в глубины того же gstreamera что бы разобраться

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


так в какой нише и на каком этапе там сейчас вы с шефом?))
Re[2]: Еще пару вопросов
От: Sharov Россия  
Дата: 16.08.23 16:20
Оценка:
Здравствуйте, Conductor, Вы писали:

1) А каков жизненный цикл буффера, от src до sink'а, это что-то типа tcp\ip, когда каждый элемент(слой) добавляет
к буфферу какую-то конкретную инф-ию или как? Вот например на вход h264parse идет сырое видео из src, а что на выходе --
какой-то новый буффер или старый с какой-то инф-ей, пригодной для следующих эл-ов, типа, avdec_h264?

2) Как можно хранить метаинф-ию в mp4 файле для каждого фрейма, у меня был вопрос -- https://lists.freedesktop.org/archives/gstreamer-devel/2023-July/081587.html
Я не нашел как это можно сделать. Т.е. когда открою файл для чтения, например в цикле PullSample, как мне извлекать эту инф-ию?
Ответ выше по ссылке был не очень полезен...
Кодом людям нужно помогать!
Re[17]: Относительно твоих вопросов в рассылке gstreamer'а
От: Sharov Россия  
Дата: 16.08.23 16:50
Оценка:
Здравствуйте, Conductor, Вы писали:


S>>Вообще планируется 8 потоков, 8 камер. Про gpu не знаю, но скорее всего нет.

C>8 HD потоков? Что-то мне подсказывает, что gpu может понадобиться.

Речь идет о (максимум) 8 rtsp потоках, которые надо в mp4 загнать. Неужели это так дорого по cpu?
Кодом людям нужно помогать!
Re[19]: Относительно твоих вопросов в рассылке gstreamer'а
От: sergey2b ЮАР  
Дата: 16.08.23 20:36
Оценка:
Скажите пожалуйста как вы считаете сможет gstreamer записывать 4 потока без GPU
И хватит ли ему например 1g ram если это mp4 по 3 часа каждый
Re[21]: Относительно твоих вопросов в рассылке gstreamer'а
От: sergey2b ЮАР  
Дата: 17.08.23 02:39
Оценка:
Здравствуйте, Conductor, Вы писали:

C>Маловато данных:

C>1. Разрешение, fps?

Hd 60 fps

C>2. Что на входе?

4 потолка raw video в yuv420 or rgb
На выходе 4 mp4


C>3. Во что кодируем — h264?

Да h264

C>4. Железо какого уровня? 1G — только для его нужд?

12th cpu 64 g ram но под запись видео ram 1g

C>5. ОС?

Linux например Ubuntu
Re[23]: Относительно твоих вопросов в рассылке gstreamer'а
От: sergey2b ЮАР  
Дата: 17.08.23 18:05
Оценка:
Здравствуйте, Conductor, Вы писали:

большое вам спасибо за ваш эксперемент

мне надо подумать немного, но получаеться вполне без GPU может работать
Re[24]: Относительно твоих вопросов в рассылке gstreamer'а
От: Conductor СССР  
Дата: 17.08.23 19:12
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>большое вам спасибо за ваш эксперемент

S>мне надо подумать немного, но получаеться вполне без GPU может работать

Да не за что. Мне самому это пригодится. Задачка тут вылезает: 16 потоков, телевизионное разрешение, правда, но на 2-ом поколении, без GPU.
Так что, фактически, я преследовал свой сугубо корыстный интерес.

P.S. Почему на "Вы"-то? И принято здесь всегда было на "ты", и по возрасту мы, вроде бы, из одной категории.
Re[25]: Относительно твоих вопросов в рассылке gstreamer'а
От: sergey2b ЮАР  
Дата: 22.08.23 13:15
Оценка:
Здравствуйте, Conductor, Вы писали:

Привет

one more a question more please.

насколько трудно сделать на gstreamer получать несколько видеопотока и записывать полученное в один mp4, а если они с разными fps
интерестно понять такое принципиально возможно или нет
Re[27]: Относительно твоих вопросов в рассылке gstreamer'а
От: sergey2b ЮАР  
Дата: 24.08.23 15:55
Оценка:
Здравствуйте, Conductor, Вы писали:

C>Здравствуйте, sergey2b, Вы писали:


спасибо за ваш ответ
надо принять 4 видеопотока в 4k и сделать из них один mp4 в котором совмещенны видео из каждого потока те multivew

каке я понял человек которому поручили это сделать столкнулся с проблемами производительности

мне поручили изучить gstreamer что я конечно сделаю
и собрать его с поддержкой onevpl


я уже начал ходить по собеседованиям, если начинают пугать уволнением лучше самому уйти
Re[3]: I have jpeg files in memory, how to transform them into mjpeg file?
От: sergey2b ЮАР  
Дата: 27.08.23 23:52
Оценка:
На avcodec это займет строк 200
Re[3]: I have jpeg files in memory, how to transform them i
От: Sharov Россия  
Дата: 28.08.23 10:02
Оценка:
Здравствуйте, Conductor, Вы писали:

C>На основе использования appsrc не прокатит? Что-то вроде:

C>appsrc name=_appsrc ! image/jpeg,framerate=25/1,width=768,height=576 ! avimux ! filesink location=mjpeg.avi

Благодарю, а можно сразу в mp4?

Еще вопрос: "! image/jpeg,framerate=25/1,width=768,height=576 !" -- это caps для кого эл-та, для appsrc или *mux?

Упд: Как-то так appsrc name=_appsrc ! image/jpeg,framerate=25/1,width=768,height=576 ! mp4mux ! filesink location=mjpeg.mp4 ?
Кодом людям нужно помогать!
Отредактировано 28.08.2023 11:52 Sharov . Предыдущая версия .
Re[5]: I have jpeg files in memory, how to transform them i
От: Sharov Россия  
Дата: 28.08.23 15:43
Оценка:
Здравствуйте, Conductor, Вы писали:


C>>appsrc name=_appsrc ! image/jpeg,framerate=25/1,width=768,height=576 ! avimux ! filesink location=mjpeg.avi


Благодарю, тут все получилось:

    private static Pipeline BuildMp4FromJpegs2()
        {
                      
        //Читаю jpeg файлы в память
        var info = new DirectoryInfo("d:\\test_appsrc\\");
            Files = info.GetFiles().OrderBy(p => p.CreationTime).Select(t=>t.FullName).ToList();
            
                      
            var pipe = (Pipeline) Parse.Launch(
                "appsrc name=_appsrc  ! image/jpeg,framerate=25/1,width=768,height=576 ! avimux  ! filesink location=d:\\\\qqq.avi");
            var appsrc = pipe.GetByName("_appsrc");
            appsrc.AddSignalHandler("need-data", StartFeed);
            appsrc.AddSignalHandler("seek-data", SeekData);
            appsrc["stream-type"] = AppStreamType.Stream;
            return pipe;
        }

     
        private static void StopFeed(object sender, EventArgs e)
        {
        }

        private static void StartFeed(object o, EventArgs args)
        {
            var source = new AppSrc(((Element) o).Handle);
            var file = Files[FileCounter];
            var bytes = File.ReadAllBytes(file);
            var buf = new Buffer(bytes)
            source.PushBuffer(new Buffer(bytes));
            FileCounter++;
        }


Вот только смущает наличие таких сообщений в консоле: GStreamer-CRITICAL gst_segment_to_running_time: assertion 'segment->format == format' failed

Это что такое может быть?

S>>Благодарю, а можно сразу в mp4?

S>>Еще вопрос: "! image/jpeg,framerate=25/1,width=768,height=576 !" -- это caps для кого эл-та, для appsrc или *mux?
C>Для appsrc. Точнее так: ты информируешь, что именно твой appsrc отдавать будет, чтобы muxer на это ориентировался. Ведь что в рельности отдает appsrc именно ты определяешь. Так что можно сказать, что и для *mux.
C>Кстати, может быть и прокатит без указания width/height, в jpeg они же внутри есть. Попробовать надо.

S>>Упд: Как-то так appsrc name=_appsrc ! image/jpeg,framerate=25/1,width=768,height=576 ! mp4mux ! filesink location=mjpeg.mp4 ?

C>mp4mux — не поддерживает для sink image/jpeg. qtmux поддерживает, если он тебя устроит.

Понял, надо сравнить это и это.

C>А ежели надо jpegs в mp4 с h264 внутри, то можно, например, так попробовать:

C>appsrc name=_appsrc ! image/jpeg,framerate=25/1,width=768,height=576 ! jpegdec ! x264enc ! mp4mux ! filesink location=mjpeg.mp4

Протестировал и "appsrc name=_appsrc ! image/jpeg, framerate=16/1,width=768,height=576 ! jpegdec ! x264enc ! mp4mux ! filesink location=d:\\\\qqq.mp4";
Работает! Файл mp4 более чем в 10 раз меньше avi файла, впечатляет.

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


А вот тут подробнее, зачем нужна очередь и какие возможны сюрпризы?

C>gst-launch-1.0 videotestsrc num-buffers=500 ! video/x-raw, framerate='(fraction)'25/1 ! jpegenc ! image/jpeg,framerate=25/1,width=768,height=576 ! jpegdec ! x264enc ! mp4mux ! filesink location=mjpeg_h264.mp4


Этот пайплайн для каких целей?
Кодом людям нужно помогать!
Re[7]: Конкатенировать два mp4
От: Sharov Россия  
Дата: 29.08.23 14:15
Оценка:
Здравствуйте.

Тут встала необходимость конкатенировать два mp4 файла, смотрю на concat и сюда. Пока не получилось -- создается файл размера 2х от обоих (2 файла по 10 секунд, размер x байт каждый), но проигрывается
только 10 секунд 1-го файла:

gst-launch-1.0 concat name=c ! filesink location=result.mp4 filesrc location=1.mp4 ! c. filesrc location=2.mp4 ! c.


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

gst-launch-1.0 splitmuxsrc location="6*.mp4" ! h264parse ! qtmux ! filesink location=result.mp4


Второй вариант рабочий, пока возьму его, но почему concat не до конца работает?

Заранее благодарю.

Упд:

Нашел работающее решение, но пока не очень понимаю, почему оно работает:

gst-launch-1.0 concat name=c ! queue ! m.video_0 qtmux name=m ! filesink location=result.mp4 filesrc location=1.mp4 ! qtdemux ! h264parse ! c. filesrc location=2.mp4 ! qtdemux ! h264parse ! c.


Правда, автор решения пишет, что работает не всегда -- https://stackoverflow.com/q/68024094/241446
Тут еще есть обсуждение.
По итогу, все переходят на splitmuxsrc, хотя мне concat нравится больше.
Кодом людям нужно помогать!
Отредактировано 29.08.2023 14:36 Sharov . Предыдущая версия .
Re[9]: Конкатенировать два mp4
От: Sharov Россия  
Дата: 29.08.23 15:24
Оценка:
Здравствуйте, Conductor, Вы писали:


S>>Правда, автор решения пишет, что работает не всегда -- https://stackoverflow.com/q/68024094/241446

S>>Тут еще есть обсуждение.
S>>По итогу, все переходят на splitmuxsrc, хотя мне concat нравится больше.
C>В первом случае ("gst-launch-1.0 concat name=c ! filesink location=result.mp4 filesrc location=1.mp4 ! c. filesrc location=2.mp4 ! c.") он тебе сделал ровно то, что ты просил — объединил два файла как файлы, а не их содержимое (не потоки), и ему было абсолютно пофигу, что у них внутри. С тем же успехом можно было (вообще без gstreamer'а) выделить элементарный буфер размером в сумму размеров исходных файлов, и скопировать как есть в первую часть данные первого файла, а во вторую — второго. Эффект был бы тот же самый — воспроизведение доходит до конца данных первого файла и завершает работу.
C>Ведь в твоей же ссылке https://coaxion.net/blog/2014/08/concatenate-multiple-streams-gaplessly-with-gstreamer явно написано:
C>

C># Basically: $ cat file1 file2 > both
C>gst-launch-1.0 concat name=c ! filesink location=both filesrc location=file1 ! c. filesrc location=file2 ! c.


Видел, вот я и подумал "ого, как просто!", а дальше умный gst вывезет что речь идет о 2х mp4 файлах. Ан нет.

C>А во втором случае объединяется уже содержимое — ты же видишь: demux + parse + mux.


Уловил, благодарю. Пока, увы, слабо ориентируюсь.

Еще вопрос в догонку -- попытался переиспользовать вот этот пайплайн:

gst-launch-1.0 concat name=c ! queue ! m.video_0 qtmux name=m ! filesink location=result.mp4 filesrc location=1.mp4 ! qtdemux ! h264parse ! c. filesrc location=2.mp4 ! qtdemux ! h264parse ! c.

все делаю по феншую -- 1) присваиваю всем location 2) pipeline.setstate(playing) 3)жду через шину EOS! Error (блокирующий вызов) 4) далее pipeline.setstate(ready) и pipeline.setstate(null);

и по кругу с другими файлами -- ломается, qtdemux not-linked, т.е. там pad'ы что ли как-то динамически появляются. В общем,
я этот вопрос еще поисследую, но меня интересуте другой вопрос:
а имеет ли смысл pipeline'ы переиспользовать или может проще новый создавать каждый раз? Не проводили эксперименты,
есть мнение на этот счет? Может, с конкретно этим пайплайном (см. выше), плюнуть и каждый раз занового его создавать?
Кодом людям нужно помогать!
Отредактировано 29.08.2023 22:04 Sharov . Предыдущая версия .
Re[29]: Относительно твоих вопросов в рассылке gstreamer'а
От: sergey2b ЮАР  
Дата: 29.08.23 18:13
Оценка:
Здравствуйте, Conductor, Вы писали:

C>Правильно ли я понял: результирующий файл должен содержать 4 синхронизированных видеопотока и при воспроизведении они должны отображаться синхронно ("решётка" или на отдельных экранах), так?


да именно так


скажите пожалуйста а вам приходилось записывать mp4 используя gstreame одним файлом 4-5 часов подряд


я тоже думаю что на текущей работе меня уволят как только сделапю то что им срочно нужно
поэтому ищу новую работу
Re[29]: cerbero
От: sergey2b ЮАР  
Дата: 30.08.23 15:45
Оценка:
Здравствуйте, Conductor, Вы писали:

скажите пожалуйста а вы используйте cerbero на операционной системе или в докере
Re[30]: cerbero
От: Conductor СССР  
Дата: 30.08.23 18:36
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>скажите пожалуйста а вы используйте cerbero на операционной системе или в докере


Я стараюсь то, что можно, по максимуму в контейнеры распихать, особенно сборку third party. Но в нашем случае для этих целей плюшки докера особо не нужны и поэтому исторически сложилось, что используется LXC, в том числе и для cerbero.
Re[31]: cerbero
От: sergey2b ЮАР  
Дата: 30.08.23 20:09
Оценка:
Здравствуйте, Conductor, Вы писали:

C>Здравствуйте, sergey2b, Вы писали:


S>>скажите пожалуйста а вы используйте cerbero на операционной системе или в докере


C>Я стараюсь то, что можно, по максимуму в контейнеры распихать, особенно сборку third party. Но в нашем случае для этих целей плюшки докера особо не нужны и поэтому исторически сложилось, что используется LXC, в том числе и для cerbero.



я пытался собрать эти контейнеры у меня не получилось
различные ошибки при сборки часть я исправил


https://github.com/maxmcd/gstreamer-docker/blob/master/1.14/cerbero/Dockerfile

https://github.com/restreamio/docker-gstreamer/
Re[33]: cerbero
От: sergey2b ЮАР  
Дата: 31.08.23 17:04
Оценка:
Здравствуйте, Conductor, Вы писали:

у нас базовая ОС ubuntu 20.04
поэтому пришлось использовать последний docker-gstreamer поддерживающий ubuntu 20.04 docker-gstreamer-2020-12-30T23-16-11Z


superuser@xxx:~/Documents/docker-gstreamer-2020-12-30T23-16-11Z$ ./build-release.sh 1.20
20.04: Pulling from library/ubuntu
Digest: sha256:33a5cc25d22c45900796a1aca487ad7a7cb09f09ea00b779e3b2026b4fc2faba
Status: Image is up to date for ubuntu:20.04
docker.io/library/ubuntu:20.04
[+] Building 0.2s (8/8) FINISHED                                                                                                                                                                           docker:default
 => [internal] load build definition from Dockerfile-dev-dependencies                                                                                                                                                0.0s
 => => transferring dockerfile: 155B                                                                                                                                                                                 0.0s
 => [internal] load .dockerignore                                                                                                                                                                                    0.0s
 => => transferring context: 2B                                                                                                                                                                                      0.0s
 => [internal] load metadata for docker.io/library/ubuntu:20.04                                                                                                                                                      0.0s
 => [internal] load build context                                                                                                                                                                                    0.0s
 => => transferring context: 2.35kB                                                                                                                                                                                  0.0s
 => [1/3] FROM docker.io/library/ubuntu:20.04                                                                                                                                                                        0.0s
 => CACHED [2/3] COPY docker/build-gstreamer/install-dependencies /                                                                                                                                                  0.0s
 => CACHED [3/3] RUN ["/install-dependencies"]                                                                                                                                                                       0.0s
 => exporting to image                                                                                                                                                                                               0.0s
 => => exporting layers                                                                                                                                                                                              0.0s
 => => writing image sha256:18b452a3f3e92ea0fb1d5e21ad275eab3dc0e803917d6a3dcd6ccaf2d7685040                                                                                                                         0.0s
 => => naming to docker.io/restreamio/gstreamer:dev-dependencies                                                                                                                                                     0.0s
[+] Building 163.8s (7/8)                                                                                                                                                                                  docker:default
 => [internal] load .dockerignore                                                                                                                                                                                    0.0s
 => => transferring context: 2B                                                                                                                                                                                      0.0s
 => [internal] load build definition from Dockerfile-dev-downloaded                                                                                                                                                  0.0s
 => => transferring dockerfile: 1.37kB                                                                                                                                                                               0.0s
 => [internal] load metadata for docker.io/restreamio/gstreamer:dev-dependencies                                                                                                                                     0.0s
 => [1/4] FROM docker.io/restreamio/gstreamer:dev-dependencies                                                                                                                                                       0.0s
 => [internal] load build context                                                                                                                                                                                    0.0s
 => => transferring context: 3.60kB                                                                                                                                                                                  0.0s
 => CACHED [2/4] COPY docker/build-gstreamer/download /                                                                                                                                                              0.0s
 => ERROR [3/4] RUN ["/download"]                                                                                                                                                                                  163.7s
------                                                                                                                                                                                                                    
 > [3/4] RUN ["/download"]:                                                                                                                                                                                               
0.289 Cloning into 'gstreamer'...                                                                                                                                                                                         
132.2 /gstreamer /                                                                                                                                                                                                        
133.6 Switched to a new branch '1.20'                                                                                                                                                                                     
133.6 Branch '1.20' set up to track remote branch '1.20' from 'origin'.                                                                                                                                                   
133.6 /
133.6 Cloning into 'libnice'...
138.5 /libnice /
138.5 Note: switching to '1dbe38d6abe74c415bf4ae44190980c61874a04f'.
138.5 
138.5 You are in 'detached HEAD' state. You can look around, make experimental
138.5 changes and commit them, and you can discard any commits you make in this
138.5 state without impacting any branches by switching back to a branch.
138.5 
138.5 If you want to create a new branch to retain commits you create, you may
138.5 do so (now or later) by using -c with the switch command. Example:
138.5 
138.5   git switch -c <new-branch-name>
138.5 
138.5 Or undo this operation with:
138.5 
138.5   git switch -
138.5 
138.5 Turn off this advice by setting config variable advice.detachedHead to false
138.5 
138.5 HEAD is now at 1dbe38d test-fallback: fix stack buffer overflow with new candidate API
138.5 /
138.5 Cloning into 'gst-plugins-base'...
162.2 /gst-plugins-base /
162.2 error: pathspec '1.20' did not match any file(s) known to git
------
Dockerfile-dev-downloaded:30
--------------------
  28 |     COPY docker/build-gstreamer/download /
  29 |     
  30 | >>> RUN ["/download"]
  31 |     
  32 |     COPY docker/build-gstreamer/compile /
--------------------
ERROR: failed to solve: process "/download" did not complete successfully: exit code: 1



и последней версией


superuser@xxx:~/Documents/docker-gstreamer-2020-12-30T23-16-11Z$ ./build-release.sh 1.22.5
20.04: Pulling from library/ubuntu
Digest: sha256:33a5cc25d22c45900796a1aca487ad7a7cb09f09ea00b779e3b2026b4fc2faba
Status: Image is up to date for ubuntu:20.04
docker.io/library/ubuntu:20.04
[+] Building 0.2s (8/8) FINISHED                                                                                                                                                                           docker:default
 => [internal] load build definition from Dockerfile-dev-dependencies                                                                                                                                                0.0s
 => => transferring dockerfile: 155B                                                                                                                                                                                 0.0s
 => [internal] load .dockerignore                                                                                                                                                                                    0.0s
 => => transferring context: 2B                                                                                                                                                                                      0.0s
 => [internal] load metadata for docker.io/library/ubuntu:20.04                                                                                                                                                      0.0s
 => [internal] load build context                                                                                                                                                                                    0.0s
 => => transferring context: 2.35kB                                                                                                                                                                                  0.0s
 => [1/3] FROM docker.io/library/ubuntu:20.04                                                                                                                                                                        0.0s
 => CACHED [2/3] COPY docker/build-gstreamer/install-dependencies /                                                                                                                                                  0.0s
 => CACHED [3/3] RUN ["/install-dependencies"]                                                                                                                                                                       0.0s
 => exporting to image                                                                                                                                                                                               0.0s
 => => exporting layers                                                                                                                                                                                              0.0s
 => => writing image sha256:18b452a3f3e92ea0fb1d5e21ad275eab3dc0e803917d6a3dcd6ccaf2d7685040                                                                                                                         0.0s
 => => naming to docker.io/restreamio/gstreamer:dev-dependencies                                                                                                                                                     0.0s
[+] Building 165.9s (7/8)                                                                                                                                                                                  docker:default
 => [internal] load build definition from Dockerfile-dev-downloaded                                                                                                                                                  0.0s
 => => transferring dockerfile: 1.37kB                                                                                                                                                                               0.0s
 => [internal] load .dockerignore                                                                                                                                                                                    0.0s
 => => transferring context: 2B                                                                                                                                                                                      0.0s
 => [internal] load metadata for docker.io/restreamio/gstreamer:dev-dependencies                                                                                                                                     0.0s
 => [1/4] FROM docker.io/restreamio/gstreamer:dev-dependencies                                                                                                                                                       0.0s
 => [internal] load build context                                                                                                                                                                                    0.0s
 => => transferring context: 3.60kB                                                                                                                                                                                  0.0s
 => CACHED [2/4] COPY docker/build-gstreamer/download /                                                                                                                                                              0.0s
 => ERROR [3/4] RUN ["/download"]                                                                                                                                                                                  165.8s
------                                                                                                                                                                                                                    
 > [3/4] RUN ["/download"]:                                                                                                                                                                                               
0.242 Cloning into 'gstreamer'...                                                                                                                                                                                         
136.5 /gstreamer /                                                                                                                                                                                                        
137.8 Note: switching to '1.22.5'.                                                                                                                                                                                        
137.8                                                                                                                                                                                                                     
137.8 You are in 'detached HEAD' state. You can look around, make experimental
137.8 changes and commit them, and you can discard any commits you make in this
137.8 state without impacting any branches by switching back to a branch.
137.8 
137.8 If you want to create a new branch to retain commits you create, you may
137.8 do so (now or later) by using -c with the switch command. Example:
137.8 
137.8   git switch -c <new-branch-name>
137.8 
137.8 Or undo this operation with:
137.8 
137.8   git switch -
137.8 
137.8 Turn off this advice by setting config variable advice.detachedHead to false
137.8 
137.8 HEAD is now at bf6ce1d64a Release 1.22.5
137.8 /
137.8 Cloning into 'libnice'...
140.3 /libnice /
140.3 Note: switching to '1dbe38d6abe74c415bf4ae44190980c61874a04f'.
140.3 
140.3 You are in 'detached HEAD' state. You can look around, make experimental
140.3 changes and commit them, and you can discard any commits you make in this
140.3 state without impacting any branches by switching back to a branch.
140.3 
140.3 If you want to create a new branch to retain commits you create, you may
140.3 do so (now or later) by using -c with the switch command. Example:
140.3 
140.3   git switch -c <new-branch-name>
140.3 
140.3 Or undo this operation with:
140.3 
140.3   git switch -
140.3 
140.3 Turn off this advice by setting config variable advice.detachedHead to false
140.3 
140.3 HEAD is now at 1dbe38d test-fallback: fix stack buffer overflow with new candidate API
140.3 /
140.3 Cloning into 'gst-plugins-base'...
164.3 /gst-plugins-base /
164.3 error: pathspec '1.22.5' did not match any file(s) known to git
------
Dockerfile-dev-downloaded:30
--------------------
  28 |     COPY docker/build-gstreamer/download /
  29 |     
  30 | >>> RUN ["/download"]
  31 |     
  32 |     COPY docker/build-gstreamer/compile /
--------------------
ERROR: failed to solve: process "/download" did not complete successfully: exit code: 1




может вы сталкивались с такой ошибкой
Re[4]: Есть специалисты по gstreamer'у?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 04.09.23 16:01
Оценка:
Здравствуйте, reversecode, Вы писали:

R>а некоторым не важно что это сумер мега новый инновационные не имещий аналогов продукт построенные на основе gstreamera

Вот есть libav который много где работает с аппаратным ускорением, и на армах, и на "интелах". Мне прямо интересно, а что вместо него использовать, чтобы оно и кодировало/декодировало, а ещё и с 0 копированием на дисплей выводило, да не в своё окно, а как текстурой в GLES?
Sic luceat lux!
Отредактировано 04.09.2023 16:04 Kernan . Предыдущая версия .
Re[5]: Есть специалисты по gstreamer'у?
От: reversecode google
Дата: 04.09.23 16:06
Оценка:
libav это тот который форк отщипенцами из ffmpeg и который умер и уже больше двух лет не обновляется?
Re[6]: Есть специалисты по gstreamer'у?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 04.09.23 17:43
Оценка:
Здравствуйте, reversecode, Вы писали:

R>libav это тот который форк отщипенцами из ffmpeg и который умер и уже больше двух лет не обновляется?

Хорошо, давай по-другому. Вот есть ffmpeg... и далее по списку вопросов выше...
Sic luceat lux!
Re[7]: Есть специалисты по gstreamer'у?
От: reversecode google
Дата: 04.09.23 19:33
Оценка:
немного не понятно к чему вы ведете
но давайте тыпа догадаюсь
я знаю продукты которые писали это все с нуля для себя то о чем вы говорите
в опен сорсе этого нет

в чем это вышло круче чем те кто тупо подключил очередной libav/libffmpeg ?
вышло более компактно
и с точки зрения маркетинга "более привлекательнее"
чем то как я упомянул в посте на который вы ответили

переводя на совсем протой язык
кто может делает
кто не может берет готовое
Re[9]: Есть специалисты по gstreamer'у?
От: reversecode google
Дата: 04.09.23 22:17
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, reversecode, Вы писали:


R>>и с точки зрения маркетинга "более привлекательнее"

K>Специализированные решения буду ещё и более оптимальны и быстрее, но это уже заточка под архитектуру.


R>>чем то как я упомянул в посте на который вы ответили

K>Я пытаюсь понять в чём профит взять условный NVIDIA SDK, своять на нём и получить что-то что работает только на NVIDIA, но не на АМД и интел. С другой стороны, берётся ffmpeg и почти не меняя кода у нас есть поддержка nvidia, amd, mali, intel через тот же vaapi там, куда ffmpeg портирован, а портирован он много куда.

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

R>>кто может делает

R>>кто не может берет готовое
K>Но можно пересобрать ffmpeg без того что не нужно и он будет компактнее.

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

если ваш кейс покрывается полностью интерфейсом либ ffmpeg
и что внутри вам не надо знать, то да, вам подходит
а другим очевидно нет
Re[10]: Есть специалисты по gstreamer'у?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 05.09.23 07:45
Оценка:
Здравствуйте, reversecode, Вы писали:

R>рассматривается кейс некоего транскодинга ?

Рассматривается кейз когда надо что-то декодировать, рескейлить и отобразить на экране, желательно с аппаратным ускорением попробовав 2-3 интерфейса, а если поддержки нет, то откатиться до программного. В промежутке, ещё и в контейнер сохранить, а потом и в сеть отправить. NVIDIA API такое поддерживает, а Intel?
R>амд кстати почему то многие уже забросили
Да-да... все прямо и забили...
R>intel с ваапи так себе, и он же квиксинк
Ну хер знает https://github.com/intel/media-driver
R>nvidia набер ван по моим наблюдениям
В разных сегментах своё. Где nvidia, где интел, где АРМ с мали, где тот же интел и амд как встройки в проц. Напридумывали столько, что охренеть. Завтра вообще на рокчипе будут железки и там надо будет запустить.
R>с мали не сталкивался, но это скорее всего мобаил и делается это несколько по другому через интерфес который предоставляет сама ява андроида
R>или разве что какойто ембеддед без андроида
И с андройдом тоже используют ffmpeg как бэкенд для медии. Прикинь! Просто до чёрта кода написано на этой базе.
R>не будет
А ты пробовал?
R>а другое дело когда ты имеешь дело с прослойкой ffmpeg к апи нвидии
А можешь написать что нужно такого вот экзотического?
R>а другим очевидно нет
Большинству, скорее всего, не нужно.
Sic luceat lux!
Отредактировано 05.09.2023 8:54 Kernan . Предыдущая версия . Еще …
Отредактировано 05.09.2023 7:50 Kernan . Предыдущая версия .
Re[11]: Есть специалисты по gstreamer'у?
От: reversecode google
Дата: 05.09.23 15:54
Оценка:
мы в разных сферах и меряемся пипьсами разных фаун
у слона и муравья они очевидно разные
так что невижу смысла

единственное что я забыл
это всякие бонгакам сайтики где нужно стримить женские пиписьки
а это иногда те же самые обычные PC
в которых и интелл и амд
но в контексте сервер сайда они умерли
Re[12]: Есть специалисты по gstreamer'у?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 05.09.23 18:08
Оценка:
Здравствуйте, reversecode, Вы писали:

R>мы в разных сферах и меряемся пипьсами разных фаун

R>у слона и муравья они очевидно разные
Обожжжи... но у кого, по итогу, больше?
R>но в контексте сервер сайда они умерли
Там сейчас виртуальные GPU рулить начинают, а это нвидлиа и лицензия, наверное, в таком случае SDK лучше всего, но если есть варианты...
Sic luceat lux!
Re[35]: cerbero
От: sergey2b ЮАР  
Дата: 08.09.23 03:28
Оценка:
Здравствуйте, Conductor, Вы писали:

привет

я собрал gstreamer с vaapi support при помощи cerbero
и несколько тестов отработало нормально

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

FROM ubuntu:22.04
# cerbero needs python 2.7.*

ENV TZ=America/Los_Angeles
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt-get update && apt-get install -y \
    --no-install-recommends \
    git \
    wget \
    python3-distro \
    software-properties-common \
#    python-software-properties \
    yasm \
    python-setuptools \
    sudo 
# create the ubuntu user
RUN addgroup --system ubuntu \
    && adduser --system --shell /bin/bash --gecos 'ubuntu' \
       --uid 1000 --disabled-password --home /home/ubuntu ubuntu \
    && adduser ubuntu sudo \
    && echo ubuntu:ubuntu | chpasswd \
    && echo "ubuntu ALL=NOPASSWD:ALL" >> /etc/sudoers

USER ubuntu
ENV HOME /home/ubuntu
RUN mkdir -p /home/ubuntu/cerbero/
WORKDIR /home/ubuntu/cerbero/

# Git config is needed so that cerbero can cleanly fetch some git repos
RUN git config --global user.email "you@example.com"
RUN git config --global user.name "Your Name"

# # build gstreamer 1.0 from cerbero source
# # the build commands are split so that docker can resume in case of errors
RUN git clone --depth 1 git://anongit.freedesktop.org/gstreamer/cerbero .
# hack: to pass "-y" argument to apt-get install launched by "cerbero bootstrap"
RUN sed -i 's/apt-get install/apt-get install -y/g' ./cerbero/bootstrap/linux.py
RUN ./cerbero-uninstalled bootstrap
#RUN ./cerbero-uninstalled bootstrap \
#    && ./cerbero-uninstalled build glib \
#    bison \
#    gstreamer-1.0 \
#    gst-plugins-base-1.0 \
#    gst-plugins-good-1.0  \
#    gst-plugins-bad-1.0 \
#    gst-plugins-ugly-1.0 \
#    gst-libav-1.0 \
#    json-glib \
#    && rm -rf ./build/sources/*

CMD ./cerbero-uninstalled shell


на строке RUN ./cerbero-uninstalled bootstrap возникает вот такая ошибка

153.9 -----> Installing Rust toolchain so cargo-c.recipe can fetch deps
153.9 verbose: creating home directory: '/home/ubuntu/cerbero/build/rust/rustup'
153.9 info: profile set to 'minimal'
153.9 info: setting default host triple to x86_64-unknown-linux-gnu
153.9 verbose: creating update-hash directory: '/home/ubuntu/cerbero/build/rust/rustup/update-hashes'
153.9 verbose: installing toolchain 'stable-x86_64-unknown-linux-gnu'
153.9 verbose: toolchain directory: '/home/ubuntu/cerbero/build/rust/rustup/toolchains/stable-x86_64-unknown-linux-gnu'
153.9 info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
153.9 verbose: creating temp root: /home/ubuntu/cerbero/build/rust/rustup/tmp
153.9 verbose: creating temp file: /home/ubuntu/cerbero/build/rust/rustup/tmp/vn5l777ep0wy3jhb_file
153.9 verbose: downloading file from: 'file:///home/ubuntu/.cache/cerbero-sources/dist/channel-rust-stable.toml.sha256'
153.9 verbose: downloading with reqwest
153.9 verbose: deleted temp file: /home/ubuntu/cerbero/build/rust/rustup/tmp/vn5l777ep0wy3jhb_file
153.9 verbose: creating temp file: /home/ubuntu/cerbero/build/rust/rustup/tmp/3t3t9h27tfzan4ed_file.toml
153.9 verbose: downloading file from: 'file:///home/ubuntu/.cache/cerbero-sources/dist/channel-rust-stable.toml'
153.9 verbose: downloading with reqwest
154.0 verbose: checksum passed
154.0 verbose: deleted temp file: /home/ubuntu/cerbero/build/rust/rustup/tmp/3t3t9h27tfzan4ed_file.toml
154.0 info: latest update on 2023-08-24, rust version 1.72.0 (5680fa18f 2023-08-23)
154.0 info: downloading component 'cargo'
154.0 verbose: creating Download Directory directory: '/home/ubuntu/cerbero/build/rust/rustup/downloads'
154.0 verbose: downloading file from: 'file:///home/ubuntu/.cache/cerbero-sources/dist/2023-08-24/cargo-1.72.0-x86_64-unknown-linux-gnu.tar.xz'
154.0 verbose: downloading with reqwest
154.1 verbose: checksum passed
154.1 info: downloading component 'rust-std'
154.1 verbose: downloading file from: 'file:///home/ubuntu/.cache/cerbero-sources/dist/2023-08-24/rust-std-1.72.0-x86_64-unknown-linux-gnu.tar.xz'
154.1 verbose: downloading with reqwest
154.3 verbose: checksum passed
154.3 info: downloading component 'rustc'
154.3 verbose: downloading file from: 'file:///home/ubuntu/.cache/cerbero-sources/dist/2023-08-24/rustc-1.72.0-x86_64-unknown-linux-gnu.tar.xz'
154.3 verbose: downloading with reqwest
154.8 verbose: checksum passed
154.8 info: installing component 'cargo'
154.8 verbose: creating temp directory: /home/ubuntu/cerbero/build/rust/rustup/tmp/f14ws9svkw8poyv1_dir
155.6 verbose: deleted temp directory: /home/ubuntu/cerbero/build/rust/rustup/tmp/f14ws9svkw8poyv1_dir
155.6 info: installing component 'rust-std'
155.6 verbose: creating temp directory: /home/ubuntu/cerbero/build/rust/rustup/tmp/kac96gawudcaq8en_dir
157.9 verbose: creating temp file: /home/ubuntu/cerbero/build/rust/rustup/tmp/jswk94h_np38yi17_file
157.9 verbose: creating temp file: /home/ubuntu/cerbero/build/rust/rustup/tmp/eqipi009io54g7aj_file
157.9 verbose: deleted temp directory: /home/ubuntu/cerbero/build/rust/rustup/tmp/kac96gawudcaq8en_dir
157.9 info: installing component 'rustc'
157.9 verbose: creating temp directory: /home/ubuntu/cerbero/build/rust/rustup/tmp/phscxi4q5llweqqj_dir
162.9 verbose: creating temp file: /home/ubuntu/cerbero/build/rust/rustup/tmp/ziphgh_xxzg6av8v_file
162.9 verbose: creating temp file: /home/ubuntu/cerbero/build/rust/rustup/tmp/fvhtcj6izmuqt92o_file
162.9 verbose: deleted temp directory: /home/ubuntu/cerbero/build/rust/rustup/tmp/phscxi4q5llweqqj_dir
162.9 verbose: deleted temp file: /home/ubuntu/cerbero/build/rust/rustup/tmp/jswk94h_np38yi17_file
162.9 verbose: deleted temp file: /home/ubuntu/cerbero/build/rust/rustup/tmp/eqipi009io54g7aj_file
162.9 verbose: deleted temp file: /home/ubuntu/cerbero/build/rust/rustup/tmp/ziphgh_xxzg6av8v_file
162.9 verbose: deleted temp file: /home/ubuntu/cerbero/build/rust/rustup/tmp/fvhtcj6izmuqt92o_file
162.9 verbose: toolchain 'stable-x86_64-unknown-linux-gnu' installed
162.9 info: default toolchain set to 'stable-x86_64-unknown-linux-gnu'
163.0 Rust toolchain v1.72.0 installed at /home/ubuntu/cerbero/build/rust
163.0 Running command 'sudo apt-get install autotools-dev automake autoconf libtool g++ autopoint make cmake ninja-build bison flex nasm pkg-config libxv-dev libx11-dev libx11-xcb-dev libpulse-dev python3-dev gettext build-essential pkg-config libxext-dev libxi-dev x11proto-record-dev libxrender-dev libgl1-mesa-dev libxfixes-dev libxdamage-dev libxcomposite-dev libasound2-dev build-essential gperf wget libxtst-dev libxrandr-dev libglu1-mesa-dev libegl1-mesa-dev git xutils-dev intltool ccache python3-setuptools libssl-dev'
163.0 Reading package lists...
163.7 Building dependency tree...
163.9 Reading state information...
164.1 wget is already the newest version (1.21.2-2ubuntu1).
164.1 git is already the newest version (1:2.34.1-1ubuntu1.10).
164.1 The following additional packages will be installed:
164.1 alsa-topology-conf alsa-ucm-conf binutils binutils-common
164.1 binutils-x86-64-linux-gnu bzip2 cmake-data cpp cpp-11 dh-elpa-helper dirmngr
164.1 dpkg-dev emacsen-common fakeroot file fontconfig-config fonts-dejavu-core
164.1 g++-11 gcc gcc-11 gcc-11-base gettext-base gnupg gnupg-l10n gnupg-utils
164.1 gpg-agent gpg-wks-client gpg-wks-server gpgsm javascript-common
164.1 libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl
164.1 libarchive13 libasan6 libasound2 libasound2-data libasyncns0 libatomic1
164.1 libauthen-sasl-perl libbinutils libblkid-dev libbsd0 libc-dev-bin
164.1 libc-devtools libc6-dev libcc1-0 libclone-perl libcrypt-dev libctf-nobfd0
164.1 libctf0 libcurl4 libdata-dump-perl libdeflate0 libdpkg-perl libdrm-amdgpu1
164.1 libdrm-common libdrm-intel1 libdrm-nouveau2 libdrm-radeon1 libdrm2 libedit2
164.1 libegl-dev libegl-mesa0 libegl1 libencode-locale-perl libexpat1-dev
164.1 libfakeroot libffi-dev libfile-fcntllock-perl libfile-listing-perl libfl-dev
164.1 libfl2 libflac8 libfont-afm-perl libfontconfig1 libfreetype6 libgbm1
164.1 libgcc-11-dev libgd3 libgl-dev libgl1 libgl1-amber-dri libgl1-mesa-dri
164.1 libglapi-mesa libgles-dev libgles1 libgles2 libglib2.0-dev
164.1 libglib2.0-dev-bin libglu1-mesa libglvnd-core-dev libglvnd-dev libglvnd0
164.1 libglx-dev libglx-mesa0 libglx0 libgomp1 libhiredis0.14 libhtml-form-perl
164.1 libhtml-format-perl libhtml-parser-perl libhtml-tagset-perl
164.1 libhtml-tree-perl libhttp-cookies-perl libhttp-daemon-perl libhttp-date-perl
164.1 libhttp-message-perl libhttp-negotiate-perl libio-html-perl
164.1 libio-socket-ssl-perl libisl23 libitm1 libjbig0 libjpeg-turbo8 libjpeg8
164.1 libjs-jquery libjs-sphinxdoc libjs-underscore libjsoncpp25 libksba8
164.1 libllvm15 liblocale-gettext-perl liblsan0 libltdl-dev libltdl7
164.1 liblwp-mediatypes-perl liblwp-protocol-https-perl libmagic-mgc libmagic1
164.1 libmailtools-perl libmd0 libmount-dev libmpc3 libmpfr6 libnet-http-perl
164.1 libnet-smtp-ssl-perl libnet-ssleay-perl libnpth0 libnsl-dev libogg0
164.1 libopengl-dev libopengl0 libopus0 libpciaccess0 libpcre16-3 libpcre2-16-0
164.1 libpcre2-32-0 libpcre2-dev libpcre2-posix3 libpcre3-dev libpcre32-3
164.1 libpcrecpp0v5 libpng16-16 libpthread-stubs0-dev libpulse-mainloop-glib0
164.1 libpulse0 libpython3-dev libpython3.10 libpython3.10-dev libquadmath0
164.1 librhash0 libselinux1-dev libsensors-config libsensors5 libsepol-dev
164.1 libsigsegv2 libsndfile1 libstdc++-11-dev libtiff5 libtimedate-perl
164.1 libtirpc-dev libtry-tiny-perl libtsan0 libubsan1 liburi-perl libuv1
164.1 libvorbis0a libvorbisenc2 libwayland-client0 libwayland-server0 libwebp7
164.1 libwww-perl libwww-robotrules-perl libx11-6 libx11-data libx11-xcb1
164.1 libxau-dev libxau6 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0
164.1 libxcb-randr0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcb1 libxcb1-dev
164.1 libxcomposite1 libxdamage1 libxdmcp-dev libxdmcp6 libxext6 libxfixes3 libxi6
164.1 libxml-parser-perl libxpm4 libxrandr2 libxrender1 libxshmfence1 libxtst6
164.1 libxv1 libxxf86vm1 linux-libc-dev lto-disabled-list m4 manpages manpages-dev
164.1 netbase patch perl-openssl-defaults pinentry-curses python3-distutils
164.1 python3-lib2to3 python3.10-dev rpcsvc-proto ucf uuid-dev x11-common
164.1 x11proto-dev xorg-sgml-doctools xtrans-dev xz-utils zlib1g-dev
164.1 Suggested packages:
164.1 autoconf-archive gnu-standards autoconf-doc binutils-doc bison-doc bzip2-doc
164.1 distcc | icecc cmake-doc cmake-format cpp-doc gcc-11-locales
164.1 dbus-user-session pinentry-gnome3 tor debian-keyring flex-doc g++-multilib
164.1 g++-11-multilib gcc-11-doc gcc-multilib gdb gcc-doc gcc-11-multilib
164.1 gettext-doc libasprintf-dev libgettextpo-dev parcimonie xloadimage scdaemon
164.1 apache2 | lighttpd | httpd lrzip libasound2-plugins alsa-utils
164.1 libasound2-doc libdigest-hmac-perl libgssapi-perl glibc-doc bzr libgd-tools
164.1 libgirepository1.0-dev libglib2.0-doc libgdk-pixbuf2.0-bin
164.1 | libgdk-pixbuf2.0-dev libxml2-utils libtool-doc libcrypt-ssleay-perl
164.1 opus-tools pciutils pulseaudio lm-sensors libssl-doc libstdc++-11-doc
164.1 gfortran | fortran95-compiler gcj-jdk libsub-name-perl libbusiness-isbn-perl
164.1 libauthen-ntlm-perl libx11-doc libxcb-doc libxext-doc m4-doc make-doc
164.1 man-browser ed diffutils-doc pinentry-doc python-setuptools-doc
164.3 The following NEW packages will be installed:
164.3 alsa-topology-conf alsa-ucm-conf autoconf automake autopoint autotools-dev
164.3 binutils binutils-common binutils-x86-64-linux-gnu bison build-essential
164.3 bzip2 ccache cmake cmake-data cpp cpp-11 dh-elpa-helper dirmngr dpkg-dev
164.3 emacsen-common fakeroot file flex fontconfig-config fonts-dejavu-core g++
164.3 g++-11 gcc gcc-11 gcc-11-base gettext gettext-base gnupg gnupg-l10n
164.3 gnupg-utils gperf gpg-agent gpg-wks-client gpg-wks-server gpgsm intltool
164.3 javascript-common libalgorithm-diff-perl libalgorithm-diff-xs-perl
164.3 libalgorithm-merge-perl libarchive13 libasan6 libasound2 libasound2-data
164.3 libasound2-dev libasyncns0 libatomic1 libauthen-sasl-perl libbinutils
164.3 libblkid-dev libbsd0 libc-dev-bin libc-devtools libc6-dev libcc1-0
164.3 libclone-perl libcrypt-dev libctf-nobfd0 libctf0 libcurl4 libdata-dump-perl
164.3 libdeflate0 libdpkg-perl libdrm-amdgpu1 libdrm-common libdrm-intel1
164.3 libdrm-nouveau2 libdrm-radeon1 libdrm2 libedit2 libegl-dev libegl-mesa0
164.3 libegl1 libegl1-mesa-dev libencode-locale-perl libexpat1-dev libfakeroot
164.3 libffi-dev libfile-fcntllock-perl libfile-listing-perl libfl-dev libfl2
164.3 libflac8 libfont-afm-perl libfontconfig1 libfreetype6 libgbm1 libgcc-11-dev
164.3 libgd3 libgl-dev libgl1 libgl1-amber-dri libgl1-mesa-dev libgl1-mesa-dri
164.3 libglapi-mesa libgles-dev libgles1 libgles2 libglib2.0-dev
164.3 libglib2.0-dev-bin libglu1-mesa libglu1-mesa-dev libglvnd-core-dev
164.3 libglvnd-dev libglvnd0 libglx-dev libglx-mesa0 libglx0 libgomp1
164.3 libhiredis0.14 libhtml-form-perl libhtml-format-perl libhtml-parser-perl
164.3 libhtml-tagset-perl libhtml-tree-perl libhttp-cookies-perl
164.3 libhttp-daemon-perl libhttp-date-perl libhttp-message-perl
164.3 libhttp-negotiate-perl libio-html-perl libio-socket-ssl-perl libisl23
164.3 libitm1 libjbig0 libjpeg-turbo8 libjpeg8 libjs-jquery libjs-sphinxdoc
164.3 libjs-underscore libjsoncpp25 libksba8 libllvm15 liblocale-gettext-perl
164.3 liblsan0 libltdl-dev libltdl7 liblwp-mediatypes-perl
164.3 liblwp-protocol-https-perl libmagic-mgc libmagic1 libmailtools-perl libmd0
164.3 libmount-dev libmpc3 libmpfr6 libnet-http-perl libnet-smtp-ssl-perl
164.3 libnet-ssleay-perl libnpth0 libnsl-dev libogg0 libopengl-dev libopengl0
164.3 libopus0 libpciaccess0 libpcre16-3 libpcre2-16-0 libpcre2-32-0 libpcre2-dev
164.3 libpcre2-posix3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libpng16-16
164.3 libpthread-stubs0-dev libpulse-dev libpulse-mainloop-glib0 libpulse0
164.3 libpython3-dev libpython3.10 libpython3.10-dev libquadmath0 librhash0
164.3 libselinux1-dev libsensors-config libsensors5 libsepol-dev libsigsegv2
164.3 libsndfile1 libssl-dev libstdc++-11-dev libtiff5 libtimedate-perl
164.3 libtirpc-dev libtool libtry-tiny-perl libtsan0 libubsan1 liburi-perl libuv1
164.3 libvorbis0a libvorbisenc2 libwayland-client0 libwayland-server0 libwebp7
164.3 libwww-perl libwww-robotrules-perl libx11-6 libx11-data libx11-dev
164.3 libx11-xcb-dev libx11-xcb1 libxau-dev libxau6 libxcb-dri2-0 libxcb-dri3-0
164.3 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-shm0 libxcb-sync1
164.3 libxcb-xfixes0 libxcb1 libxcb1-dev libxcomposite-dev libxcomposite1
164.3 libxdamage-dev libxdamage1 libxdmcp-dev libxdmcp6 libxext-dev libxext6
164.3 libxfixes-dev libxfixes3 libxi-dev libxi6 libxml-parser-perl libxpm4
164.3 libxrandr-dev libxrandr2 libxrender-dev libxrender1 libxshmfence1
164.3 libxtst-dev libxtst6 libxv-dev libxv1 libxxf86vm1 linux-libc-dev
164.3 lto-disabled-list m4 make manpages manpages-dev nasm netbase ninja-build
164.3 patch perl-openssl-defaults pinentry-curses pkg-config python3-dev
164.3 python3-distutils python3-lib2to3 python3-setuptools python3.10-dev
164.3 rpcsvc-proto ucf uuid-dev x11-common x11proto-dev x11proto-record-dev
164.3 xorg-sgml-doctools xtrans-dev xutils-dev xz-utils zlib1g-dev
164.4 0 upgraded, 274 newly installed, 0 to remove and 0 not upgraded.
164.4 Need to get 148 MB of archives.
164.4 After this operation, 562 MB of additional disk space will be used.
164.4 Do you want to continue? [Y/n] Abort.
164.4 Traceback (most recent call last):
164.4 File "/home/ubuntu/cerbero/cerbero/utils/shell.py", line 199, in new_call
164.4 subprocess.check_call(cmd, cwd=cmd_dir, env=env,
164.4 File "/usr/lib/python3.10/subprocess.py", line 369, in check_call
164.4 raise CalledProcessError(retcode, cmd)
164.4 subprocess.CalledProcessError: Command '['sudo', 'apt-get', 'install', 'autotools-dev', 'automake', 'autoconf', 'libtool', 'g++', 'autopoint', 'make', 'cmake', 'ninja-build', 'bison', 'flex', 'nasm', 'pkg-config', 'libxv-dev', 'libx11-dev', 'libx11-xcb-dev', 'libpulse-dev', 'python3-dev', 'gettext', 'build-essential', 'pkg-config', 'libxext-dev', 'libxi-dev', 'x11proto-record-dev', 'libxrender-dev', 'libgl1-mesa-dev', 'libxfixes-dev', 'libxdamage-dev', 'libxcomposite-dev', 'libasound2-dev', 'build-essential', 'gperf', 'wget', 'libxtst-dev', 'libxrandr-dev', 'libglu1-mesa-dev', 'libegl1-mesa-dev', 'git', 'xutils-dev', 'intltool', 'ccache', 'python3-setuptools', 'libssl-dev']' returned non-zero exit status 1.
164.4
164.4 During handling of the above exception, another exception occurred:
164.4
164.4 Traceback (most recent call last):
164.4 File "/home/ubuntu/cerbero/cerbero/main.py", line 167, in run_command
164.4 res = commands.run(command, self.config, self.args)
164.4 File "/home/ubuntu/cerbero/cerbero/commands/__init__.py", line 78, in run
164.4 return _commands[command].run(config, args)
164.4 File "/home/ubuntu/cerbero/cerbero/commands/bootstrap.py", line 85, in run
164.4 run_until_complete(bootstrapper.start(jobs=args.jobs))
164.4 File "/home/ubuntu/cerbero/cerbero/utils/__init__.py", line 689, in run_until_complete
164.4 result = loop.run_until_complete(tasks)
164.4 File "/usr/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete
164.4 return future.result()
164.4 File "/home/ubuntu/cerbero/cerbero/bootstrap/linux.py", line 59, in start
164.4 shell.new_call(cmd, interactive=True)
164.4 File "/home/ubuntu/cerbero/cerbero/utils/shell.py", line 214, in new_call
164.4 raise CommandError(msg, cmd, returncode)
164.4 cerbero.errors.CommandError: Command Error: Running ['sudo', 'apt-get', 'install', 'autotools-dev', 'automake', 'autoconf', 'libtool', 'g++', 'autopoint', 'make', 'cmake', 'ninja-build', 'bison', 'flex', 'nasm', 'pkg-config', 'libxv-dev', 'libx11-dev', 'libx11-xcb-dev', 'libpulse-dev', 'python3-dev', 'gettext', 'build-essential', 'pkg-config', 'libxext-dev', 'libxi-dev', 'x11proto-record-dev', 'libxrender-dev', 'libgl1-mesa-dev', 'libxfixes-dev', 'libxdamage-dev', 'libxcomposite-dev', 'libasound2-dev', 'build-essential', 'gperf', 'wget', 'libxtst-dev', 'libxrandr-dev', 'libglu1-mesa-dev', 'libegl1-mesa-dev', 'git', 'xutils-dev', 'intltool', 'ccache', 'python3-setuptools', 'libssl-dev'] returned 1
164.4
164.4 ***** Error running 'bootstrap' command:
164.4 Command Error: Running ['sudo', 'apt-get', 'install', 'autotools-dev', 'automake', 'autoconf', 'libtool', 'g++', 'autopoint', 'make', 'cmake', 'ninja-build', 'bison', 'flex', 'nasm', 'pkg-config', 'libxv-dev', 'libx11-dev', 'libx11-xcb-dev', 'libpulse-dev', 'python3-dev', 'gettext', 'build-essential', 'pkg-config', 'libxext-dev', 'libxi-dev', 'x11proto-record-dev', 'libxrender-dev', 'libgl1-mesa-dev', 'libxfixes-dev', 'libxdamage-dev', 'libxcomposite-dev', 'libasound2-dev', 'build-essential', 'gperf', 'wget', 'libxtst-dev', 'libxrandr-dev', 'libglu1-mesa-dev', 'libegl1-mesa-dev', 'git', 'xutils-dev', 'intltool', 'ccache', 'python3-setuptools', 'libssl-dev'] returned 1
164.4
164.4 usage: cerbero-uninstalled [-h] [-t] [--list-variants] [-v VARIANTS]
164.4 [-c CONFIG] [-m MANIFEST]
164.4 [--self-update SELF_UPDATE]
164.4 {fetch-cache,gen-cache,upload-cache,genxcconfig,add-package,shell,check,wipe,graph,buildone,build-deps,build,package,edit-cache,list,list-packages,show-config,checkpackage,fetch,fetch-package,debug-packages,run,gensdkshell,genlibfiles,rdeps,add-recipe,deps,bootstrap,fetch-bootstrap,genvsprops,packageinfo,tag}
164.4 ...
------
Dockerfile:39
--------------------
37 | # hack: to pass "-y" argument to apt-get install launched by "cerbero bootstrap"
38 | RUN sed -i 's/apt-get install/apt-get install -y/g' ./cerbero/bootstrap/linux.py
39 | >>> RUN ./cerbero-uninstalled bootstrap
40 | #RUN ./cerbero-uninstalled bootstrap \
41 | # && ./cerbero-uninstalled build glib \
--------------------
ERROR: failed to solve: process "/bin/sh -c ./cerbero-uninstalled bootstrap" did not complete successfully: exit code: 1



я не смог найти как подставит N

164.4 Need to get 148 MB of archives.
164.4 After this operation, 562 MB of additional disk space will be used.
164.4 Do you want to continue? [Y/n] Abort.
164.4 Traceback (most recent call last):
Re[37]: cerbero
От: sergey2b ЮАР  
Дата: 15.09.23 19:42
Оценка:
Здравствуйте, Conductor, Вы писали:

я собрал gstreamer vaapi используя https://github.com/restreamio/docker-gstreamer
внес несколько небольших исправлений

декодер HD видео 60 fps на 12700k использует 48% GPU
Re[38]: cerbero
От: Conductor СССР  
Дата: 16.09.23 21:56
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>Здравствуйте, Conductor, Вы писали:


S>я собрал gstreamer vaapi используя https://github.com/restreamio/docker-gstreamer

S>внес несколько небольших исправлений

S>декодер HD видео 60 fps на 12700k использует 48% GPU


1 поток? 720p? Приходит h264? Декодируется для отображения? Загрузку GPU каким инструментом анализируешь, чем-нибудь типа intel-gpu-top? С общей загрузкой CPU что получилось?
48% что-то до фига.
Re[39]: cerbero
От: sergey2b ЮАР  
Дата: 16.09.23 22:45
Оценка:
Здравствуйте, Conductor, Вы писали:


S>>декодер HD видео 60 fps на 12700k использует 48% GPU


C>1 поток? 720p? Приходит h264? Декодируется для отображения? Загрузку GPU каким инструментом анализируешь, чем-нибудь типа intel-gpu-top? С общей загрузкой CPU что получилось?

C>48% что-то до фига.

примеры для тестирования придумал не я

1) gst-launch-1.0 filesrc location=/temp/test.mp4 ! qtdemux ! h264parse ! vaapih264dec ! fakesink

2) gst-launch-1.0 filesrc location=/temp/test.mp4 ! qtdemux ! h264parse ! avdec_h264 ! fakesink


один поток HD


Приходит h264? да я читаю из mp4


Декодируется для отображения?
да


Загрузку GPU каким инструментом анализируешь, чем-нибудь типа intel-gpu-top?
да им


С общей загрузкой CPU что получилось?
я сейчсас не могу посмотреть но точно была в пределах разумного 20-30%
Re[13]: Есть специалисты по gstreamer'у?
От: sergey2b ЮАР  
Дата: 19.09.23 03:44
Оценка:
Здравствуйте, Kernan, Вы писали:

если не секрет а вы где то используйте gstreamer в нагруженных приложениях

а то я почитал статью https://developer.ridgerun.com/wiki/index.php/Embedded_GStreamer_Performance_Tuning
и насторожило везде пишут что стример всего на 10 проц медленней чем ffmpeg а из статьи по сылки получаеться что разработчик прикладывает усилия что записать поток всего 30fps
Re[41]: cerbero
От: sergey2b ЮАР  
Дата: 19.09.23 16:19
Оценка:
Здравствуйте, Conductor, Вы писали:


C>Выставь sync=true, и оцени загрузку ещё раз:

C>
C>... ! fakesink sync=true
C>


получаеться 15% на один стрим
Re[42]: cerbero
От: Conductor СССР  
Дата: 20.09.23 03:38
Оценка:
Здравствуйте, sergey2b, Вы писали:

C>>Выставь sync=true, и оцени загрузку ещё раз:

C>>
C>>... ! fakesink sync=true
C>>


S>получаеться 15% на один стрим


И? Удовлетворительно в контексте задачи?
Re[43]: cerbero
От: sergey2b ЮАР  
Дата: 22.09.23 02:30
Оценка:
Здравствуйте, Conductor, Вы писали:

S>>получаеться 15% на один стрим

C>И? Удовлетворительно в контексте задачи?

спасибо за вашу помощь

у меня не очень хорошие отношения с начальником так что я не знаю
Re[43]: cerbero
От: sergey2b ЮАР  
Дата: 28.09.23 04:42
Оценка:
Здравствуйте, Conductor, Вы писали:

добрый день скажите пожалуйста как вы считаете насколько ревльно сделать на gstreamer — multivew
когда видео с 4 разных камер отображаються на одном мониторе и сохраняеться в mp4
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.