Phân tích stream Whatnot hoặc Fanatics Live của bạn
cardstream không bao giờ đăng nhập vào Whatnot, Fanatics Live hay bất kỳ sàn nào khác. Nó xem chính luồng video mà bạn đang gửi cho họ, ngay trên máy của bạn, và gọi tên mọi tấm thẻ đặt lên bàn. Đây là toàn bộ chặng đường, từ con số không đến một overlay trực tiếp: khoảng mười lăm phút, làm một lần là xong.
Một máy tính đặt gần camera
macOS, Linux hoặc Windows. Nếu bạn đang chạy OBS trên máy đó thì nó chính là chiếc máy cần dùng: việc phân tích diễn ra cục bộ, nên không có gì phải truyền đi đâu.
Luồng video bạn đang gửi sẵn
Một cảnh OBS, một webcam, một capture card hoặc một encoder. cardstream lấy từ thứ bạn đang có; nó không bắt bạn dàn dựng lại buổi live.
Một API key của Ximilar
Thông tin xác thực duy nhất trong cả hệ thống, và nó nằm lại trên máy của bạn. Không tài khoản sàn, không mật khẩu, không bot trong khung chat.
Cho nó chạy độc lập đã
Trước khi bất cứ thứ gì trong này đụng đến buổi live của bạn, hãy chứng minh nó chạy được với webcam của laptop. Ba lệnh.
Cài đặt
Script dựng một venv trong ~/.cardstream, đối chiếu wheel của bản phát hành với checksum, tải trọng số mô hình và đặt các lệnh lên PATH của bạn. Các cách cài bằng wheel, Docker và từ mã nguồn có ở trang tải về.
$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh Thêm key của bạn
Mặc định, việc nhận diện chạy qua Ximilar collectibles/v2, hoặc qua hệ thống của riêng bạn thay vào đó. XIMILAR_API_KEY là biến môi trường duy nhất được đọc; hãy đặt nó vào shell profile để nó còn đó sau một lần khởi động lại máy đúng tối live.
$ export XIMILAR_API_KEY=your-key
Giơ một tấm thẻ trước laptop
Lệnh này mở giao diện trình duyệt với webcam tích hợp của bạn. Giữ yên một tấm thẻ trong giây lát: overlay cho thấy máy trạng thái đang quyết định, rồi đến tên, set và độ tin cậy, kèm thời gian thực tế của lượt gọi nhận diện ngay cạnh kết quả khớp. Toàn bộ sản phẩm là vậy; phần còn lại của trang này chỉ nói về chuyện các điểm ảnh đến từ đâu.
$ cardstream-web # → http://127.0.0.1:8001
Trỏ nó vào buổi live của bạn
Chọn một hàng. Chọn hàng nào tùy vào đúng một câu hỏi: bạn stream từ máy tính hay từ điện thoại?
Điều bạn không thể làm
Trỏ cardstream vào trang phát công khai của bạn trên Whatnot hay Fanatics. Buổi live của chính bạn không có URL stream đầu ra nào, còn việc cào dữ liệu từ trình phát sẽ thêm vài giây độ trễ, chưa kể đến điều khoản của nền tảng. Mọi cách bên dưới đều lấy video của bạn ở phía trước sàn, và đó chính là lý do cardstream không cần tài khoản, mật khẩu hay API key nào từ họ.
Camera ảo của OBS
OBS có thể đưa cảnh đã dựng của bạn cho hệ điều hành như một webcam bình thường. cardstream mở nó y như mọi camera khác: không encode lần hai, không thêm tải cho encoder và không phải cài ffmpeg.
- Trong OBS, bấm Bắt đầu máy quay ảo (Start Virtual Camera) trong bảng Điều khiển.
- Chạy cardstream với nó qua chỉ số webcam. Chỉ số 0 thường là camera tích hợp, nên camera ảo thường là 1: hãy thử 0, 1, 2 cho đến khi bạn thấy cảnh của mình.
$ cardstream-web --source 1 Hãy thử việc này một lần trước buổi live chứ đừng thử giữa buổi: trên macOS, terminal cần quyền dùng camera, và nếu OpenCV không mở được thiết bị ảo trên máy bạn thì cách B chạy được ở mọi nơi.
Một đầu ra thứ hai từ OBS
cardstream lắng nghe trên chính máy của bạn và OBS đẩy một bản sao sang cho nó. Whatnot hay Fanatics vẫn nhận đúng những gì họ nhận trước đó: đây là một đích bổ sung, không bao giờ là chuyển hướng.
- Khởi động chế độ lắng nghe trước; nó chờ luồng đẩy sang và tự kết nối lại.
- OBS chỉ có một đầu ra Luồng, nên hãy gửi bản sao qua một đầu ra thứ hai: hoặc dùng plugin
obs-multi-rtmp, hoặc vào Thiết đặt → Đầu ra → Ghi hình → Tùy chỉnh đầu ra (FFmpeg), ở mục loại đầu ra FFmpeg chọn Sản lượng để URL (Output to URL), URLrtmp://127.0.0.1:1935/live, định dạng containerflv, rồi bấm Bắt đầu ghi. - Cách này gọi ffmpeg cài trên hệ thống: hãy chạy
brew install ffmpegtrước.
$ cardstream-web --listen \ --source rtmp://0.0.0.0:1935/live
Một camera riêng đặt trên bàn
Điện thoại đẩy thẳng vào ứng dụng thì không cho bạn chỗ nào để trích luồng ra. Vậy nên đừng đuổi theo luồng phát đi nữa, hãy cho cardstream góc nhìn riêng vào cùng chiếc bàn đó: một webcam thứ hai quay từ trên xuống, hoặc cổng HDMI của máy quay nối vào một capture card.
- Hướng một webcam hoặc capture card vào chỗ bạn lật thẻ.
- Chạy nó trên chiếc máy đặt cạnh camera đó.
$ cardstream-web --source 0 Không nhất thiết phải là góc quay người mua của bạn thấy. Một khung hình quay sát từ trên xuống, đủ sáng, nhận diện tốt hơn hẳn một luồng đã bị sàn nén lại.
Bất cứ thứ gì có URL
rtsp://, rtmp:// và srt:// được kéo trực tiếp, cộng thêm luồng JPEG qua ws:// khi dàn máy của bạn là đồ tự chế. Việc kết nối lại dùng thời gian chờ tăng dần có giới hạn, nên một đường truyền studio rớt giữa buổi break sẽ tự quay lại mà bạn không phải đụng tay.
- Đưa cho nó URL mà encoder của bạn đang phát sẵn.
- Trang trình duyệt trở thành một màn hình xem thụ động; việc phân tích vẫn chạy kể cả khi không mở trình duyệt nào.
$ cardstream-web \ --source rtsp://studio/stream1
Tinh chỉnh cho buổi live bạn sắp chạy
Các giá trị mặc định đã ổn, nhưng một buổi break không phải là một luồng camera chung chung: thường thì bạn biết mình sắp khui gì trước khi khui.
Cho nó biết bạn đang break gì
Điền sẵn game hoặc set sẽ thu hẹp việc tìm kiếm: lượt gọi nhanh hơn, kết quả khớp tốt hơn. Chỉ một quy tắc: hễ truyền --game thì luôn truyền --alphabet, vì điền sẵn game sẽ tắt khả năng tự nhận biết hệ chữ viết của endpoint và nó sẽ coi như là latin, nên một tấm thẻ tiếng Nhật sẽ khớp với bản in tiếng Anh.
$ cardstream-web --source 1 \ --game "Pokémon" --alphabet japanese --set-code M4
Đổi ý giữa stream
Khi lô tiếp theo là một game khác, bạn không phải khởi động lại gì cả: danh mục, game, mã set, hệ chữ viết cùng các ngưỡng kết quả và độ nét đều sửa được trong hộp thoại cài đặt trên trình duyệt trong lúc stream đang chạy. Mọi thứ còn lại (bộ phát hiện, bộ lọc, độ phân giải) chỉ được đọc một lần khi khởi động, nên hãy chọn chúng ngay bây giờ.
Giữ lại log, giữ cổng đóng
--split-results cho mỗi lần xuất hiện một dòng riêng thay vì gộp các lần lặp lại: một danh sách liên tục những gì bạn đã đưa lên, theo đúng thứ tự, sẵn để đối chiếu với đơn hàng sau đó. Hãy để --host ở giá trị mặc định 127.0.0.1: tiến trình đó giữ key của bạn và giao diện cục bộ không có xác thực, nên không bao giờ được để mạng LAN của bạn truy cập tới nó.
$ cardstream-web --source 1 --split-results Lưu buổi live cho sáng hôm sau
Thêm --ximilar-stream NEW, và mọi dòng của lịch sử đó, gồm tấm thẻ, giá của nó, thời gian nó ở trên stream và ảnh cắt đã dùng để nhận diện, sẽ được lưu vào một phiên trong tài khoản Ximilar của bạn trong lúc bạn stream. Sau đó, mục Cardstream của ứng dụng Ximilar cho thấy cả buổi live: giá trị của nó, những tấm thẻ giá trị nhất và từng tấm thẻ kèm hình ảnh. Đó cũng là nơi bạn đánh dấu thẻ đã bán và sửa một kết quả sai. Nếu client khởi động lại giữa buổi live, hãy chạy lại nó với id của phiên đã được in ra thay cho NEW, và chính buổi live đó tiếp tục. Để lưu vào workspace của nhóm, dùng --ximilar-workspace.
$ cardstream-web --source 1 --price-stats --ximilar-stream NEW # sau khi khởi động lại: $ cardstream-web --source 1 --price-stats --ximilar-stream <session-id>
Rồi cứ thế chạy buổi live của bạn. Việc phát hiện, bộ lọc chuyển động và bộ lọc trùng thẻ đều chạy cục bộ trên máy bạn; lượt gọi nhận diện chỉ được gửi một lần cho mỗi thẻ bạn đặt lên bàn, tức khoảng một trăm lượt mỗi giờ, so với 54.000 khung hình có trong giờ đó. Phép tính nằm ở đây.
Sáu thứ thật sự hay trục trặc
Camera ảo không có trong danh sách
Hãy lần lượt thử --source 0, 1, 2: chỉ số là do hệ điều hành cấp. Trên macOS, hãy cấp quyền dùng camera cho terminal trong Cài đặt hệ thống → Quyền riêng tư & Bảo mật. Nếu OpenCV vẫn không chịu mở nó, hãy chuyển sang cách B.
“ffmpeg not found”
Chỉ có --listen và --ffmpeg gọi đến tệp thực thi của hệ thống. Hãy cài nó (brew install ffmpeg) rồi chạy lại; các cách dùng camera ảo, webcam và kéo luồng thông thường không cần thêm gì.
OBS không cho tôi thêm stream thứ hai
Đó là giới hạn của OBS chứ không phải của cardstream: nó chỉ có một đầu ra Luồng. Plugin obs-multi-rtmp thêm các đích bổ sung thật sự; còn đường ghi hình qua Tùy chỉnh đầu ra (FFmpeg) ở cách B thì chạy được với OBS nguyên bản.
Tìm thấy thẻ nhưng không bao giờ khớp
Hầu như lúc nào cũng do độ phân giải hoặc chuyển động. Số thẻ phải đọc được trong khung hình bạn gửi đi: hãy giữ OBS ở 1080p, giữ yên tấm thẻ trong giây lát lúc lật, rồi sau đó mới nới --result-threshold (mặc định 0.9; càng cao càng giữ lại kết quả khớp yếu, 1.0 giữ lại tất cả).
Cùng một tấm thẻ bị nhận diện hai lần
Bộ lọc trùng thẻ đã chấm hai góc nhìn dưới mức --similarity-threshold (mặc định 0.85) và coi đó là một thẻ mới. Hãy hạ nó xuống một chút. Nếu bạn đặt tấm thẻ xuống rồi cầm lên lại thì hãy tăng --forget-after: theo thiết kế, sau 2 giây vắng mặt, tấm thẻ được coi là thẻ mới.
Không phát hiện được gì cả
Hãy chạy với --show-detection để vẽ khung bao: việc phát hiện lúc nào cũng chạy, chỉ là mặc định không vẽ ra. Không có khung bao nghĩa là tấm thẻ quá nhỏ hoặc di chuyển quá nhanh trong khung hình; có khung bao mà không có kết quả khớp thì xem mục ngay phía trên.
Vẫn còn kẹt? README ghi lại mọi cờ, còn trang tài liệu gom chúng theo việc bạn đang muốn làm.