Управляем чем угодно откуда угодно

MJPEG server

Виртурилка, 3G/4G, WiFi, моторчики, датчики, GPS и прочее - питание, драйвера, совместимость и т.д.

Re: MJPEG server

Сообщение holmes » 06 сен 2015, 22:07

Мда, теперь понятно. Ведь и VLC ругается если не tcp:// указать, а http://.
Из гугла ясно что у гстримера нет чего-то типа httpserversink.
Придется либо пробовать переписать указанный по ссылке исходник на TcpSocket ... либо все таки перейти на rtmp over udp, такая мысль начинает закрадываться после просмотра MJPEG потока через VLC. Там задержка аж полторы-две секунды!!

Спасибо огромное за помощь. Все таки покурю гстример под шарп.
Последний раз редактировалось holmes 06 сен 2015, 22:13, всего редактировалось 2 раз(а).
Аватара пользователя
holmes
 
Сообщения: 83
Зарегистрирован: 13 ноя 2013, 00:02
Откуда: Мск

Re: MJPEG server

Сообщение Gol » 06 сен 2015, 22:11

holmes писал(а):Мда, теперь понятно.


Вот ещё туда же https://social.msdn.microsoft.com/Forum ... etfxnetcom
Аватара пользователя
Gol
 
Сообщения: 507
Зарегистрирован: 17 фев 2012, 01:44
Откуда: Тула-Свободный-Щёкино-Тула-Москва

Re: MJPEG server

Сообщение Gol » 06 сен 2015, 22:13

holmes писал(а):либо все таки перейти на rtmp over udp, такая мысль начинает закрадываться после просмотра MJPEG потока через VLC. Там задержка аж полторы-две секунды!!


Только не rtmp а rtp!

А мне вот больше нравится идея вообще от гстримера уйти, надо ffmpeg под C# покурить шоп сырой H264 научиться отображать. А то тянуть с собой тяжеленный гстример ради одного только приёма и отображения видео как-то не нравится.
Аватара пользователя
Gol
 
Сообщения: 507
Зарегистрирован: 17 фев 2012, 01:44
Откуда: Тула-Свободный-Щёкино-Тула-Москва

Re: MJPEG server

Сообщение holmes » 06 сен 2015, 22:20

Gol писал(а):А мне вот больше нравится идея вообще от гстримера уйти, надо ffmpeg под C# покурить шоп сырой H264 научиться отображать. А то тянуть с собой тяжеленный гстример ради одного только приёма и отображения видео как-то не нравится.


Если б знать какие-то вводные я б покурил. Могу выделить время и постараться погрузиться.
Как с в2р отправить сырой H264 ?

UPD. Сразу наткнулся на интересную ссылку
Аватара пользователя
holmes
 
Сообщения: 83
Зарегистрирован: 13 ноя 2013, 00:02
Откуда: Мск

Re: MJPEG server

Сообщение Gol » 06 сен 2015, 23:14

holmes писал(а):Как с в2р отправить сырой H264 ?


На борту
Код: Выделить всё
gst-launch v4l2src always-copy=false chain-ipipe=true ! capsfilter caps=video/x-raw-yuv,format='(fourcc)'NV12,width=1280,height=720,framerate='(fraction)'30 ! dmaiaccel ! dmaienc_h264 copyOutput=false ddrbuf=false encodingpreset=2 ratecontrol=2 intraframeinterval=30 idrinterval=60 targetbitrate=1000000 bytestream=true headers=false ! multiudpsink clients=192.168.1.12:3000 sync=false enable-last-buffer=false

Тут можно играть параметром bytestream, чтоб поток был либо байтстрим либо avc (я хз что для ffmpeg лучше).

на десктопе (192.168.1.12)
Код: Выделить всё
gst-launch-0.10 -e -m udpsrc port=3000 buffer-size=300000 typefind=true do-timestamp=true ! "video/x-h264,format=(fourcc)I420,framerate=fraction)30/1,width=1280,height=720" ! ffdec_h264 ! fpsdisplaysink sync=false show-preroll-frame=false

видеосинк по вкусу, я для тестов обычно fpsdisplaysink под убунтой юзаю чтоб фпс отслеживать

приём под виндой на гстримере 0.10 аналогично
Код: Выделить всё
gst-launch udpsrc port=3000 buffer-size=120000 ! capsfilter caps="video/x-h264,framerate=(fraction)30/1,width=1280,height=720" ! h264parse ! ffdec_h264 ! d3dvideosink sync=false show-preroll-frame=false

h264parse необязателен, но желателен
Аватара пользователя
Gol
 
Сообщения: 507
Зарегистрирован: 17 фев 2012, 01:44
Откуда: Тула-Свободный-Щёкино-Тула-Москва

Re: MJPEG server

Сообщение holmes » 07 сен 2015, 00:38

Ок. С понедельника курю тему
Аватара пользователя
holmes
 
Сообщения: 83
Зарегистрирован: 13 ноя 2013, 00:02
Откуда: Мск

Re: MJPEG server

Сообщение holmes » 13 сен 2015, 01:38

Что-то утомил меня H.264, и ffmpeg, которым его должно быть можно декодить.
Не подумайте что я опустил руки, но все же, может рассмотреть альтернативы?
Поток жипегов я понимаю канал убивать будет (хотя может стоит попробовать), или может есть еще что попроще?
Можт на VP8 внимание обратить?
Аватара пользователя
holmes
 
Сообщения: 83
Зарегистрирован: 13 ноя 2013, 00:02
Откуда: Мск

