Suche

    immi2mpeg

    immi2mpeg bringt das Livebild von Blink-Kameras in den Browser. Blink überträgt den Livestream über ein eigenes Binärprotokoll (IMMI), das kein Browser direkt abspielen kann. Der Dienst baut die Verbindung zum Blink-Server auf, wandelt den empfangenen MPEG-TS-Strom mit ffmpeg in fragmentiertes MP4 um und reicht die Daten per WebSocket weiter. Im Browser spielt ein <video>-Element sie über die Media Source Extensions ab.

    immi2mpeg ist eine Node.js-Portierung von livestream.py aus blinkpy und bietet dieselbe WebSocket-Schnittstelle wie die blink-liveview-middleware .

    So funktioniert’s

    Browser / Client
         │  WebSocket ws://host:8090
         ▼
    immi2mpeg
         ├─ BlinkApi        startet die Liveansicht über die Blink-API
         ├─ BlinkLiveStream TLS-Verbindung, Anmeldung, MPEG-TS empfangen
         └─ ffmpeg          MPEG-TS → fMP4
         │  TLS TCP binary stream
         ▼
    Blink IMMI Server
    
    1. Ein Client verbindet sich per WebSocket und schickt innerhalb von 8 Sekunden den Befehl liveview:start mit den Zugangsdaten und der Kamera-ID.
    2. immi2mpeg startet über die Blink-API die Liveansicht und verbindet sich mit dem IMMI-Server.
    3. Nach etwa zwei bis drei Sekunden kommen die ersten Videofragmente als Binärdaten beim Client an.
    4. Mit liveview:stop beendet der Client den Stream, immi2mpeg meldet das Ende auch an Blink zurück.

    Voraussetzungen

    • Node.js ab Version 18
    • ffmpeg, installiert und im Suchpfad (sudo apt install ffmpeg)
    • die Blink-Zugangsdaten: Region, API-Token, Konto-, Netzwerk- und Kamera-ID

    Installation

    cd /opt
    git clone https://github.com/wilkware/immi2mpeg
    cd immi2mpeg
    npm install
    
    sudo cp ./docs/immi2mpeg.service /etc/systemd/system
    sudo chmod +x /opt/immi2mpeg/src/index.js
    sudo systemctl daemon-reload
    sudo systemctl enable immi2mpeg.service
    sudo systemctl start immi2mpeg.service
    

    Standardmäßig lauscht der Dienst auf Port 8090. Port und Adresse lassen sich beim Start ändern, entweder als Parameter oder über Umgebungsvariablen:

    node src/index.js --port=9000 --host=127.0.0.1
    PORT=9000 HOST=127.0.0.1 npm start
    

    Für die Fehlersuche gibt DEBUG=immi2mpeg:* ausführliche Meldungen aus, einzelne Bereiche lassen sich über immi2mpeg:stream, :api, :ffmpeg oder :ws gezielt einschalten. Alternativ läuft der Dienst auch in einem Docker-Container.

    Die WebSocket-Schnittstelle

    const ws = new WebSocket('ws://localhost:8090');
    ws.binaryType = 'arraybuffer';
    
    ws.onopen = () => {
      ws.send(JSON.stringify({
        command: 'liveview:start',
        data: {
          account_region: 'e006',
          api_token:      'eyJhbGci...',
          account_id:     '12345',
          network_id:     '67890',
          camera_id:      '111222',
          camera_type:    'cameras',   // 'cameras' | 'owl' | 'doorbell'
        },
      }));
    };
    
    ws.onmessage = (evt) => {
      if (evt.data instanceof ArrayBuffer) {
        // fMP4-Fragment an den SourceBuffer übergeben
        return;
      }
      const msg = JSON.parse(evt.data);
      // msg.command: 'liveview:start' (Stream offen) oder 'liveview:stop' (Ende, ggf. mit msg.error)
    };
    

    Unterstützt werden normale Kameras, die Mini-Kamera (owl) und die Türklingel (doorbell). Ein vollständiges Beispiel für das Abspielen mit MediaSource steht in der README .

    Und Symcon?

    Die Zugangsdaten, die immi2mpeg erwartet, kennt man aus der Anmeldung bei Blink, in Symcon zum Beispiel über die Bibliothek Blink Home System . Wo ein Livebild gebraucht wird, etwa in einer eigenen Kachel oder HTML-Box, reicht dann eine WebSocket-Verbindung zu immi2mpeg.

    immi2mpeg steht unter der MIT-Lizenz .