FFMPEG
-
- professor
- Сообщения: 3564
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 57 раз
- Поблагодарили: 191 раз
- Контактная информация:
-
IvanLis
- guru
- Сообщения: 5561
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 32 раза
- Поблагодарили: 108 раз
Re: FFMPEG
Лет 10 назад под Linux использовал, но только для раскадровки фрагментов и обратной склейки, а также перекодировки в другой формат.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- beginner
- Сообщения: 12
- Зарегистрирован: 23 янв 2025, 15:12
- Версия LabVIEW: 21
- Благодарил (а): 4 раза
- Контактная информация:
Re: FFMPEG
Ну да, я таким же образом получаю изображение, правда, от двух телекамер.
Ранее через RTSP вполне можно было MJPEG поток получать, но вот нынче все больше MPEG в ходу вот и пришлось FFMPEG применить.
Не получилось FullHD картинку получить, но пока хватает HD.
Так вот у меня в чем проблема:
если телекамера в коннекте, то проблем никаких не возникает.
Если же нет связи с телекамерой, то задача захвата картинки зависает навсегда в своем цикле.
Полагаю, что это следствие не получения FFMPEG данных от телекамеры.
Тут бы как-то убивать этот процесс и запускать снова, но способа не нашел.
Подскажите решение, пожалуйста.
-
IvanLis
- guru
- Сообщения: 5561
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 32 раза
- Поблагодарили: 108 раз
Re: FFMPEG
Судя по скрину со страницы: https://forums.ni.com/t5/Example-Code/F ... -p/3515713
http://forums.ni.com/legacyfs/online/19 ... 20file.png

