cardstream
Anleitung

Werte deinen Stream auf Whatnot oder Fanatics Live aus

cardstream meldet sich nie bei Whatnot, Fanatics Live oder irgendeinem anderen Marktplatz an. Es schaut auf deinem eigenen Rechner dasselbe Video an, das du ihnen ohnehin schickst, und benennt jede Karte, die auf den Tisch kommt. Hier ist der ganze Weg von null bis zum Live-Overlay: etwa fünfzehn Minuten, und das nur einmal.

Ein Rechner neben der Kamera

macOS, Linux oder Windows. Wenn darauf schon OBS läuft, ist es der richtige Rechner: Die Analyse passiert lokal, es muss also nichts übertragen werden.

Das Video, das du ohnehin sendest

Eine OBS-Szene, eine Webcam, eine Capture-Card oder ein Encoder. cardstream greift ab, was da ist; du musst deine Show nicht umbauen.

Ein Ximilar-API-Schlüssel

Die einzigen Zugangsdaten im ganzen System, und sie bleiben auf deinem Rechner. Kein Marktplatz-Konto, kein Passwort, kein Bot in deinem Chat.

Zuerst

Bring es für sich allein zum Laufen

Bevor irgendetwas davon deine Show berührt, zeig mit der Webcam deines Laptops, dass es funktioniert. Drei Befehle.

01

Installieren

Das Skript legt ein venv in ~/.cardstream an, prüft das Release-Wheel gegen seine Prüfsummen, lädt die Modellgewichte und legt die Befehle in deinen PATH. Die Installation per Wheel, mit Docker oder aus dem Quellcode steht auf der Download-Seite.

$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh
02

Schlüssel eintragen

Die Identifikation läuft standardmäßig über Ximilar collectibles/v2, oder an seiner Stelle über dein eigenes System. XIMILAR_API_KEY ist die einzige Umgebungsvariable, die überhaupt gelesen wird. Trag sie in dein Shell-Profil ein, damit sie am Show-Abend einen Neustart übersteht.

$ export XIMILAR_API_KEY=your-key
03

Halte eine Karte vor deinen Laptop

Das öffnet die Browser-Oberfläche mit deiner eingebauten Webcam. Halte eine Karte einen Moment still: Das Overlay zeigt, wie der Zustandsautomat entscheidet, dann Name, Set und Konfidenz, und neben dem Treffer die Dauer des Identifikationsaufrufs. Das ist das ganze Produkt. Der Rest dieser Seite dreht sich nur darum, woher die Pixel kommen.

$ cardstream-web
# → http://127.0.0.1:8001
Dann

Richte es auf deine Show

Such dir einen Weg aus. Welchen, hängt an einer einzigen Frage: Streamst du vom Desktop oder vom Handy?

Was nicht geht

cardstream auf deine öffentliche Wiedergabeseite bei Whatnot oder Fanatics richten. Für deine eigene Show gibt es keine ausgehende Stream-URL, und den Player auszulesen würde Sekunden an Latenz kosten und obendrein gegen die Nutzungsbedingungen der Plattform verstoßen. Jeder Weg unten greift dein Video vor dem Marktplatz ab, und genau deshalb braucht cardstream von ihm weder Konto noch Passwort noch API-Schlüssel.

A
Du streamst mit OBS am Desktop

Die virtuelle Kamera von OBS

Hier anfangen

OBS kann deine fertige Szene dem Betriebssystem als gewöhnliche Webcam anbieten. cardstream öffnet sie dann wie jede andere Kamera: kein zweites Encoding, keine Zusatzlast für deinen Encoder und kein ffmpeg, das du installieren müsstest.

  1. Klicke in OBS im Dock „Steuerung“ auf Virtuelle Kamera starten.
  2. Starte cardstream und gib sie als Webcam-Index an. Index 0 ist meist deine eingebaute Kamera, die virtuelle also in der Regel 1. Probier 0, 1, 2, bis du deine Szene siehst.
$ cardstream-web --source 1

Probier das einmal vor einer Show aus, nicht währenddessen: Unter macOS braucht das Terminal die Kameraberechtigung, und falls OpenCV das virtuelle Gerät auf deinem Rechner nicht öffnen kann, funktioniert Weg B überall.

B
Du streamst mit OBS und willst exakt die gesendeten Pixel

Eine zweite Ausgabe aus OBS

cardstream lauscht auf deinem eigenen Rechner, und OBS schickt ihm eine Kopie. Whatnot oder Fanatics bekommen weiterhin genau das, was sie vorher bekommen haben: Das ist ein zusätzliches Ziel, nie eine Umleitung.

  1. Starte zuerst den Listener; er wartet auf den Push und verbindet sich von selbst neu.
  2. OBS hat nur eine Stream-Ausgabe, also schick die Kopie über eine zweite: entweder mit dem Plugin obs-multi-rtmp oder über Einstellungen → Ausgabe → Aufnahme → Benutzerdefinierte Ausgabe (FFmpeg), FFmpeg-Ausgabetyp URL, URL rtmp://127.0.0.1:1935/live, Container-Format flv. Dann klickst du auf „Aufnahme starten“.
  3. Dieser Weg ruft das systemweit installierte ffmpeg auf: vorher brew install ffmpeg.
$ cardstream-web --listen \
    --source rtmp://0.0.0.0:1935/live
C
Du gehst mit dem Handy live, wie die meisten Verkäufer

Eine eigene Kamera auf dem Tisch

Ein Handy, das direkt in die App sendet, gibt dir nichts zum Abzweigen. Hör also auf, dem ausgehenden Stream hinterherzulaufen, und gib cardstream einen eigenen Blick auf denselben Tisch: eine zweite Webcam von oben, oder den HDMI-Ausgang der Kamera in eine Capture-Card.

  1. Richte eine Webcam oder Capture-Card auf die Stelle, an der du die Karten zeigst.
  2. Starte es auf dem Rechner neben dieser Kamera.
$ cardstream-web --source 0

Es muss nicht der Blickwinkel deiner Käufer sein. Eine enge, gut ausgeleuchtete Aufnahme von oben wird besser erkannt als jeder komprimierte Marktplatz-Stream.

D
Du betreibst einen Encoder, einen Bildmischer oder eine IP-Kamera

Alles, was eine URL hat

rtsp://, rtmp:// und srt:// werden direkt abgeholt, dazu JPEG-Feeds über ws://, wenn dein Setup Marke Eigenbau ist. Neue Verbindungsversuche laufen mit gedeckeltem Backoff. Eine Studioleitung, die mitten im Break abreißt, kommt also zurück, ohne dass du etwas anfassen musst.

  1. Gib ihm die URL, die dein Encoder ohnehin veröffentlicht.
  2. Die Browser-Seite wird zum passiven Zuschauer: Die Analyse läuft auch, wenn kein Browser offen ist.
$ cardstream-web \
    --source rtsp://studio/stream1
Bevor du live gehst

Stell es auf deine Show ein

Die Standardwerte sind solide, aber ein Break ist kein beliebiges Kamerabild: Meist weißt du, was du öffnest, bevor du es öffnest.

04

Sag ihm, was im Break ist

Eine Vorgabe für Spiel oder Set grenzt die Suche ein: schnellere Aufrufe, bessere Treffer. Eine Regel: Gib immer --alphabet an, wenn du --game angibst. Die Vorgabe des Spiels schaltet nämlich die eigene Alphabet-Erkennung des Endpunkts ab, er nimmt dann latin an, und eine japanische Karte würde ihrer englischen Version zugeordnet.

$ cardstream-web --source 1 \
    --game "Pokémon" --alphabet japanese --set-code M4
05

Mitten im Stream umentscheiden

Wenn das nächste Lot ein anderes Spiel ist, startest du nichts neu: Kategorie, Spiel, Set-Code, Alphabet sowie die Schwellenwerte für Ergebnis und Schärfe lassen sich im Einstellungsdialog im Browser ändern, während der Stream läuft. Alles andere (Detektor, Filter, Auflösung) wird einmal beim Start gelesen, leg das also jetzt fest.

06

Führ das Protokoll, halt den Port zu

--split-results gibt jedem Erscheinen einer Karte eine eigene Zeile, statt Wiederholungen zusammenzufassen: eine fortlaufende Liste dessen, was du gezeigt hast, in der Reihenfolge, in der du es gezeigt hast, bereit für den Abgleich mit den Bestellungen danach. Lass --host auf dem Standardwert 127.0.0.1: Dieser Prozess hält deinen Schlüssel, und die lokale Oberfläche hat keine Authentifizierung, sie sollte also nie aus deinem LAN erreichbar sein.

$ cardstream-web --source 1 --split-results
07

Speichere die Show für den Morgen danach

Mit --ximilar-stream NEW wird jede Zeile dieses Verlaufs (die Karte, ihr Preis, wie lange sie im Stream war und der Ausschnitt, an dem sie erkannt wurde) in einer Session in deinem Ximilar-Konto gespeichert, während du streamst. Danach zeigt der Bereich Cardstream der Ximilar-App die ganze Show: ihren Wert, ihre wertvollsten Karten und jede Karte mit Bild. Dort markierst du auch, was verkauft wurde, und korrigierst einen falschen Treffer. Startet der Client mitten in der Show neu, starte ihn mit der ausgegebenen Session-ID statt NEW, und dieselbe Show läuft weiter. Zum Speichern in einem Team-Workspace dient --ximilar-workspace.

$ cardstream-web --source 1 --price-stats --ximilar-stream NEW
# nach einem Neustart:
$ cardstream-web --source 1 --price-stats --ximilar-stream <session-id>

Dann mach deine Show. Detektion, Bewegungsfilter und Identitätsfilter laufen alle lokal auf deinem Rechner; der Identifikationsaufruf geht einmal pro Karte hinaus, die du auf den Tisch legst: rund hundert in einer Stunde, gegenüber den 54.000 Frames, die diese Stunde enthält. Hier steht die Rechnung.

Wenn etwas hakt

Die sechs Dinge, die wirklich schiefgehen

Die virtuelle Kamera taucht nicht in der Liste auf

Geh --source 0, 1, 2 der Reihe nach durch: Die Indizes vergibt das Betriebssystem. Unter macOS gibst du deinem Terminal unter Systemeinstellungen → Datenschutz & Sicherheit Zugriff auf die Kamera. Wenn OpenCV sie trotzdem nicht öffnet, wechsle zu Weg B.

„ffmpeg not found“

Nur --listen und --ffmpeg rufen das systemweit installierte ffmpeg auf. Installiere es (brew install ffmpeg) und starte neu; die Wege über virtuelle Kamera, Webcam und einfachen Pull brauchen nichts zusätzlich.

OBS lässt mich keinen zweiten Stream hinzufügen

Das ist eine Grenze von OBS, nicht von cardstream: Es hat nur eine Stream-Ausgabe. Das Plugin obs-multi-rtmp ergänzt echte zusätzliche Ziele; der Aufnahmeweg über die Benutzerdefinierte Ausgabe (FFmpeg) aus Weg B funktioniert mit einem unveränderten OBS.

Karten werden gefunden, aber es gibt nie einen Treffer

Fast immer liegt es an der Auflösung oder an der Bewegung. Die Kartennummer muss in dem Frame, den du sendest, lesbar sein: Lass OBS auf 1080p, halte die Karte beim Zeigen einen Moment still, und lockere erst dann --result-threshold (Standard 0.9; höher lässt schwächere Treffer durch, 1.0 lässt alles durch).

Dieselbe Karte wird zweimal identifiziert

Der Identitätsfilter hat die Ähnlichkeit der beiden Ansichten unter --similarity-threshold (Standard 0.85) eingestuft und sie deshalb für eine neue Karte gehalten. Senke den Wert ein wenig. Wenn du eine Karte ablegst und wieder aufnimmst, erhöhe stattdessen --forget-after: Nach 2 Sekunden Abwesenheit gilt eine Karte absichtlich als neu.

Es wird überhaupt nichts gefunden

Starte mit --show-detection, um die Box einzuzeichnen: Die Detektion läuft immer, sie wird nur standardmäßig nicht gezeichnet. Keine Box heißt, die Karte ist im Bild zu klein oder zu schnell; bei einer Box ohne Treffer hilft der Punkt „Karten werden gefunden, aber es gibt nie einen Treffer“ weiter.

Kommst du nicht weiter? Das README dokumentiert jedes Flag, und die Doku sortiert sie nach dem, was du gerade vorhast.

Open Source. Selbst gehostet. Dein Stream, dein Stack.

Keine Plattform dazwischen, keine Lizenz pro Nutzer: Verbinde die Ximilar-API oder dein eigenes Identifikationssystem, und cardstream ruft es einmal pro neuer Karte auf statt einmal pro Frame. Ob du auf Whatnot Breaks machst, eine Show im Stil von Fanatics Live fährst oder dein eigenes Live-Commerce-Setup streamst: Starte cardstream heute Abend auf der Hardware, die du schon hast.