حلّل بثّك على Whatnot أو Fanatics Live
لا يسجّل cardstream الدخول إلى Whatnot ولا Fanatics Live ولا أي منصة بيع أخرى. يشاهد على جهازك الفيديو نفسه الذي ترسله إليها أصلًا، ويسمّي كل بطاقة توضع على الطاولة. هذا هو الطريق كله، من لا شيء إلى تراكب مباشر: نحو خمس عشرة دقيقة، ولمرة واحدة.
حاسوب قرب الكاميرا
macOS أو Linux أو Windows. إن كنت تشغّل OBS عليه أصلًا فهو الجهاز المناسب: التحليل يجري محليًا، فلا شيء يحتاج إلى الانتقال.
الفيديو الذي ترسله أصلًا
مشهد في OBS، أو كاميرا ويب، أو جهاز التقاط الفيديو، أو مرمِّز. يأخذ cardstream نسخة مما عندك، ولا يطلب منك إعادة ترتيب العرض.
مفتاح Ximilar API
بيانات الاعتماد الوحيدة في النظام كله، وتبقى على جهازك. لا حساب على منصة بيع، ولا كلمة مرور، ولا بوت في محادثتك.
شغّله وحده
قبل أن يقترب أي من هذا من عرضك، تأكد أنه يعمل على كاميرا الويب في حاسوبك المحمول. ثلاثة أوامر.
ثبّته
يبني السكربت venv في ~/.cardstream، ويتحقق من ملف wheel الخاص بالإصدار بمطابقة مجاميعه الاختبارية، ويجلب أوزان النماذج، ويضع الأمرين على PATH. أما التثبيت من wheel أو عبر Docker أو من المصدر ففي صفحة التنزيل.
$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh أضف مفتاحك
يجري التعرّف افتراضيًا عبر Ximilar collectibles/v2، أو عبر نظامك الخاص بدلًا منه. وXIMILAR_API_KEY هو متغير البيئة الوحيد الذي يقرؤه أي جزء من النظام، فضعه في ملف إعدادات shell عندك ليبقى بعد إعادة تشغيل الجهاز في ليلة العرض.
$ export XIMILAR_API_KEY=your-key
ارفع بطاقة أمام حاسوبك المحمول
يفتح هذا واجهة المتصفح على كاميرا الويب المدمجة. أمسك بطاقة ثابتة لحظة: يعرض التراكب آلة الحالات وهي تقرر، ثم الاسم والمجموعة ودرجة الثقة، وبجانب المطابقة الزمن الفعلي الذي استغرقه طلب التعرّف. هذا هو المنتج كله، وبقية هذه الصفحة تدور فقط حول المصدر الذي تأتي منه البكسلات.
$ cardstream-web # → http://127.0.0.1:8001
وجّهه إلى عرضك
اختر صفًّا واحدًا. وأيّها تختار يتوقف على سؤال واحد: هل تبثّ من حاسوب أم من هاتف؟
ما لا تستطيع فعله
أن توجّه cardstream إلى صفحة المشاهدة العامة لعرضك على Whatnot أو Fanatics. لا يوجد رابط URL لبث عرضك الصادر، واستخراج الفيديو من المشغِّل يضيف ثواني من التأخير فوق مخالفته لشروط المنصة. كل طريقة في الأسفل تأخذ الفيديو قبل وصوله إلى منصة البيع، ولهذا بالضبط لا يحتاج cardstream منها إلى حساب ولا كلمة مرور ولا مفتاح API.
الكاميرا الافتراضية في OBS
يستطيع OBS أن يقدّم مشهدك المركَّب إلى نظام التشغيل على أنه كاميرا ويب عادية. فيفتحها cardstream كما يفتح أي كاميرا أخرى: بلا ترميز ثانٍ، وبلا حمل إضافي على المرمِّز، وبلا ffmpeg تثبّته.
- في OBS، انقر تشغيل الكاميرا الافتراضية (Start Virtual Camera) في لوحة «التحكم».
- شغّل cardstream عليها برقم كاميرا الويب. الرقم 0 هو في العادة كاميرتك المدمجة، فالافتراضية تكون غالبًا 1. جرّب 0 ثم 1 ثم 2 إلى أن ترى مشهدك.
$ cardstream-web --source 1 جرّب هذا مرة قبل العرض لا أثناءه: على macOS تحتاج الطرفية إلى إذن استخدام الكاميرا، وإن لم يستطع OpenCV فتح الجهاز الافتراضي على حاسوبك فالطريقة B تعمل في كل مكان.
مخرج ثانٍ من OBS
يستمع cardstream على جهازك ويرسل OBS نسخة إليه. وتظل Whatnot أو Fanatics تستلم ما كانت تستلمه بالضبط: هذا هدف إضافي، وليس تحويلًا للبث أبدًا.
- شغّل المستقبِل أولًا، فهو ينتظر البث المرسل ويعيد الاتصال من تلقاء نفسه.
- ليس في OBS إلا مخرج بث (Stream) واحد، فأرسل النسخة من مخرج ثانٍ: إما بإضافة
obs-multi-rtmp، وإما من الإعدادات ← المخرج ← التسجيل ← إخراج مخصص (FFmpeg)، مع اختيار النوع التصدير إلى رابط URL، والرابطrtmp://127.0.0.1:1935/live، وصيغة الحاويةflv، ثم اضغط «بدء التسجيل». - هذه الطريقة تستدعي برنامج ffmpeg المثبّت على النظام، فنفّذ أولًا
brew install ffmpeg.
$ cardstream-web --listen \ --source rtmp://0.0.0.0:1935/live
كاميرا خاصة به على الطاولة
الهاتف الذي يرسل مباشرةً إلى التطبيق لا يترك لك شيئًا تأخذ منه نسخة. فكفّ عن ملاحقة البث الصادر وامنح cardstream رؤيته الخاصة للطاولة نفسها: كاميرا ويب ثانية من الأعلى، أو مخرج HDMI من الكاميرا إلى جهاز التقاط الفيديو.
- وجّه كاميرا ويب أو جهاز التقاط الفيديو إلى الموضع الذي تكشف فيه البطاقات.
- شغّله على الجهاز المجاور لتلك الكاميرا.
$ cardstream-web --source 0 لا يلزم أن تكون الزاوية نفسها التي يراها المشترون. لقطة علوية قريبة وجيدة الإضاءة تعطي تعرّفًا أفضل مما يعطيه بث منصة بيع مضغوط في أي حال.
أي شيء له رابط URL
تُسحب مباشرةً الروابط التي تبدأ بـ rtsp:// أو rtmp:// أو srt:// ومعها تدفقات JPEG عبر ws:// حين تكون تجهيزاتك من صنع يدك. إعادة الاتصال تجري بفواصل متزايدة لها حد أقصى، فوصلة الاستوديو التي تنقطع في منتصف فتح الصناديق تعود دون أن تلمسها.
- أعطه رابط URL الذي ينشره مرمِّزك أصلًا.
- تصير صفحة المتصفح مجرد شاشة عرض: التحليل يجري حتى من غير متصفح مفتوح.
$ cardstream-web \ --source rtsp://studio/stream1
اضبطه للعرض الذي تقدّمه
الإعدادات الافتراضية معقولة، لكن فتح الصناديق ليس بث كاميرا عاديًا: في الغالب تعرف ما ستفتحه قبل أن تفتحه.
أخبره بما تفتحه
تحديد اللعبة أو المجموعة مسبقًا يضيّق البحث: طلبات أسرع ومطابقات أفضل. وقاعدة واحدة: مرّر دائمًا --alphabet حين تمرّر --game، لأن تحديد اللعبة مسبقًا يوقف كشف نقطة النهاية لنظام الكتابة فتفترض latin، وعندها تطابق البطاقة اليابانية طبعتها الإنجليزية.
$ cardstream-web --source 1 \ --game "Pokémon" --alphabet japanese --set-code M4
غيّر رأيك أثناء البث
حين تكون الدفعة التالية من لعبة أخرى لا تعيد تشغيل شيء: الفئة واللعبة ورمز المجموعة ونظام الكتابة وعتبتا النتائج والوضوح كلها قابلة للتعديل في نافذة الإعدادات في المتصفح والبث يعمل. وكل ما عدا ذلك، أي الكاشف والمرشّح والدقة، يُقرأ مرة واحدة عند بدء التشغيل، فاختره الآن.
احتفظ بالسجل وأبقِ المنفذ مغلقًا
الخيار --split-results يعطي كل ظهور صفًّا خاصًّا به بدلًا من دمج المكرَّر: قائمة متواصلة بما عرضته وبالترتيب الذي عرضته به، جاهزة لمطابقتها مع الطلبيات بعد ذلك. واترك --host على قيمته الافتراضية 127.0.0.1: هذه العملية تحمل مفتاحك والواجهة المحلية بلا مصادقة، فلا ينبغي أبدًا أن يُوصَل إليها من شبكتك المحلية.
$ cardstream-web --source 1 --split-results احفظ العرض لصباح اليوم التالي
أضف --ximilar-stream NEW فيُحفظ كل صف في ذلك السجل، أي البطاقة وسعرها ومدة بقائها على البث والصورة المقصوصة التي جرى التعرّف عليها منها، في جلسة داخل حسابك على Ximilar وأنت تبثّ. وبعد ذلك يعرض قسم Cardstream في تطبيق Ximilar العرض كله: قيمته، وبطاقاته الأعلى قيمة، وكل بطاقة مع صورتها، وهناك تعلّم ما بيع وتصحّح أي مطابقة خاطئة. وإن أُعيد تشغيل العميل في منتصف العرض، فشغّله من جديد بمعرّف الجلسة المطبوع بدلًا من NEW فيستمر العرض نفسه. والحفظ في مساحة عمل الفريق يكون عبر --ximilar-workspace.
$ cardstream-web --source 1 --price-stats --ximilar-stream NEW # بعد إعادة التشغيل: $ cardstream-web --source 1 --price-stats --ximilar-stream <session-id>
ثم قدّم عرضك. الكشف والحركة ومرشّح الهوية تعمل كلها محليًا على جهازك، وطلب التعرّف يخرج مرة واحدة لكل بطاقة تضعها على الطاولة: نحو مئة في الساعة، مقابل 54,000 إطار تحتويها تلك الساعة. الحساب هنا.
الأشياء الستة التي تتعطل فعلًا
الكاميرا الافتراضية ليست في القائمة
جرّب --source 0 ثم 1 ثم 2 بالترتيب، فالأرقام هي ما يوزّعه نظام التشغيل. على macOS، امنح الطرفية إذن الكاميرا من إعدادات النظام ← الخصوصية والأمن. وإن ظل OpenCV لا يفتحها فانتقل إلى الطريقة B.
«ffmpeg not found»
الخياران --listen و--ffmpeg وحدهما يستدعيان برنامج النظام. ثبّته (brew install ffmpeg) ثم أعد التشغيل. أما طرق الكاميرا الافتراضية وكاميرا الويب والسحب العادي فلا تحتاج إلى شيء إضافي.
OBS لا يسمح لي بإضافة بث ثانٍ
هذا قيد في OBS لا في cardstream: فيه مخرج بث واحد. إضافة obs-multi-rtmp تضيف أهدافًا إضافية حقيقية، ومسار التسجيل عبر «إخراج مخصص (FFmpeg)» في الطريقة B يعمل مع OBS كما هو.
البطاقات تُكتشف لكنها لا تُطابَق أبدًا
السبب في الغالب الدقة أو الحركة. يجب أن يكون رقم البطاقة مقروءًا في الإطار الذي ترسله: أبقِ OBS على 1080p، وثبّت البطاقة لحظة عند الكشف عنها، وبعد ذلك فقط أرخِ --result-threshold (الافتراضي 0.9؛ القيمة الأعلى تُبقي مطابقات أضعف، و1.0 تُبقي كل شيء).
البطاقة نفسها يجري التعرّف عليها مرتين
أعطى مرشّح الهوية اللقطتين درجة دون --similarity-threshold (الافتراضي 0.85) فعدّها بطاقة جديدة. اخفضه قليلًا. وإن كنت تضع البطاقة ثم ترفعها من جديد، فارفع --forget-after بدلًا من ذلك: بعد غياب ثانيتين تُعامَل البطاقة على أنها جديدة، وهذا مقصود.
لا يُكتشف شيء على الإطلاق
شغّله مع --show-detection ليرسم مربع الإحاطة: الكشف يعمل دائمًا، لكنه لا يُرسم افتراضيًا. غياب المربع يعني أن البطاقة صغيرة جدًا أو سريعة جدًا في الإطار، ومربع بلا مطابقة يحيلك إلى الصف السابق.
ما زلت عالقًا؟ ملف README يوثّق كل الخيارات، ومركز التوثيق يرتّبها بحسب ما تحاول فعله.