использовать сервер Bottle для повторной потоковой передачи контента (например, переадресации порта) - PullRequest
0 голосов
/ 14 июня 2019

У меня есть несколько малиновых PI во внутренней сети, успешно транслирующих канал mjpg через HTTP.

PI управляется веб-сервером, который работает на концентраторе.Концентратор принадлежит к той же сети PI, но к нему также можно подключиться через Интернет.

Теперь - я хочу, чтобы концентратор передавал поток, полученный от PI, из своего собственного веб-сервера.

В принципе, в псевдокоде я бы хотел, чтобы что-то вроде этого выполнялось на HUB:

@app.get('/device/<id>/stream')
def get_device_stream(rPI):

    url = "http://rPI.ip:rPI.port/stream.jpg"
    req = urllib2.Request(url)
    f = urllib2.urlopen(req, timeout=5)
    return f.read()

Очевидно, что это не будет работать, потому что прямая трансляция не имеет Content-Length.

Я могу заставить это работать при настройке сервера пересылки tcp, но я ищу решение, которое не требует от меня создания потока переадресации портов.

1 Ответ

1 голос
/ 15 июня 2019

Я нашел решение.Нужно получить поток и разбить его на отдельные кадры, а затем отправить его снова в виде видеопотока.Вот так:

def relay_stream():
stream_url = "http://217.7.233.140:80/cgi-bin/faststream.jpg?stream=full&fps=0"

    req = urllib2.Request(stream_url)
    stream = urllib2.urlopen(req, timeout=5)
    bytes = b''
    while True:
        bytes += stream.read(1024)
        a = bytes.find(b'\xff\xd8') #frame starting 
        b = bytes.find(b'\xff\xd9') #frame ending
        if a != -1 and b != -1:
            frame = bytes[a:b+2]
            bytes = bytes[b+2:]
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

@app.get('/device/<id>/stream')
@error_decorator
def get_device_stream(id):

    response.set_header('Content-type', 'multipart/x-mixed-replace; boundary=frame')
    return relay_stream()
...