Видимо нужно в процесс "q" передать, сам не проверял.
Посмотрите как у них остановка программы реализована.
Но странно, а когда вы программу останавливаете, процесс автоматом убивается или продолжает висеть в памяти?
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- beginner
- Сообщения: 12
- Зарегистрирован: 23 янв 2025, 15:12
- Версия LabVIEW: 21
- Благодарил (а): 4 раза
- Контактная информация:
-
- beginner
- Сообщения: 12
- Зарегистрирован: 23 янв 2025, 15:12
- Версия LabVIEW: 21
- Благодарил (а): 4 раза
- Контактная информация:
Re: FFMPEG
Приложил картинку с подпрограммой получения изображения, которая в свою очередь вложена в цикл.Видимо нужно в процесс "q" передать, сам не проверял.
Посмотрите как у них остановка программы реализована.
Так вот, когда изначально телекамера не подключена или при разрыве соединения с телекамерой LabVIEW ожидает данных от FFMPEG, а их нет.
И я не вижу способа, как прервать это ожидание данных.
Я делал параллельный цикл, который отслеживал получение массива изображения, но опять же все упирается данных-то нет.
-
dadreamer
- professor
- Сообщения: 3961
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2024
- Благодарил (а): 13 раз
- Поблагодарили: 138 раз
- Контактная информация:
Re: FFMPEG
Вообще, вместо блокирующего чтения тут чтение с таймаутом напрашивается. У потока есть свойство Stream.ReadTimeout, можно попробовать выставить там какое-то значение перед входом в цикл. Или же использовать токен отмены операции вместе с методом ReadAsync(Byte[], Int32, Int32, CancellationToken). Токен надо будет активировать при выходе из программы, тогда цикл чтения данных с камеры должен прерваться. Но мне этим пользоваться не доводилось.
-
- doctor
- Сообщения: 2259
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 33 раза
- Поблагодарили: 32 раза
Re: FFMPEG
Я дошел до того, что брал ID процесса и делал ему kill. Остановился на этом, как на быстром и надежном варианте.
-
- beginner
- Сообщения: 12
- Зарегистрирован: 23 янв 2025, 15:12
- Версия LabVIEW: 21
- Благодарил (а): 4 раза
- Контактная информация:
Re: FFMPEG
Нет, чтение с таймаутом организовать не получается - нет у этого потока такого свойства CanReadTimeOut = False.dadreamer писал(а): ↑25 янв 2025, 21:35Вообще, вместо блокирующего чтения тут чтение с таймаутом напрашивается. У потока есть свойство Stream.ReadTimeout, можно попробовать выставить там какое-то значение перед входом в цикл. Или же использовать токен отмены операции вместе с методом ReadAsync(Byte[], Int32, Int32, CancellationToken). Токен надо будет активировать при выходе из программы, тогда цикл чтения данных с камеры должен прерваться. Но мне этим пользоваться не доводилось.
Попробую с токеном.
-
- beginner
- Сообщения: 12
- Зарегистрирован: 23 янв 2025, 15:12
- Версия LabVIEW: 21
- Благодарил (а): 4 раза
- Контактная информация:
Re: FFMPEG
Это хороший вариант.
Как мне понять, что получения данных от FFMPEG нет, если цикл стоит ?
-
IvanLis
- guru
- Сообщения: 5561
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 32 раза
- Поблагодарили: 108 раз
Re: FFMPEG
Параллельный цикл создайте (WatchDog), который будет отслеживать получение данных и принимать решение, что данных нет.
В основном цикле и при каждом кадра сбрасывайте WatchDog.
Если WatchDog принял решение, то процесс убивается.
А Вы эти (FFMPEG scripting in LabVIEW (.NET)) наработки используете у себя?
Я не устанавливал у себя, но судя по скринам, там обратный вызовов пользуется.
Вам проще будет контролировать программу обрабатывая событие (кадр пришел), нежели ждать его, блокируя основной поток.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- beginner
- Сообщения: 12
- Зарегистрирован: 23 янв 2025, 15:12
- Версия LabVIEW: 21
- Благодарил (а): 4 раза
- Контактная информация:
Re: FFMPEG
IvanLis писал(а): ↑26 янв 2025, 19:14
Параллельный цикл создайте (WatchDog), который будет отслеживать получение данных и принимать решение, что данных нет.
В основном цикле и при каждом кадра сбрасывайте WatchDog.
Если WatchDog принял решение, то процесс убивается.
А Вы эти (FFMPEG scripting in LabVIEW (.NET)) наработки используете у себя?
Я не устанавливал у себя, но судя по скринам, там обратный вызовов пользуется.
Вам проще будет контролировать программу обрабатывая событие (кадр пришел), нежели ждать его, блокируя основной поток.
Чего я хочу добиться:
чтобы при разрыве соединения и телекамерой и при последующем его восстановлении программа восстанавливала обработку картинки.
Сейчас же в случае запуска программы при неподключенной телекамере FFMPEG не запускается (по крайней мере в диспетчере задач не отображается),
но и моя программа не получает никаких сообщений.
В случае разрыва соединения на продолжительное время, допустим, на пару минут, FFMPEG остается в панели задач, но и в этом случае моя программа не получает никаких сообщений.
При восстановлении соединения работоспособность программы не восстанавливается.
Параллельный цикл (WatchDog) я создавал, но отследить получение данных не получается в обоих случаях - цикл получения данных-то останавливается.
Надеюсь на помощь в решении этой задачи.
VI приложил.
FFMPEG должен быть в своей папке.
И да, наработки именно с того форума я использую.
Оттуда же получил первичную информацию по получению MJPEG от телекамер, в итоге прямо конвертирую строку JPEG в Image Control ))
Вопрос по терминологии: что такое обратный вызов ?
- Вложения
-
Try.rar
- (1.08 МБ) 6 скачиваний
-
IvanLis
- guru
- Сообщения: 5561
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 32 раза
- Поблагодарили: 108 раз
Re: FFMPEG
У меня нет камеры, да наверное не много людей на форуме, у кого она под руками.
У меня нет LV2021, я "старпер" и до сих пор работаю в LV2015 и пока не вижу крайней необходимости обновляться. В принципе у меня система Win7 32bit.
По этому могу только рекомендовать, как бы делал я.
1. Запускаем окно (процесс) main. В нем создаем цикл обработки (событийно-управляемый автомат). Регистрируем для обработки UserEvent: IsStop (событие остановки процесса CamReader) и IsFrame (событие получения кадра от CamReader). Туда добавляем TimeOut Event (выполняет роль WatchDog) например на 1000ms.
2. main запускает процесс CamReader (реентерабельный), который осуществляет все взаимодействие с камерой. Он к ней подключается и в цикле читает информацию, если пришел кадр, то отправляет в main (User Event - IsFrame). Если ошибка/исключение/вылет из цикла и т.д. отправляет в main (User Event - IsStop).
3. main постоянно контролирует, запущен ли процесс CamReader и если нет ("упал" - получено событие IsStop), то запускает другой экземпляр, а старый по возможности "убивает".
4. Если в течении 1сек от процесса CamReader нет данных, то считаем его "упавшим", убиваем и запускаем новый.
5. При остановке main, "убиваем" CamReader.
Т.е. у Вас фактически один процесс CamReader всегда работает и пытается подключиться к камере. Если подключился, то получает данные и перекидывает в main. Если подключиться не смог или данных нет, то процесс убивается и запускается новый, у которого есть 1 сек, что бы наладить связь с камерой. Если у него не получилось, то следующий.
Как то так .....
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...