নিজের Whatnot বা Fanatics Live স্ট্রিম বিশ্লেষণ করুন
cardstream কখনো Whatnot, Fanatics Live বা অন্য কোনো মার্কেটপ্লেসে লগইন করে না। আপনি তাদের যে ভিডিও আগে থেকেই পাঠাচ্ছেন, এটি আপনার নিজের কম্পিউটারে বসে সেটিই দেখে, আর টেবিলে পড়া প্রতিটি কার্ডের নাম বলে দেয়। শূন্য থেকে লাইভ ওভারলে পর্যন্ত পুরো পথটা এখানে: মিনিট পনেরো লাগে, তা-ও একবারই।
ক্যামেরার কাছে একটি কম্পিউটার
macOS, Linux বা Windows। তাতে আগে থেকেই OBS চালালে সেটিই ঠিক কম্পিউটার; বিশ্লেষণ লোকালভাবেই হয়, তাই কোনো কিছু কোথাও পাঠাতে হয় না।
যে ভিডিও আগে থেকেই পাঠান
OBS‑এর একটি সিন, ওয়েবক্যাম, ক্যাপচার কার্ড বা এনকোডার। আপনার যা আছে, cardstream সেখান থেকেই কপি নেয়; শো নতুন করে সাজাতে বলে না।
একটি Ximilar API কী
পুরো সিস্টেমের একমাত্র ক্রেডেনশিয়াল, আর সেটি আপনার কম্পিউটারেই থাকে। মার্কেটপ্লেসের অ্যাকাউন্ট নয়, পাসওয়ার্ড নয়, চ্যাটে কোনো বটও নয়।
আগে একে আলাদাভাবে চালু করুন
শোয়ে হাত দেওয়ার আগে ল্যাপটপের ওয়েবক্যামে দেখে নিন, এটি ঠিকঠাক কাজ করছে। তিনটি কমান্ড।
ইনস্টল করুন
স্ক্রিপ্ট ~/.cardstream ফোল্ডারে একটি venv বানায়, রিলিজ wheel তার চেকসামের সঙ্গে মিলিয়ে দেখে, মডেল ওয়েট নামিয়ে আনে আর কমান্ডগুলো আপনার PATH‑এ বসিয়ে দেয়। wheel, Docker ও সোর্স থেকে ইনস্টলের উপায় ডাউনলোড পেজে আছে।
$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh API কী যোগ করুন
শনাক্তকরণ ডিফল্টভাবে Ximilar collectibles/v2 দিয়ে চলে, চাইলে তার জায়গায় আপনার নিজের সিস্টেম। পুরো সিস্টেম একটিমাত্র এনভায়রনমেন্ট ভেরিয়েবল পড়ে, XIMILAR_API_KEY; এটি শেল প্রোফাইলে রেখে দিন, যাতে শোয়ের রাতে রিবুট হলেও থেকে যায়।
$ export XIMILAR_API_KEY=your-key
ল্যাপটপের সামনে একটি কার্ড ধরুন
এতে ল্যাপটপের নিজস্ব ওয়েবক্যামে ব্রাউজার UI খোলে। একটি কার্ড মুহূর্তখানেক স্থির ধরে রাখুন: ওভারলেতে দেখবেন স্টেট মেশিন সিদ্ধান্ত নিচ্ছে, তারপর আসছে নাম, সেট ও কনফিডেন্স, আর ম্যাচের পাশে শনাক্তকরণ কলে লাগা সময়। পুরো প্রোডাক্ট এটুকুই; এই পেজের বাকিটা শুধু পিক্সেলগুলো কোথা থেকে আসবে, তা নিয়ে।
$ cardstream-web # → http://127.0.0.1:8001
একে আপনার শোয়ের দিকে ঘুরিয়ে দিন
একটি সারি বেছে নিন। কোনটি, তা নির্ভর করে একটিই প্রশ্নের ওপর: আপনি ডেস্কটপ থেকে স্ট্রিম করেন, নাকি ফোন থেকে?
যা করা যাবে না
cardstream‑কে আপনার Whatnot বা Fanatics‑এর পাবলিক প্লেব্যাক পেজের দিকে তাক করা। নিজের শোয়ের জন্য বাইরে যাওয়া কোনো স্ট্রিম URL নেই, আর প্লেয়ার থেকে ছবি টেনে নিলে কয়েক সেকেন্ড দেরি যোগ হতো, প্ল্যাটফর্মের শর্তের প্রশ্ন তো আছেই। নিচের প্রতিটি উপায় আপনার ভিডিও ধরে মার্কেটপ্লেসে পৌঁছানোর আগেই; ঠিক সে কারণেই cardstream‑এর তাদের কাছ থেকে কোনো অ্যাকাউন্ট, পাসওয়ার্ড বা API কী লাগে না।
OBS‑এর ভার্চুয়াল ক্যামেরা
OBS আপনার সাজানো সিনটিকে অপারেটিং সিস্টেমের কাছে সাধারণ একটি ওয়েবক্যাম হিসেবে তুলে ধরতে পারে। cardstream তখন সেটি অন্য যেকোনো ক্যামেরার মতোই খোলে: দ্বিতীয়বার এনকোড নেই, এনকোডারে বাড়তি চাপ নেই, ffmpeg ইনস্টল করারও দরকার নেই।
- OBS‑এর কন্ট্রোল ডকে Start Virtual Camera-এ ক্লিক করুন (বাংলা OBS‑এ “ভার্চুয়াল ক্যামেরা শুরু করুন”)।
- এরপর সেটির ওয়েবক্যাম ইনডেক্স দিয়ে cardstream চালান। ইনডেক্স 0 সাধারণত ল্যাপটপের নিজস্ব ক্যামেরা, তাই ভার্চুয়ালটি সচরাচর 1; নিজের সিন না দেখা পর্যন্ত 0, 1, 2 চেষ্টা করুন।
$ cardstream-web --source 1 কাজটি শোয়ের মাঝখানে নয়, আগেই একবার করে দেখুন: macOS‑এ টার্মিনালের ক্যামেরার অনুমতি লাগে, আর আপনার কম্পিউটারে OpenCV ভার্চুয়াল ডিভাইসটি খুলতে না পারলে উপায় B সবখানেই চলে।
OBS থেকে দ্বিতীয় একটি আউটপুট
cardstream আপনার নিজের কম্পিউটারেই অপেক্ষায় থাকে, আর OBS তাতে একটি কপি পুশ করে। Whatnot বা Fanatics আগে যা পেত, হুবহু তা-ই পেতে থাকে; এটি একটি বাড়তি টার্গেট, কখনোই পথ বদলে দেওয়া নয়।
- আগে লিসেনার চালু করুন; এটি পুশের অপেক্ষায় থাকে আর নিজে থেকেই আবার যুক্ত হয়।
- OBS‑এ Stream আউটপুট একটিই, তাই কপিটি পাঠান দ্বিতীয় আরেকটি থেকে: হয়
obs-multi-rtmpপ্লাগইন, নয়তো Settings → Output → Recording → Custom Output (FFmpeg), টাইপ Output to URL, URLrtmp://127.0.0.1:1935/live, কনটেইনারflv; এরপর Start Recording চাপুন। বাংলা OBS‑এ পথটি: সেটিংস → আউটপুট → রেকর্ড হচ্ছে → পছন্দসই আউটপুট (FFmpeg), ধরন “ইউআরএল আউটপুট”, তারপর “রেকর্ডিং শুরু করুন”। - এই উপায়ে সিস্টেমের 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:// সরাসরি পুল করা হয়, আর সেটআপ নিজের বানানো হলে ws:// JPEG ফিডও। আবার যুক্ত হওয়ার সময় সীমিত ব্যাকঅফ রাখা হয়, তাই বক্স ব্রেকের মাঝখানে স্টুডিওর লিংক কেটে গেলে আপনি হাত না লাগালেও তা ফিরে আসে।
- এনকোডার আগে থেকেই যে URL‑এ পাবলিশ করে, সেটি দিন।
- ব্রাউজার পেজটি তখন শুধু দেখার জানালা; কোনো ব্রাউজার খোলা না থাকলেও বিশ্লেষণ চলে।
$ cardstream-web \ --source rtsp://studio/stream1
যে শো চালাচ্ছেন, তার জন্য টিউন করে নিন
ডিফল্টগুলো ভরসা করার মতো, কিন্তু বক্স ব্রেক তো সাধারণ কোনো ক্যামেরা ফিড নয়; কী খুলতে যাচ্ছেন, তা সাধারণত খোলার আগেই আপনার জানা থাকে।
কী ব্রেক করছেন, বলে দিন
গেম বা সেট প্রিফিল করলে খোঁজার পরিসর ছোট হয়: কল দ্রুত হয়, ম্যাচ ভালো হয়। নিয়ম একটাই: --game দিলে সব সময় সঙ্গে --alphabet দিন, কারণ গেম প্রিফিল করলে এন্ডপয়েন্টের নিজের লিপি শনাক্ত করা বন্ধ হয়ে যায় আর সে তখন ধরে নেয় latin; ফলে একটি জাপানি কার্ড তার ইংরেজি সংস্করণের সঙ্গে মিলে যাবে।
$ cardstream-web --source 1 \ --game "Pokémon" --alphabet japanese --set-code M4
স্ট্রিমের মাঝখানে মত বদলান
পরের লট অন্য গেমের হলে কিছুই রিস্টার্ট করতে হয় না: ক্যাটাগরি, গেম, সেট কোড, লিপি, আর ফল ও শার্পনেসের থ্রেশহোল্ড, সবই স্ট্রিম চলতে চলতেই ব্রাউজারের সেটিংস ডায়ালগে বদলানো যায়। বাকি সব (ডিটেক্টর, ফিল্টার, রেজোলিউশন) পড়া হয় একবারই, চালু করার সময়; তাই ওগুলো এখনই ঠিক করে নিন।
লগ রাখুন, পোর্ট বন্ধ রাখুন
--split-results দিলে একই কার্ড বারবার এলেও সেগুলো এক সারিতে মেশে না, প্রতিবারের জন্য আলাদা সারি হয়: যা যা দেখিয়েছেন, যে ক্রমে দেখিয়েছেন, তার একটি চলমান তালিকা, পরে অর্ডারের সঙ্গে মিলিয়ে নেওয়ার জন্য তৈরি। --host তার ডিফল্ট 127.0.0.1-এই রেখে দিন: ওই প্রসেসের কাছে আপনার API কী থাকে আর লোকাল UI‑তে কোনো লগইন নেই, তাই আপনার LAN থেকে এটি যেন কখনো নাগালে না আসে।
$ cardstream-web --source 1 --split-results পরদিন সকালের জন্য শো সেভ করুন
--ximilar-stream NEW যোগ করুন, তাহলে ওই ইতিহাসের প্রতিটি সারি (কার্ড, তার দাম, কতক্ষণ স্ট্রিমে ছিল আর যে ক্রপ থেকে সেটি শনাক্ত হয়েছিল) স্ট্রিম চলতে চলতেই আপনার Ximilar অ্যাকাউন্টের একটি সেশনে সেভ হয়। পরে Ximilar অ্যাপের Cardstream অংশে পুরো শো দেখা যায় (তার মোট মূল্য, সবচেয়ে দামি কার্ডগুলো আর ছবিসহ প্রতিটি কার্ড); কী বিক্রি হলো তা চিহ্নিত করা আর ভুল ম্যাচ ঠিক করার জায়গাও সেটিই। শোয়ের মাঝখানে ক্লায়েন্ট রিস্টার্ট হলে NEW-এর জায়গায় আগে দেখানো সেশন id দিয়ে আবার চালু করুন, একই শো চলতে থাকবে। টিমের ওয়ার্কস্পেসে সেভ করতে লাগে --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‑এ System Settings → Privacy & Security থেকে টার্মিনালকে ক্যামেরা ব্যবহারের অনুমতি দিন। তবু OpenCV খুলতে না পারলে উপায় B‑তে যান।
“ffmpeg not found”
শুধু --listen আর --ffmpeg সিস্টেমের বাইনারি চালায়। সেটি ইনস্টল করে (brew install ffmpeg) আবার চালান; ভার্চুয়াল ক্যামেরা, ওয়েবক্যাম আর সাধারণ পুলের উপায়গুলোতে বাড়তি কিছু লাগে না।
OBS দ্বিতীয় স্ট্রিম যোগ করতে দিচ্ছে না
এটি OBS‑এর সীমাবদ্ধতা, cardstream‑এর নয়; OBS‑এ Stream আউটপুট একটিই। obs-multi-rtmp প্লাগইন সত্যিকারের বাড়তি টার্গেট যোগ করে; আর উপায় B‑এর Custom Output (FFmpeg) রেকর্ডিং পথটি কোনো প্লাগইন ছাড়া OBS‑এই চলে।
কার্ড খুঁজে পাওয়া যায়, কিন্তু কখনো মেলে না
প্রায় সব সময়ই কারণ রেজোলিউশন বা নড়াচড়া। যে ফ্রেম পাঠাচ্ছেন, তাতে কার্ড নম্বর পড়ার মতো স্পষ্ট হতে হবে: OBS 1080p‑তে রাখুন, কার্ড দেখানোর সময় মুহূর্তখানেক স্থির ধরে রাখুন, আর তার পরেই কেবল --result-threshold ঢিলে করুন (ডিফল্ট 0.9; মান বাড়ালে দুর্বল ম্যাচও থাকে, 1.0 দিলে সবই থাকে)।
একই কার্ড দুবার শনাক্ত হচ্ছে
পরিচয় ফিল্টার দুটি দৃশ্যের সাদৃশ্য --similarity-threshold থ্রেশহোল্ডের (ডিফল্ট 0.85) নিচে পেয়েছে, তাই একে নতুন কার্ড ধরে নিয়েছে। মানটি একটু কমান। আর কার্ড নামিয়ে রেখে আবার তুললে এমন হলে বরং --forget-after বাড়ান; 2 সেকেন্ড চোখের আড়ালে থাকলে কার্ডকে নতুন ধরা হয়, নকশাটাই এমন।
কিছুই ডিটেক্ট হচ্ছে না
বক্স আঁকা দেখতে --show-detection দিয়ে চালান: ডিটেকশন সব সময়ই চলে, শুধু ডিফল্টভাবে আঁকা হয় না। বক্স না এলে বুঝবেন কার্ড ফ্রেমে খুব ছোট বা খুব দ্রুত নড়ছে; বক্স আছে অথচ ম্যাচ নেই, এমন হলে ওপরের “কার্ড খুঁজে পাওয়া যায়, কিন্তু কখনো মেলে না” অংশটি দেখুন।
এখনো আটকে আছেন? README-তে প্রতিটি ফ্ল্যাগের বিবরণ আছে, আর ডকস হাবে সেগুলো আপনার কাজ অনুযায়ী সাজানো আছে।