Re: MJPEG server

Сообщение holmes » 13 сен 2015, 17:49

В принципе с JPEGом получилось неплохо пока, хоть что-то для разминки есть.
По логам при разрешении 640x480 размер пакета 15-21 кБ. Визуально задержка не более пол секунды.

Пайплайн на v2r:
Код: Выделить всё
gst-launch v4l2src always-copy=false chain-ipipe=true decimate=2 ! capsfilter caps=video/x-raw-yuv,format='(fourcc)'NV12,width=$WIDTH,height=$HEIGHT,framerate='(fraction)'$FPS$PITCH ! dmaiaccel ! dmaienc_jpeg qValue=$QUALITY copyOutput=false outputBufferSize=0 fixTimestamp=true ! udpsink host=192.168.3.10 port=3000

На приемной стороне в C# простенький UDP listener.
Код: Выделить всё
using System;
using System.Net;
using System.Net.Sockets;

namespace UdpListenerNs
{
    class UdpListener : Object
    {
        private Socket socket;
        private byte[] buffer;

        public delegate void ReceiveEventHandler(object sender, byte[] buffer);
        public event ReceiveEventHandler ReceiveEvent;
        public delegate void ErrorEventHandler(object sender, string message);
        public event ErrorEventHandler ErrorEvent;

        public void Start(int port, int buf_len)
        {
            buffer = new byte[buf_len];

            // setup the socket
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            socket.Bind(new IPEndPoint(IPAddress.Any, port));

            // start listening
            EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
            socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, new AsyncCallback(DoReceiveFrom), socket);
        }

        public void Stop()
        {
            if (socket != null)
                socket.Close();
        }

        private void DoReceiveFrom(IAsyncResult iar)
        {
            // get the received message
            int length = 0;
            Socket recieveSocket = (Socket)iar.AsyncState;
            EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);
            try
            {
                length = recieveSocket.EndReceiveFrom(iar, ref clientEP);
            }
            catch (SocketException e)
            {
                ErrorEvent(this, e.Message);
                Stop();
                return;
            }
            catch (ObjectDisposedException)
            {
                // expected termination exception on a closed socket
                return;
            }

            byte[] data = new byte[length];
            Array.Copy(buffer, data, length);

            // start listening for a new message
            EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
            socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, new AsyncCallback(DoReceiveFrom), socket);
           
            // fire event
            ReceiveEvent(this, data);
        }
    }
}

Запуск и останов.
Код: Выделить всё
        UdpListener listener = null;

        public formVideo()
        {
            InitializeComponent();
            listener = new UdpListener();
            listener.ReceiveEvent += new UdpListener.ReceiveEventHandler(listener_ReceiveEvent);
            listener.ErrorEvent += new UdpListener.ErrorEventHandler(listener_ErrorEvent);
        }
       
        public void EnableCamera()
        {
            int port = 3000;
            if (!int.TryParse(tbCamURL.Text, out port)) tbCamURL.Text = "3000";
            listener.Start(port, 65536);
        }

        public void DisableCamera()
        {
            listener.Stop();
        }

Полученный массив байтов преобразуется в Bitmap
Код: Выделить всё
private void listener_ReceiveEvent(object sender, byte[] data)
        {
            log("packet__len__" + data.Length.ToString());
           
            if (!working)
            {
                Bitmap bmp;
                MemoryStream ms;
                using (ms = new MemoryStream(data))
                {
                    bmp = new Bitmap(ms);
                    ProcessBitmap(bmp); // это функция обработки и отрисовки кадра
                }
            }
        }

и дальше отлично отрисовывается на форме и скармливается OpenCV попутно (пробовал поиск лиц, все работает).
Аватара пользователя
holmes
 
Сообщения: 83
Зарегистрирован: 13 ноя 2013, 00:02
Откуда: Мск

Re: MJPEG server

Сообщение holmes » 13 сен 2015, 17:59

С h264 охота работать пока отпала.
Можно ли сделать dmaienc_vp8 для гстримера?

UPD. Поток жпегов примерно 2 Мбит/с, т.е. в 2 раза больше чем рассчетный поток H264, но это децимация=2. Если ее убрать должно быть 4 Мбит/с. Но 15 FPS имхо вполне достаточно, одно только распознавание лиц может занимать по 200-500 мсек.
Аватара пользователя
holmes
 
Сообщения: 83
Зарегистрирован: 13 ноя 2013, 00:02
Откуда: Мск

Re: MJPEG server

Сообщение Gol » 14 сен 2015, 15:34

holmes писал(а):С h264 охота работать пока отпала.
Можно ли сделать dmaienc_vp8 для гстримера?

UPD. Поток жпегов примерно 2 Мбит/с, т.е. в 2 раза больше чем рассчетный поток H264, но это децимация=2. Если ее убрать должно быть 4 Мбит/с. Но 15 FPS имхо вполне достаточно, одно только распознавание лиц может занимать по 200-500 мсек.

VP8 проц аппаратно не умеет. А чем H264 не устраивает-то? Пашет исправно (через гстример, во всяком случае), проблем нет. Если надо его скармливать библиотеке для распознавания - тут на форуме где-то была ветка как это сделать. Вкратце - после декодирования гстримером получаем раскодированый поток который через appsink скармливаем куда угодно.
Аватара пользователя
Gol
 
Сообщения: 507
Зарегистрирован: 17 фев 2012, 01:44
Откуда: Тула-Свободный-Щёкино-Тула-Москва

Пред.След.

Вернуться в Железо - заставляем работать

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron