FFMPEG

Обсуждение вопросов, связанных с обработкой аудио и видео информации
Schiblev
beginner
beginner
Сообщения: 12
Зарегистрирован: 23 янв 2025, 15:12
Версия LabVIEW: 21
Благодарил (а): 4 раза
Контактная информация:

FFMPEG

Сообщение Schiblev »

Здравствуйте!

Есть ли у кого опыт использования FFMPEG в среде LabVIEW ?
Artem.spb

Activity Автор
professor
professor
Сообщения: 3564
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 57 раз
Поблагодарили: 191 раз
Контактная информация:

Re: FFMPEG

Сообщение Artem.spb »

Schiblev писал(а): 23 янв 2025, 15:51 Есть ли у кого опыт использования FFMPEG в среде LabVIEW ?
Как, для чего?
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5561
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 32 раза
Поблагодарили: 108 раз

Re: FFMPEG

Сообщение IvanLis »

Schiblev писал(а): 23 янв 2025, 15:51 Здравствуйте!

Есть ли у кого опыт использования FFMPEG в среде LabVIEW ?
Лет 10 назад под Linux использовал, но только для раскадровки фрагментов и обратной склейки, а также перекодировки в другой формат.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2259
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 33 раза
Поблагодарили: 32 раза

Re: FFMPEG

Сообщение Borjomy_1 »

Мы с ним работали для получения изображения с камеры через rtsp и сжатия потока в файл
Schiblev
beginner
beginner
Сообщения: 12
Зарегистрирован: 23 янв 2025, 15:12
Версия LabVIEW: 21
Благодарил (а): 4 раза
Контактная информация:

Re: FFMPEG

Сообщение Schiblev »

Borjomy_1 писал(а): 25 янв 2025, 10:53 Мы с ним работали для получения изображения с камеры через rtsp и сжатия потока в файл
Ну да, я таким же образом получаю изображение, правда, от двух телекамер.
Ранее через RTSP вполне можно было MJPEG поток получать, но вот нынче все больше MPEG в ходу вот и пришлось FFMPEG применить.
Не получилось FullHD картинку получить, но пока хватает HD.

Так вот у меня в чем проблема:
если телекамера в коннекте, то проблем никаких не возникает.
Если же нет связи с телекамерой, то задача захвата картинки зависает навсегда в своем цикле.
Полагаю, что это следствие не получения FFMPEG данных от телекамеры.
Тут бы как-то убивать этот процесс и запускать снова, но способа не нашел.
Подскажите решение, пожалуйста.
Вложения
Квартинка 2.png
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5561
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 32 раза
Поблагодарили: 108 раз

Re: FFMPEG

Сообщение IvanLis »

Schiblev писал(а): 25 янв 2025, 14:17 Тут бы как-то убивать этот процесс и запускать снова, но способа не нашел.
Подскажите решение, пожалуйста.
Судя по скрину со страницы: https://forums.ni.com/t5/Example-Code/F ... -p/3515713
http://forums.ni.com/legacyfs/online/19 ... 20file.png
Изображение

Видимо нужно в процесс "q" передать, сам не проверял.
Посмотрите как у них остановка программы реализована.

Но странно, а когда вы программу останавливаете, процесс автоматом убивается или продолжает висеть в памяти?
Schiblev
beginner
beginner
Сообщения: 12
Зарегистрирован: 23 янв 2025, 15:12
Версия LabVIEW: 21
Благодарил (а): 4 раза
Контактная информация:

Re: FFMPEG

Сообщение Schiblev »

IvanLis писал(а): 25 янв 2025, 16:34 Но странно, а когда вы программу останавливаете, процесс автоматом убивается или продолжает висеть в памяти?
При завершении программы процесс убивается.
Вложения
Завершение.png
Schiblev
beginner
beginner
Сообщения: 12
Зарегистрирован: 23 янв 2025, 15:12
Версия LabVIEW: 21
Благодарил (а): 4 раза
Контактная информация:

Re: FFMPEG

Сообщение Schiblev »

Видимо нужно в процесс "q" передать, сам не проверял.
Посмотрите как у них остановка программы реализована.
Приложил картинку с подпрограммой получения изображения, которая в свою очередь вложена в цикл.

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

Я делал параллельный цикл, который отслеживал получение массива изображения, но опять же все упирается данных-то нет.
Вложения
Цикл чтения.png
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3961
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2024
Благодарил (а): 13 раз
Поблагодарили: 138 раз
Контактная информация:

Re: FFMPEG

Сообщение dadreamer »

Schiblev писал(а): 25 янв 2025, 18:48Я делал параллельный цикл, который отслеживал получение массива изображения, но опять же все упирается данных-то нет.
Вообще, вместо блокирующего чтения тут чтение с таймаутом напрашивается. У потока есть свойство Stream.ReadTimeout, можно попробовать выставить там какое-то значение перед входом в цикл. Или же использовать токен отмены операции вместе с методом ReadAsync(Byte[], Int32, Int32, CancellationToken). Токен надо будет активировать при выходе из программы, тогда цикл чтения данных с камеры должен прерваться. Но мне этим пользоваться не доводилось.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2259
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 33 раза
Поблагодарили: 32 раза

