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.
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.
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 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
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
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.
Die virtuelle Kamera von OBS
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.
- Klicke in OBS im Dock „Steuerung“ auf Virtuelle Kamera starten.
- 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.
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.
- Starte zuerst den Listener; er wartet auf den Push und verbindet sich von selbst neu.
- OBS hat nur eine Stream-Ausgabe, also schick die Kopie über eine zweite: entweder mit dem Plugin
obs-multi-rtmpoder über Einstellungen → Ausgabe → Aufnahme → Benutzerdefinierte Ausgabe (FFmpeg), FFmpeg-Ausgabetyp URL, URLrtmp://127.0.0.1:1935/live, Container-Formatflv. Dann klickst du auf „Aufnahme starten“. - Dieser Weg ruft das systemweit installierte ffmpeg auf: vorher
brew install ffmpeg.
$ cardstream-web --listen \ --source rtmp://0.0.0.0:1935/live
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.
- Richte eine Webcam oder Capture-Card auf die Stelle, an der du die Karten zeigst.
- 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.
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.
- Gib ihm die URL, die dein Encoder ohnehin veröffentlicht.
- Die Browser-Seite wird zum passiven Zuschauer: Die Analyse läuft auch, wenn kein Browser offen ist.
$ cardstream-web \ --source rtsp://studio/stream1
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.
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
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.
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 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.
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.