LINUX.ORG.RU

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

 , ,


0

1

Приветствую

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

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

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

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

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

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

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

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

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

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

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

вообще конечно извините не сказал, у меня арм7

# vainfo
error: XDG_RUNTIME_DIR not set in the environment.
error: can't connect to X server!
libva info: VA-API version 0.39.0
libva info: va_getDriverName() returns -1
libva error: va_getDriverName() failed with unknown libva error,driver_name=(null)
vaInitialize failed with error code -1 (unknown libva error),exit

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

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

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

там все старье 8 летней давности, я с кодированием то кое как разобрался лохматых готов cedrus поднять в ффмпег (и то на будущее и поэтому ффмпег апи разбираю), где то было еще в том же месте про vdpau, но пока хотелось бы на 4 ядрах временно ШТАТНО максимально эффективно перекодировать иба СОФТОВОЕ кодирование по скорости и загрузке цпу в целом сойдет, за счет Р кадров в х264 существенно снижающие трафик

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

да и у него нету мжпега декодера для вдпау (

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

Это правильное направление, mjpeg это просто серия jpeg’ов, их тоже уже лет 20 хардварно преобразовывают

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

20 лет хардварно декодируют на видяхах, но не на арм же… наверное что то есть для расбери, но у меня нанопи, вопщим нужно найти другой путь покамесь

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

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

https://linux-sunxi.org/images/4/4b/Allwinner_H3_Datasheet_V1.2.pdf

Graphics: ARM Mali400MP2 graphics acceleration provides mobile users with superior experience in web browsing, video playback and gaming effects; OpenGL ES2.0 ,OpenVG1.1 standards are supported.

Video Engine: H3 provides almost full motion playback of up to 1080P high-definition video, and supports H.265 decoder by 4K@30fps , H.264 decoder by 1080p@60fps, MPEG1/2/4 decoder by 1080p@60fps, VP8/AVS jizhun decoder by 1080p@60fps, VC1decoder by 1080p@30fps, H.264 encoder by 1080p@30fps with dedicated hardware

хотя не ясно что они тут имеют в виду

H.264 encoder by 1080p@30fps with dedicated hardware

о, там развёрнуто есть

2.1.6.1. Video Decoding, Support multi-format video playback, including:

  • H.265:1080p@60fps,4K@30fps
  • H.264:1080p@60fps
  • MPEG1/2/4:1080p@60fps
  • VP8:1080p@60fps
  • VC1:1080p@30fps
  • AVS jizhun: 1080p@60fps
  • MJPEG:1080p@30fps
    Support 3D size:3840x1080,1920x2160

2.1.6.2. Video Encoding

  • Support H.264 video encoding up to 1080p@30fps
  • Support input picture size up to 4800x4800
  • Support input format: tiled (128x32)/YU12/YV12/NU12/NV12/ARGB/YUYV
  • Support Alpha blending
  • Support thumb generation
  • Support 4x2 scaling ratio: from 1/16 to 64 arbitrary non-integer ratio
  • Support rotated inpu
sparks ★★★★
()
Последнее исправление: sparks (всего исправлений: 1)
Ответ на: комментарий от sparks

в самом Н3 конечно есть гпу, /dev/cedar_dev в DTB/DTS я включил, чтобы потом натянуть аппаратный кодек cedrus от древней версии ффмпега, НО он реализован только для кодирования х264, а не декодирования мжпег

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

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

сделал замеры на 2х разрешениях

640х480

Time decode: 12.37 scale: 37.52 encode: 16.02 transcode: 66.37 ms

1920х1080

Тime decode: 74.07 scale: 176.45 encode: 15.24 transcode: 266.18 ms

Да декодирование 2Мп становится тяжелее, НО как я и ожидал в абсолютных величинах проблема в SWS_SCALE !

wolverin ★★★
() автор топика
2 сентября 2022 г.
Ответ на: комментарий от wolverin

вопщим проблему SWS_SCALE решил, заменив его на AVFilterContext, который многопоточный

а вот с декодированием мжпег проблема, в ффмпеге декодер однопоточный!

wolverin ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.