У меня проблема с созданием конвейера в GStreamer.
Мой конвейер выглядит так:
gst-launch-1.0 videotestsrc is-live=true ! videorate ! video/x-raw,framerate=200/1 ! videorate max-rate=50 ! videoconvert ! x264enc bitrate=500000 byte-stream=true ! h264parse ! rtph264pay mtu=1400 ! udpsink host=127.0.0.1 port=5000 sync=false async=true
На данный момент я оптимизирую конвейер для приложения.Таким образом, вместо videotestsrc
в конвейере будет appsrc
, который получает кадры из приложения, которое возвращает кадры.Каждый раз, когда appsrc
запрашивает фрейм, приложение возвращает его.Камера имеет около 50 кадров в секунду.
Я помогу объяснить с изображением:
Серая линия означает время.Допустим, камера отправляет кадр каждые 20 мс (50 кадров в секунду) (красные точки), а appsrc
- каждые 20 мс, но всегда запрашивает 1 мс, прежде чем камера создаст новый кадр (синие точки).Это сгенерирует задержку в 19 мс, которую я пытаюсь уменьшить до минимума.
Моя идея - использовать videorate ! video/x-raw,framerate=200/1
, чтобы источник запрашивал новый кадр каждые 5 мс, что означает, что синяя точка будетБыть в 4 раза быстрее, чем камера, получающая новые кадры, что означает, что 4 кадра будут равны.После получения этих «новейших» кадров я хочу ( без кодировки ) ограничить частоту кадров до 50 кадров в секунду, используя videorate max-rate=50
.
Проблема в том, что мой конвейер не работает в приложении;даже не как команда терминала gst-launch-1.0
.
Как я могу дважды контролировать частоту кадров в одном конвейере?Есть ли другое решение?