У меня есть IP-камера, и я получаю снимки с этой IP-камеры в формате JPEG. Это в среднем около 10 кадров в секунду.

В настоящее время я вызываю [web method] в моем настольном приложении c # для загрузки JPEG (преобразованного в байтовый массив). Там на сервере Пользователь может просматривать эти изображения в виде видеопотока. Это хорошо работает. На стороне клиента использование оперативной памяти растет довольно высоко.

Если я смогу каким-то образом закодировать изображения JPEG с помощью ffmpeg, то объем данных будет уменьшен (я полагаю).

Или есть способ взять поток байтов из входящих файлов JPEG и каким-то образом перенаправить на сервер, где я мог бы запустить другой процесс ffmpeg, ожидающий принятия этого потока и сохранения потока изображений в отдельных изображениях?

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

1 ответ1

2

Если вы не используете в своем коде API-интерфейсы FFmpeg, вы также можете вызвать ffmpeg для вывода всего, что вы хотите, в виде необработанного потока данных. Например:

ffmpeg -i input -c:v mjpeg -f rawvideo -

- означает, что вывод отправляется на стандартный stdout . Диагностические сообщения ffmpeg будут отправлены в stderr , как обычно. Вы можете захватить этот вывод в своей программе и передать его через простую передачу UDP на слушающий сервер.

Чтобы дополнительно сжимать ваш поток, вы, конечно, можете не отправлять изображение за изображением, а сжимать изображения в виде необработанного видеопотока H.264:

ffmpeg -i input -c:v libx264 -preset ultrafast -f rawvideo -

Затем вы бы проанализировали входящий поток следующим образом, где - это стандартный stdin:

ffmpeg -f rawvideo -c:v h264 -i - output

Конечно, вам нужно выяснить, как правильно передать данные. ffmpeg также может читать из каналов Unix.


Я сделал нечто подобное без FFmpeg, используя библиотеки кодировщика XviD в C++ для создания потока битов видео, затем отправив его по UDP на другую машину и проанализировав его оттуда. Это выполнимо, но зависит от того, как выглядит ваш сетевой стек и насколько он должен быть сложным (и устойчивым к ошибкам).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .