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

При рендеринге камеры в реальном времени я использую ffmpeg для одновременной обработки большого видеофайла (например, 4G или даже больше). Я заметил, что видеокадры буферизуются и заикаются.

Трубопровод:

DISPLAY=:0 gst-launch-1.0 filesrc location=/home/user/jellyfish-120-mbps-4k-uhd-hevc-10bit.mkv ! matroskademux name=demux demux.video_0 ! queue ! h265parse ! nvv4l2decoder ! nvvidconv ! xvimagesink

Команда FFmpeg:

ffmpeg -i ${file_name} -c copy -f segment -segment_time 600 -segment_format_options movflags=+faststart -reset_timestamps 1 ./${file_name}_%02d.mp4 -y

И есть некоторые предупреждения, указывающие на то, что «много буферов отбрасывается», продолжительность заикания. Картинка с предупреждением о трубопроводе

Требование можно резюмировать так: «рендеринг видео в реальном времени имеет более высокий приоритет, и приемлема низкая скорость обработки больших файлов». Есть ли какие-либо возможные решения этой проблемы с вашей точки зрения? Заранее спасибо.

@Anonymous Coward Ссылка, которую вы упомянули, только что была задана мной, лол. Этот более конкретный, я хочу изучить ответы как с теоретической, так и с практической точки зрения.

TIANYU HU 20.04.2023 12:06

Как поясняется тегом ffmpeg: Только вопросы о программном использовании библиотек, API или инструментов FFmpeg относятся к теме. Вопросы об интерактивном использовании инструмента командной строки следует задавать на superuser.com или video.stackexchange.com.

Rob 21.04.2023 10:19

@Rob Спасибо, что сообщили мне об этом объяснении, никогда раньше этого не замечал.

TIANYU HU 21.04.2023 10:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  1. уменьшите разрешение, которое выводится в любом процессе, до SD или HD, поскольку разрешение 4K требует очень больших ресурсов

  2. в вашем ffmpeg cmd добавьте флаг -re перед флагом -i, который заставит ffmpeg читать файл с его фактической частотой кадров и соответствующим образом кодировать, но недостатком этого является то, что если ваш файл длится 1 час, то для кодирования потребуется около 1 часа но это резко сократит использование процессора / графического процессора, что, в свою очередь, позволит вашему gst-конвейеру использовать как можно больше ресурсов.

PS также попробуйте сначала увеличить приоритет процесса вашего gst-конвейера либо в системном мониторе/диспетчере задач, либо с помощью nice (только для Linux), но опять же это может замедлить работу вашего ffmpeg.

надеюсь, я смог помочь

Ах, на самом деле конвейер и ffmpeg cmd, о которых я упоминал выше, просто воспроизводят эту проблему, настоящие слишком сложны, чтобы их объяснять. Таким образом, их параметры не могут быть изменены. Я бы попробовал использовать nice или ionice, чтобы понизить приоритет ffmpeg. Спасибо за помощь!! @CodeCalf

TIANYU HU 21.04.2023 08:31

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

CodeCalf 21.04.2023 09:00

да, я заметил, что есть процесс с именем kswapd0, что означает, что в то время ОС нужно было обмениваться страницами между оперативной памятью и диском, верно? И недавно я запутался в глубинной причине, почему кадры камеры отстают, когда большой файл обрабатывается ffmpeg, это вызвано «отсутствием доступной свободной памяти» или «все буферы (в пользовательском пространстве или ядре) в этот момент заняты ffmpeg "?

TIANYU HU 21.04.2023 11:13

По сути, когда ваша оперативная память заполнена, тогда подкачка - это ваша оперативная память, поэтому проблема чтения процессором из подкачки чертовски медленная, даже если у вас есть диск nvme ... это всегда нехватка свободной памяти никогда не было проблем с буфером, никогда не приходилось даже увеличьте значения ОС по умолчанию, за исключением, возможно, буферов UDP, когда у меня было около 200 каналов живого транскодирования одновременно ... Но вы также декодируете в 4k, что может привести к проблеме с буфером, но не только с 2 или 3 потоками, вам придется по крайней мере коснуться 8 потоков, прежде чем такое бывает я думаю

CodeCalf 21.04.2023 12:01

спасибо, это действительно вдохновляет! Страницы, сгенерированные ffmpeg, помечаются как грязные страницы в памяти, а затем записываются обратно на жесткий диск. Таким образом, если грязные страницы ffmpeg заполняют всю доступную память в этот момент, другие процессы могут быть не в состоянии получить свободную память, что может привести к их зависанию. Поэтому я глубоко подозреваю, что причина задержки рендеринга камеры связана с нехваткой доступной памяти для хранения видеоданных, предоставляемых базовым драйвером камеры. Это правильно @CodeCalf?

TIANYU HU 23.04.2023 05:21

Практически любое перекодирование/декодирование видео сильно зависит от оперативной памяти, поскольку ему требуется достаточно высокая пропускная способность для кодирования/декодирования и одновременной отправки кадра вперед. Это происходит не менее 25 раз в секунду, если не больше, в зависимости от частоты кадров видео, поэтому представьте себе потребность в памяти с низкой задержкой и высокой пропускной способностью, особенно если вы используете аппаратное ускорение, поскольку процессору необходимо копировать данные из оперативной памяти в видеопамять графического процессора, чтобы перенести работу на графический процессор, поэтому он также использует довольно много оперативной памяти в зависимости от буфера размеры, которые вы установили

CodeCalf 23.04.2023 09:32

Кроме того, это следует из того, что у вас достаточно ресурсов для обработки, так как если ваш процессор используется более чем на 85%, это создаст аналогичные проблемы, такие как заикание и общая нестабильность.

CodeCalf 23.04.2023 09:39

Другие вопросы по теме