Re: FFMPEG

Сообщение Borjomy_1 »

Я дошел до того, что брал ID процесса и делал ему kill. Остановился на этом, как на быстром и надежном варианте.
Schiblev
beginner
beginner
Сообщения: 12
Зарегистрирован: 23 янв 2025, 15:12
Версия LabVIEW: 21
Благодарил (а): 4 раза
Контактная информация:

Re: FFMPEG

Сообщение Schiblev »

dadreamer писал(а): 25 янв 2025, 21:35
Schiblev писал(а): 25 янв 2025, 18:48Я делал параллельный цикл, который отслеживал получение массива изображения, но опять же все упирается данных-то нет.
Вообще, вместо блокирующего чтения тут чтение с таймаутом напрашивается. У потока есть свойство Stream.ReadTimeout, можно попробовать выставить там какое-то значение перед входом в цикл. Или же использовать токен отмены операции вместе с методом ReadAsync(Byte[], Int32, Int32, CancellationToken). Токен надо будет активировать при выходе из программы, тогда цикл чтения данных с камеры должен прерваться. Но мне этим пользоваться не доводилось.
Нет, чтение с таймаутом организовать не получается - нет у этого потока такого свойства CanReadTimeOut = False.
Попробую с токеном.
Schiblev
beginner
beginner
Сообщения: 12
Зарегистрирован: 23 янв 2025, 15:12
Версия LabVIEW: 21
Благодарил (а): 4 раза
Контактная информация:

Re: FFMPEG

Сообщение Schiblev »

Borjomy_1 писал(а): 26 янв 2025, 10:32 Я дошел до того, что брал ID процесса и делал ему kill. Остановился на этом, как на быстром и надежном варианте.
Это хороший вариант.
Как мне понять, что получения данных от FFMPEG нет, если цикл стоит ?
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5561
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 32 раза
Поблагодарили: 108 раз

Re: FFMPEG

Сообщение IvanLis »

Schiblev писал(а): 26 янв 2025, 11:08 Как мне понять, что получения данных от FFMPEG нет, если цикл стоит ?
Schiblev писал(а): 26 янв 2025, 11:08 Как мне понять, что получения данных от FFMPEG нет, если цикл стоит ?
Параллельный цикл создайте (WatchDog), который будет отслеживать получение данных и принимать решение, что данных нет.
В основном цикле и при каждом кадра сбрасывайте WatchDog.
Если WatchDog принял решение, то процесс убивается.


А Вы эти (FFMPEG scripting in LabVIEW (.NET)) наработки используете у себя?
Я не устанавливал у себя, но судя по скринам, там обратный вызовов пользуется.
Вам проще будет контролировать программу обрабатывая событие (кадр пришел), нежели ждать его, блокируя основной поток.
Schiblev
beginner
beginner
Сообщения: 12
Зарегистрирован: 23 янв 2025, 15:12
Версия LabVIEW: 21
Благодарил (а): 4 раза
Контактная информация:

Re: FFMPEG

Сообщение Schiblev »

IvanLis писал(а): 26 янв 2025, 19:14
Schiblev писал(а): 26 янв 2025, 11:08 Как мне понять, что получения данных от FFMPEG нет, если цикл стоит ?

Параллельный цикл создайте (WatchDog), который будет отслеживать получение данных и принимать решение, что данных нет.
В основном цикле и при каждом кадра сбрасывайте WatchDog.
Если WatchDog принял решение, то процесс убивается.


А Вы эти (FFMPEG scripting in LabVIEW (.NET)) наработки используете у себя?
Я не устанавливал у себя, но судя по скринам, там обратный вызовов пользуется.
Вам проще будет контролировать программу обрабатывая событие (кадр пришел), нежели ждать его, блокируя основной поток.

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

В случае разрыва соединения на продолжительное время, допустим, на пару минут, FFMPEG остается в панели задач, но и в этом случае моя программа не получает никаких сообщений.
При восстановлении соединения работоспособность программы не восстанавливается.

Параллельный цикл (WatchDog) я создавал, но отследить получение данных не получается в обоих случаях - цикл получения данных-то останавливается.

Надеюсь на помощь в решении этой задачи.

VI приложил.
FFMPEG должен быть в своей папке.

И да, наработки именно с того форума я использую.
Оттуда же получил первичную информацию по получению MJPEG от телекамер, в итоге прямо конвертирую строку JPEG в Image Control ))
Вопрос по терминологии: что такое обратный вызов ?
Вложения
Try.rar
(1.08 МБ) 6 скачиваний
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5561
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 32 раза
Поблагодарили: 108 раз

Re: FFMPEG

Сообщение IvanLis »

Schiblev писал(а): 27 янв 2025, 17:40 Параллельный цикл (WatchDog) я создавал, но отследить получение данных не получается в обоих случаях - цикл получения данных-то останавливается.
У меня нет камеры, да наверное не много людей на форуме, у кого она под руками.
У меня нет 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 сек, что бы наладить связь с камерой. Если у него не получилось, то следующий.

Как то так .....
Ответить

Вернуться в «Работа с графикой и звуком»