วิดีโอวอลล์สุดสร้างสรรค์ที่ทำจาก Chromebook
(varun.ch)- ใช้เวลาประมาณ 3 ปีในการถอดชิ้นส่วนและรีไซเคิล Lenovo ThinkPad 11e Chromebook ที่โรงเรียนแจกและกำลังจะถูกทิ้ง เพื่อสร้างวิดีโอวอลล์ 10 จอ
- แทนที่จะใช้คอนโทรลเลอร์จอภาพแยกต่างหาก ระบบใช้ เมนบอร์ดโน้ตบุ๊ก เดิมขับแต่ละจอ และใช้ระบบซิงก์ผ่านเว็บเพื่อแบ่งวิดีโอเดียวออกเป็น 10 ส่วนแล้วเล่น
c-syncที่ใช้socket.ioเจอปัญหาประสิทธิภาพต่ำ ความต่างของเวลาโหลด latency และปัญหานาฬิการะบบ แต่ทำให้เล่นได้เกือบซิงก์กันโดยหน่วงลูปให้ช้าลงตามไคลเอนต์ที่ช้าที่สุด- ปัญหา enterprise enrolment ของ ChromeOS, ข้อจำกัดของ Developer Mode และปัญหาไฟเมื่อถอดแบตเตอรี่ ถูกเลี่ยงด้วย coreboot, เครื่องมือของ MrChromebox, USB ติดตั้ง Debian อัตโนมัติ และการควบคุมพัดลมด้วย
ectool - แม้ยังเหลือข้อจำกัดเรื่องมุมมองของพาเนล TN, ความต่างของสี และการซิงก์ที่ยังไม่สมบูรณ์แบบ แต่นี่เป็นตัวอย่างของการเปลี่ยนขยะอิเล็กทรอนิกส์ให้เป็นงานติดตั้งที่ใช้งานได้จริงผ่านการร่วมมือและการออกแบบซ้ำหลายรอบ
วิดีโอวอลล์ที่เริ่มจาก Chromebook ที่กำลังจะถูกทิ้ง
- โปรเจกต์เริ่มขึ้นเมื่อโรงเรียนกำลังจะทิ้ง Chromebook รุ่นเก่า และเกิดคำถามว่าจะเอามันมาทำอะไรได้บ้าง
- อุปกรณ์ที่ใช้คือ Lenovo ThinkPad 11e ซึ่งเป็นโน้ตบุ๊กที่โรงเรียนแจก แต่ไม่ได้รับอัปเดตซอฟต์แวร์จาก Google อีกต่อไป
- ส่วนใหญ่แค่โหลดเว็บเพจก็แทบไม่ไหว และยังติด Enterprise Enrolment เก่า ทำให้ใช้งานได้ยากหากไม่มีบัญชี Google ของโรงเรียน
- เป้าหมายคือสร้าง วิดีโอวอลล์ ที่จัดวางหลายหน้าจอให้ทำงานเหมือนจอขนาดใหญ่จอเดียว
วิธีขับจอและการทดลองซิงก์
- ตอนแรกพิจารณาวิธีถอดเฉพาะพาเนลจอของโน้ตบุ๊กออกมา แล้วใช้คอมพิวเตอร์แรง ๆ เครื่องเดียวขับ 10 จอพร้อมกัน
- แต่วิธีนั้นกินเวลาและมีต้นทุนสูง อีกทั้งจอก็ติดอยู่กับโน้ตบุ๊กที่ยังทำงานได้อยู่แล้ว จึงเปลี่ยนมาใช้ เมนบอร์ดโน้ตบุ๊ก ของแต่ละเครื่องขับจอของตัวเอง
- มีการทดลองใช้ VLC streaming ส่งวิดีโอไปยังอุปกรณ์หลายเครื่องในเครือข่ายเดียวกัน แต่ไม่ตรงกับความต้องการของวิดีโอวอลล์
- มันไม่ใช่ระบบที่ออกแบบมาให้วิดีโอ ซิงก์กันอย่างสมบูรณ์แบบ
- ไม่ใช่การเล่นวิดีโอเดียวกันซ้ำบน 10 จอ แต่ต้องแบ่งวิดีโอยาวหนึ่งไฟล์ออกเป็น 10 ส่วน แล้วให้แต่ละจอแสดงอินพุตที่ต่างกัน
จับจังหวะการเล่นด้วย c-sync
- สร้างระบบเซิร์ฟเวอร์/ไคลเอนต์ ExpressJS ชื่อ
c-syncที่ใช้เว็บเพจและsocket.ioเพื่อซิงก์การเล่นวิดีโอระหว่างไคลเอนต์ - โครงสร้างพื้นฐานคือเมื่อเซิร์ฟเวอร์ส่งอีเวนต์
playองค์ประกอบ<video>ของแต่ละไคลเอนต์ก็จะเริ่มเล่น - ตอนทดสอบบนคอมพิวเตอร์เดสก์ท็อป ดูเหมือนจะซิงก์กันได้ค่อนข้างดี แต่บน Chromebook จริงกลับไม่เสถียรพอเพราะประสิทธิภาพไม่เพียงพอ
- เวลาโหลดต่างกัน
- ความหน่วงของเครือข่าย
- ความต่างของนาฬิการะบบ
- วิธีสุดท้ายเปลี่ยนให้แต่ละไคลเอนต์ส่งอีเวนต์
startเมื่อเล่นวิดีโอถึงตอนจบ- ทำให้คอมพิวเตอร์ที่ช้าที่สุดบังคับให้เครื่องที่เร็วต้องรอ เพื่อเผื่อเวลาโหลดวิดีโอ
- แต่ละจอสามารถรับอีเวนต์
startได้ 10 ครั้ง ทำให้จังหวะเริ่มลูปอาจสั่นเล็กน้อย - หากเฟรมแรก ๆ ของวิดีโอเหมือนกัน ผู้ใช้จะแทบสังเกตความต่างไม่ออก
- การตั้งเวลาเล่นตาม timestamp ก็ดูเหมือนทำได้ แต่ Chromebook เหล่านี้ไม่สามารถรักษาเวลาให้ตรงกันระดับมิลลิวินาทีได้อย่างเสถียร จึงใช้งานไม่ได้
งานเฟิร์มแวร์เพื่อออกจาก ChromeOS
- ภายในหนึ่งหรือสองเดือน โปรเจกต์ไปถึงขั้นเปิดเว็บเพจเองแบบแมนนวลและแสดงวิดีโอซิงก์แบบเต็มจอได้
- หากจะใช้เป็นงานติดตั้งจริง เมื่อเสียบไฟต้องบูตอัตโนมัติและเปิดหน้าไคลเอนต์
c-syncเอง - ChromeOS เดิมบูตขึ้นหน้าล็อกอิน Google ที่ถูกล็อกกับโดเมนของโรงเรียน และเมื่อถอดแบตเตอรี่ออก ต่อไฟแล้วเครื่องก็ไม่เปิดเองโดยอัตโนมัติ
- ใช้ ChromeOS Firmware Recovery Script ของ MrChromebox จัดการเมนบอร์ด GLIMMER
- เข้า Recovery Mode
- เปิดใช้ Developer Mode
- รันสคริปต์ใน ChromeOS Shell
- Chromebook บางเครื่องปฏิเสธการเข้า Developer Mode เพราะติด Enterprise Enrolment และแม้เครื่องที่ติดตั้ง Linux สำเร็จ ผ่านไปสักพักการเล่นวิดีโอก็หยุด หรือระบบทั้งระบบค้าง
- วิธีแก้คือถอดสกรู Write Protection ออกจากเมนบอร์ดโน้ตบุ๊กแต่ละเครื่อง แล้วเขียนทับเฟิร์มแวร์เดิมทั้งหมดด้วย
coreboot- กระบวนการนี้ดูเหมือนจะช่วยเลี่ยงข้อจำกัดการลงทะเบียนด้วย
- ต้องทำซ้ำกับคอมพิวเตอร์มากกว่า 20 เครื่อง จึงช้าและยุ่งยาก
- หลังจากนั้น
Wake on ACทำงานเป็นฟีเจอร์ของเฟิร์มแวร์ และการเล่นวิดีโอก็ไม่สุ่มเสียอีก
สร้าง Linux kiosk ที่บูตอัตโนมัติ
- ตอนแรกใช้สคริปต์เริ่มต้นที่เปิด Chromium และจำลองการกดคีย์เพื่อทำให้เป็นเต็มจอ
- เคยใช้
FullPageOSในโปรเจกต์ก่อนหน้า แต่ใช้กับฮาร์ดแวร์ x86 ไม่ได้ - Porteus Kiosk เป็นดิสโทร Linux ขนาดเล็กที่รัน Chromium แบบเต็มจอได้ และตั้งค่า flag เพื่ออนุญาตให้เล่นวิดีโอโดยไม่ต้องมีการโต้ตอบจากผู้ใช้ จึงทำงานได้ดี
- อย่างไรก็ตาม Porteus Kiosk มีอุปสรรคต่อการใช้งานในงานติดตั้งจริง
- เปลี่ยน splash screen ที่แสดงโลโก้ Porteus ตอนบูตทุกครั้งไม่ได้
- หลังติดตั้งแล้วไม่สามารถทำงานระยะไกล เช่น เปลี่ยน URL ของหน้าเว็บได้ ซึ่งอาจเป็นปัญหาหลังติดตั้งบนผนังแล้ว
- เพื่อสร้างคอนฟิกที่ใกล้เคียงดิสโทรของตัวเอง จึงลองใช้ระบบขั้นต่ำที่ไม่ต้องมี desktop environment และรัน Chromium โหมด kiosk อัตโนมัติ
- NixOS ติดตั้งไม่สำเร็จเพราะพื้นที่เก็บข้อมูลของ Chromebook มีขนาดเล็ก
- จากนั้นเขียนสคริปต์ provision โดยอิงจาก Debian minimal install
- สร้าง
KIOSK_ID - ตั้ง hostname เป็น
csync-client-$KIOSK_ID - เชื่อมต่อ WiFi ของโรงเรียน
- สร้างผู้ใช้และสิทธิ์
- เริ่ม Chromium แบบ kiosk เต็มจออัตโนมัติด้วย
openbox
- สร้าง
- เพราะการติดตั้ง Debian แบบแมนนวลยุ่งยาก จึงใช้ FAI - Fully Automatic Installation และ FAI.me
- สุดท้ายได้ USB เดียวที่เมื่อเสียบเข้ากับ Chromebook ที่ติดตั้ง
corebootแล้ว จะ provision เป็นไคลเอนต์c-syncโดยอัตโนมัติ - เพิ่ม controller เข้าไปใน
c-syncเพื่อจัดการไคลเอนต์ที่เชื่อมต่ออยู่และกำหนดวิดีโอให้แต่ละไคลเอนต์ - หลัง stress test 3 วันโดยที่การเล่นยังลื่นไหล จึงย้ายไปขั้นตอนติดตั้งบนผนัง
การติดตั้ง แหล่งจ่ายไฟ และการจัดการความร้อน
- ฮาร์ดแวร์สำหรับติดตั้งออกแบบโดย Aksel Salmi โดยใช้โครงสร้างที่แขวนเมนบอร์ดและจอแสดงผลไว้บนผนังได้
- แหล่งจ่ายไฟทำโดยต่อสายเพื่อให้อะแดปเตอร์แต่ละตัวจ่ายไฟให้คอมพิวเตอร์ได้สองเครื่อง
- หลังติดตั้ง ปัญหาใหญ่ที่สุดคือความร้อน และหลังจากกระบวนการลบเฟิร์มแวร์ พัดลมของโน้ตบุ๊กก็ไม่หมุน
- สามารถเข้าถึง ChromeOS Embedded Controller ได้ด้วย
ectoolจึงตั้งความเร็วพัดลมเองได้ - เอกสารออนไลน์มีน้อย และ
ectoolของcorebootกับของฝั่ง Google ต่างกัน ทำให้สับสน แต่ไบนารีที่ได้มาผ่าน Wayback Machine ใช้ตั้งความเร็วพัดลมได้ตามปกติ - หลังทดสอบแล้วพบค่าความเร็วพัดลมที่สมดุลระหว่างเสียงรบกวนกับอุณหภูมิ
การผลิตวิดีโอสำหรับ 10 จอ
- ความละเอียดของแต่ละจอคือ 1366×768 และวิดีโอรวมสำหรับทั้ง 10 จอจึงเป็น 13660×768
- ซอฟต์แวร์ที่ตัดต่อวิดีโอกว้างขนาดนี้ได้มีไม่มาก และในทางปฏิบัติใช้ได้แค่ Final Cut Pro กับ Blender
- หลังเรนเดอร์วิดีโอเต็มความกว้างแล้ว ใช้
ffmpegตัดเป็น 10 ช่วงและกำหนดให้แต่ละจอ - สคริปต์แบ่งไฟล์สร้างเซกเมนต์ตามตำแหน่งของแต่ละจอในรูปแบบ
crop=1366:768:x_offset:0
ผลลัพธ์ที่เสร็จสมบูรณ์และข้อจำกัดที่เหลือ
- วิดีโอวอลล์ที่เสร็จแล้วมีทั้งลำดับการบูต กระบวนการที่ดูเหมือนการปรับเทียบตัวเอง การเล่นวิดีโอแบบซิงก์ รวมถึง enclosure และการเดินสายเคเบิล
- ผลลัพธ์ยังไม่สมบูรณ์แบบ
- มุมมองของพาเนล TN ไม่ดีนัก
- สีของแต่ละจอแตกต่างกัน
- การซิงก์ยังไม่สมบูรณ์แบบ
- การตัดสินใจแต่ละอย่างอาจมีทางเลือกที่ดีกว่า
- ถึงอย่างนั้น โปรเจกต์ก็เปลี่ยน ขยะอิเล็กทรอนิกส์ ให้เป็นงานติดตั้งที่น่าสนใจ และกลายเป็นผลงานที่แสดงให้เห็นการออกแบบซ้ำและการทำงานร่วมกันเป็นทีม
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ขอแสดงความยินดีที่ทำโปรเจกต์สนุก ๆ นี้สำเร็จ ผมเคยทำงานด้าน การซิงก์สื่อ ข้ามอุปกรณ์หลายเครื่องมามาก เลยสนุกเสมอที่ได้เห็นว่าผู้คนคิดวิธีแก้ปัญหากันอย่างไร
วิธีมาตรฐานในอุตสาหกรรมสำหรับทำวิดีโอวอลล์แบบซิงก์กันเช่นนี้คือใช้ เครื่องเล่นสื่อ BrightSign แต่ถ้าเป็นจอราว 20 จอ แค่ค่าเครื่องเล่นกับจอก็พุ่งไปถึงหลายหมื่นดอลลาร์ได้ง่าย ๆ จุดที่ทำให้มันทำงานได้ด้วยอุปกรณ์รีไซเคิลนั้นยอดเยี่ยมจริง ๆ
ถ้าสนใจทำงานกับโค้ดเบสที่เกี่ยวกับการซิงก์สื่อ ก็ติดต่อมาได้ เราจ้างนักพัฒนาสัญญาจ้างอิสระค่อนข้างบ่อย
ผมสงสัยมาตลอดว่าสัดส่วนต้นทุนระหว่างฮาร์ดแวร์กับซอฟต์แวร์เป็นอย่างไร และคิดว่าดิจิทัลไซเนจระดับมืออาชีพน่าจะถูกออกแบบโดยคำนึงถึงเรื่องความน่าเชื่อถือและอายุการใช้งานด้วย
ตอน Chromebook เปิดตัว ผมทำงานอยู่ที่ Google และมีการขอไอเดียตกแต่งล็อบบี้ ผมเลยเสนออะไรคล้าย ๆ กันนี้ไป แต่ถูกปฏิเสธ อาจเป็นเพราะผมขอใช้อุปกรณ์ 40–64 เครื่อง ก็ได้
แต่ผมคงไม่ได้พยายามซิงก์วิดีโอ น่าจะทำแอนิเมชันตามเวลาแทน แล้วซิงก์นาฬิกาผ่านเครือข่าย
ดูตัวอย่างได้ที่นี่: https://www.youtube.com/watch?v=64TcBiqmVko
เป็นอุปกรณ์ 8 เครื่องที่รัน Chrome และสิ่งที่ซิงก์กันมีแค่การตั้งค่ากับเวลาเท่านั้น อุปกรณ์ไม่จำเป็นต้องจัดเป็นตารางเสมอไป และได้แรงบันดาลใจจากตู้ปลาจำลองของ Boston Science Museum
เนื้อหาคือ “น่าเสียดายที่ Chromebook เหล่านี้ไม่สามารถรักษาเวลาให้ตรงกันในระดับมิลลิวินาทีได้อย่างเสถียร วิธีนี้จึงใช้กับเราไม่ได้”
อย่างที่บอก จำเป็นต้องมี การซิงก์นาฬิกา ที่ดี และโดยเฉพาะถ้ามีเสียง ความต่าง 20–30ms ก็เห็นชัดมากแล้ว จึงไม่ง่ายนัก แต่ถ้าใช้ NTP/PTP ก็ไปได้ไกลพอสมควร
เจ๋งดี ผมเคยทำอะไรคล้าย ๆ กันด้วยแท็บเล็ต 4x4 และเชื่อมทั้ง 16 เครื่องกับ ADB และโฮสต์เครื่องเดียว แล้วทำให้ส่วนใหญ่เป็นอัตโนมัติได้
หลังจากนั้นผมสร้างหน้าจอเสมือน 16 จอและไคลเอนต์ VNC 16 ตัวใน sway แล้วสตรีมทั้งหมดผ่าน Wi‑Fi เพื่อทดสอบ ซึ่ง Wi‑Fi ทำงานได้ดีเกินคาดจนไม่ได้ไปหาโซลูชันที่มีประสิทธิภาพกว่านั้น
ช่วงนั้นพีซีของผมมีจอแสดงผล 19 จอ โดย 17 จอเป็น VNC ซึ่งอลังการมาก จะสั่งให้ทั้งหมดทำงานเดียวกันก็ได้ หรือใช้แยกกันเป็นเพลง, htop, ปฏิทิน, นาฬิกา, เซสชัน ssh ก็ได้
แต่การจัดการฮาร์ดแวร์ค่อนข้างน่ารำคาญ บางเครื่องโดน throttling บางเครื่องมีปัญหาการเชื่อมต่อ และแบตเตอรี่บางก้อนก็รักษาการชาร์จไว้ไม่ได้
นานมาแล้วมีสิ่งคล้าย ๆ กันชื่อ Junkyard Jumbotron มันช่วยให้เอาจอแสดงผลต่างรุ่นต่างแบบมารวมกัน แล้วแสดงแต่ละส่วนของภาพที่ใหญ่กว่าได้
https://github.com/mitmedialab/Junkyard-Jumbotron
วิดีโอ: https://youtu.be/cAUtSVSTbzU?feature=shared
วิธีส่งรูปสำหรับจัดแนวทางอีเมลก็ดูน่าสนุกไปอีกแบบ
ถ้าแค่อ่านผ่าน ๆ แล้วไม่ได้อ่านบล็อกทั้งหมด โปรเจกต์นี้ทำโดย นักเรียนมัธยมปลาย ระหว่างที่พวกเขายังเรียนอยู่มัธยมปลาย นั่นทำให้มันดูน่าประทับใจยิ่งขึ้น
จากส่วนที่ว่า “ไม่แน่ใจเต็มร้อยว่าทำไมมันถึงทำงานได้ดีขนาดนี้ แต่บังเอิญคิดวิธีแก้ที่ดูไร้สาระขึ้นมาได้” และ “คอมพิวเตอร์ที่ช้าที่สุดคอยดึงคอมพิวเตอร์ที่เร็วที่สุดไว้” เหตุผลที่มันทำงานได้ดีก็เพราะเขาออกแบบระบบให้เหมาะกับคอขวด
ลองดู ทฤษฎีข้อจำกัด
ครั้งหนึ่งผมต้องทำงานคล้าย ๆ กัน โดยจัดทีวีจอสัมผัสขนาดใหญ่ 5 เครื่องให้เหมือนโต๊ะ แต่ละด้านต้องเป็นแอปจอสัมผัสแยกกัน และทั้งหมดต้องเล่นวิดีโอพื้นหลังที่ซิงก์กัน พร้อมให้ผู้ใช้โต้ตอบกับองค์ประกอบที่ไหลจากปลายด้านหนึ่งไปอีกด้านหนึ่ง หรือส่งวัตถุที่พบไปให้ผู้ใช้อีกฝั่งของโต๊ะ
สุดท้ายอุปกรณ์ในงบที่ขับจอทั้งหมดพร้อมกันได้แทบจะมีแค่ Mac Pro ทรงกระบอก เท่านั้น เราเลยใช้มัน และซิงก์แอปต่าง ๆ ด้วย Redis ส่วนนั้นผมเป็นคนเขียนเอง
มันทำงานได้ค่อนข้างดี แต่ผมไม่ได้เห็นของเสร็จก่อนออกจากบริษัท เดิมทีเราอยากซิงก์คอมพิวเตอร์แยกหลายเครื่อง แต่ทำให้เสถียรพอไม่ได้ มันทำงานได้พักหนึ่งแล้วการซิงก์ก็เพี้ยนจากหลายปัจจัย จนต้องรีสตาร์ตแอปเป็นระยะ ๆ ซึ่งทำไม่ได้
ตั้งแต่ยุคพีซียุคแรก ๆ สิ่งที่ผมอยากได้มาตลอดคือความสามารถในการเชื่อมหลายเครื่องผ่านเครือข่ายเพื่อแชร์ทรัพยากรและทำงานร่วมกันมากขึ้น ผมเคยจินตนาการว่าจะใช้คอมพิวเตอร์ทุกเครื่องในสำนักงานเหมือนซูเปอร์คอมพิวเตอร์เพื่อประมวลผลงาน แน่นอนว่านี่เป็นปัญหาที่ยากมาก แอปและระบบปฏิบัติการต้องถูกออกแบบมาแบบนั้น และต้องมีอัลกอริทึมใหม่ ๆ ด้วย ยิ่งเมื่อคิดว่าแค่การใช้ประโยชน์จากโปรเซสเซอร์หลายตัวในเครื่องเดียวบนบอร์ดเดียวกันให้ดี ยังใช้เวลานานมากแล้ว แต่โปรเจกต์อย่าง seti@home หรือ folding@home ก็ทำเรื่องแบบนั้นได้ในระดับหนึ่ง และผมหวังว่าสักวันคอมพิวเตอร์เองจะรองรับสิ่งนี้
จากส่วนที่ว่า “ผมเริ่มทำ ‘ดิสโทรของผมเอง’ ที่ติดตั้งบนแล็ปท็อปได้ ระบบต้องเริ่มจากคอนฟิกขั้นต่ำ และมีสคริปต์ที่เรียบง่ายสำหรับเปิดอินสแตนซ์ Chromium ในโหมด kiosk โดยอัตโนมัติ โดยไม่มีเดสก์ท็อปเอนไวรอนเมนต์ ตอนแรกผมลอง NixOS แต่ก็รู้เร็วมากว่าพื้นที่เก็บข้อมูลของ Chromebook เหล่านี้เล็กเกินไปจนเป็นไปไม่ได้ และการติดตั้งก็ล้มเหลวทุกครั้ง สุดท้ายผมยอมแพ้แล้วเริ่มจากการติดตั้ง Debian แบบขั้นต่ำ แต่ก็รู้ว่าการติดตั้ง Debian ต้องกดปุ่มเยอะมากจนเสียเวลาเกินไป แล้วจึงค้นพบ ‘FAI - Fully Automatic Installation’ กับเครื่องมือเว็บ FAI.me” นั้น DietPi, OpenWrt และ OpenBalena ก็มีตัวเลือกติดตั้งอัตโนมัติสำหรับเลือกแพ็กเกจเฉพาะแล้วติดตั้งลงบน bare metal ขั้นต่ำได้เช่นกัน
ผมก็สงสัยเหมือนกันว่ายังมีตัวเลือกอื่นที่ไม่ใช่เดสก์ท็อปอีกไหม
สิ่งที่น่าสนใจที่สุดคือพอเปลี่ยนไปใช้ coreboot แล้วอาการค้างก็หายไป อยากรู้ว่ามีทฤษฎีไหมว่าทำไม
อาจเกี่ยวกับ ACPI/DSDT หรืออาจเป็นเพราะ BIOS เดิมเริ่มต้นคอนโทรลเลอร์ฮาร์ดแวร์ผิดก็ได้