Media Transport Library (MTL) เป็นโซลูชันที่ใช้ซอฟต์แวร์ซึ่งออกแบบมาเพื่อการรับส่งข้อมูลสื่อที่มีอัตราความเร็วสูง เวลาแฝงต่ำ โดยนำเสนอสแต็ก LibOS UDP พื้นที่ผู้ใช้ที่มีประสิทธิภาพซึ่งสร้างขึ้นเป็นพิเศษสำหรับการขนส่งสื่อ และมาพร้อมกับการใช้งานที่สอดคล้องกับ SMPTE ST 2110 ในตัวสำหรับสื่อระดับมืออาชีพผ่านเครือข่าย IP ที่มีการจัดการ
Media Transport Library แก้ปัญหาด้านเวลาที่เข้มงวดในการขนส่งสตรีมสื่อที่สอดคล้องกับมาตรฐาน ST2110 โดยใช้ไลบรารีซอฟต์แวร์และผ่านเครือข่าย IP แทนที่จะใช้ฮาร์ดแวร์พิเศษ ไลบรารีนี้ใช้ประโยชน์จากแพลตฟอร์ม CPU ที่มีอยู่ทั่วไปที่มีอยู่กับ NIC ทั่วไปที่รวมการจำกัดอัตราเพื่อตอบสนองความท้าทายด้านเวลาที่เข้มงวดในมาตรฐาน SMPTE ST 2110
หากคุณเห็นคุณค่าในโครงการของเรา โปรดพิจารณาให้ดาวแก่โครงการนี้ การสนับสนุนของคุณช่วยให้เราเติบโตและเข้าถึงผู้คนมากขึ้นในชุมชนโอเพ่นซอร์ส ดาวทุกดวงมีความสำคัญและได้รับการชื่นชมอย่างมาก
แบ็กเอนด์เส้นทางข้อมูลที่รองรับ: DPDK PMD, ซ็อกเก็ตเคอร์เนลดั้งเดิมและ AF_XDP พร้อมตัวกรอง eBPF
สแต็ก LibOS UDP ในพื้นที่ผู้ใช้มี API ที่เข้ากันได้กับซ็อกเก็ต POSIX
การรันที่ไม่ใช่รูท
การจัดการหลายกระบวนการ อนุญาตให้มี NIC สูงสุด 8 ตัวต่อกระบวนการ
การสนับสนุนการจำลองเสมือนโดย SR-IOV
โปรโตคอล PTP ในตัวพร้อมการถ่ายโอนการประทับเวลาฮาร์ดแวร์
ปลั๊กอิน FFMPEG, ปลั๊กอิน OBS (Open Broadcaster Software) และรองรับ Intel® Media SDK
นอกเหนือจาก C/C++ API แบบเนทีฟแล้ว ยังมีการเชื่อมโยงสำหรับ Python และ Rust อีกด้วย
จังหวะที่แคบและกว้าง โปรดดูหน้าการปฏิบัติตามข้อกำหนดสำหรับรายงานแคบของ ST2110 เกี่ยวกับโซลูชันซอฟต์แวร์ของเรา
ST2110-10, ST2110-20, ST2110-21, ST2110-30, ST2110-40, ST2022-7.
1080p, 1080i, 720p, 4k, 8k และอื่นๆ
เฟรมต่อวินาที: 120, 119.88, 100, 60, 59.94, 50, 30, 29.97, 25, 24, 23.98.
รองรับรูปแบบวิดีโอทั้งหมดที่อยู่ใน ST2110-20 รวมถึง YUV 4:2:2 10 บิตและอื่นๆ
ตัวแปลงพื้นที่สี SIMD ระหว่าง big-endian และ little-endian
ST2110-22 พร้อมอินเทอร์เฟซปลั๊กอินตัวเข้ารหัส/ตัวถอดรหัส
ST2022-6 โดยอินเทอร์เฟซการส่งผ่าน RTP
ตัวแยกวิเคราะห์การปฏิบัติตามกำหนดเวลา ST2110-20 RX พร้อมออฟโหลดการประทับเวลา RX ของฮาร์ดแวร์
Media Transport Library ใช้ประโยชน์จาก DPDK (Data Plane Development Kit) EAL (Environment Abstraction Layer รวมถึงหน่วยความจำและการจัดการหลัก) เพื่อปรับใช้โซลูชันการขนส่งสื่อที่มีประสิทธิภาพสูง แบบเรียลไทม์ และมีความหน่วงต่ำ สแต็กการขนส่งสื่อที่ใช้ซอฟต์แวร์นี้ช่วยให้สามารถปรับใช้ในสภาพแวดล้อม Edge และคลาวด์ได้โดยใช้ฮาร์ดแวร์ COTS
ไลบรารีรวมเลเยอร์แบ็กเอนด์พาธข้อมูลเสมือน ซึ่งออกแบบมาเพื่อสรุปการใช้งาน NIC ต่างๆ และจัดเตรียมอินเทอร์เฟซ TX/RX แบบรวมแพ็คเก็ตให้กับเลเยอร์เครือข่ายด้านบน ปัจจุบันรองรับอุปกรณ์ NIC สามประเภท:
ไดรเวอร์โหมดโพลล์ DPDK (PMDs): ไดรเวอร์เหล่านี้สามารถข้ามสแต็คเครือข่ายของเคอร์เนลได้อย่างสมบูรณ์ โดยใช้ไดรเวอร์ 'โหมดสำรวจความคิดเห็น' วิธีการนี้ช่วยให้สามารถเข้าถึงฮาร์ดแวร์ได้โดยตรง ลดการสลับบริบทของผู้ใช้/เคอร์เนลจำนวนมาก และหลีกเลี่ยงสวิตช์ IRQ (คำขอขัดจังหวะ) ด้วยเหตุนี้ DPDK PMD จึงมีความหน่วงต่ำเป็นพิเศษและปริมาณงานสูง ทำให้เหมาะสำหรับแอปพลิเคชันเครือข่ายที่มีความต้องการสูง
Native Linux Kernel Network Socket Stack: ตัวเลือกนี้รองรับระบบนิเวศเคอร์เนลเต็มรูปแบบ
AF_XDP พร้อมตัวกรอง eBPF: AF_XDP แสดงถึงความก้าวหน้าที่สำคัญในกลุ่มเครือข่าย Linux โดยสร้างความสมดุลระหว่างประสิทธิภาพดิบและการบูรณาการกับระบบนิเวศเครือข่ายของเคอร์เนล สิ่งนี้มีประโยชน์อย่างยิ่งในสถานการณ์ที่ประสิทธิภาพเป็นสิ่งสำคัญ แต่โซลูชันเคอร์เนลบายพาสแบบเต็มเช่น DPDK นั้นไม่สามารถทำได้หรือเป็นที่ต้องการ
ไลบรารีแนะนำตัวกำหนดเวลาแบบอะซิงโครนัสตามงานซึ่งจะปรับการใช้ทรัพยากร CPU ให้เหมาะสม อำนวยความสะดวกในการรวมเข้ากับหน่วยประมวลผลแพ็คเก็ตและตัวเร่งความเร็วต่างๆ
นอกจากนี้ โมดูลการกำหนดจังหวะแพ็คเก็ตยังสนับสนุนอัลกอริธึมการกำหนดจังหวะต่างๆ รวมถึง RL (Rate Limit) ซึ่งได้รับการถ่ายโอนข้อมูลด้วยฮาร์ดแวร์บางส่วน และ TSC (ตัวนับการประทับเวลา) ซึ่งใช้ซอฟต์แวร์เต็มรูปแบบ
MTL ยังรวมเอา SIMD (คำสั่งเดียว, หลายข้อมูล) สำหรับ CSC (การแปลงรูปแบบพื้นที่สี) ของ big-endian และ little-endian, DMA (Direct Memory Access) และอินเทอร์เฟซปลั๊กอิน ช่วยให้สามารถสร้างระบบนิเวศการผลิตวิดีโอที่ครอบคลุมได้
สำหรับการออกแบบรายละเอียด โปรดดูคู่มือการออกแบบ
MTL นำเสนอการสนับสนุนอีเธอร์เน็ตที่หลากหลาย ด้วยความเข้ากันได้กับ DPDK PMD, ซ็อกเก็ตเคอร์เนล และแบ็กเอนด์ AF_XDP
สำหรับการรองรับ DPDK PMD คุณสามารถดูรายการฮาร์ดแวร์อีเทอร์เน็ตที่รองรับได้ที่ไซต์ DPDK PMD https://doc.dpdk.org/guides/nics/
ในกรณีที่ DPDK ไม่รองรับ NIC ของคุณ MTL จะมีตัวเลือกสำรองพร้อมรองรับการขนส่งซ็อกเก็ตเคอร์เนล (Linux)
อย่างไรก็ตาม โปรดทราบว่าการพัฒนาและการตรวจสอบรายวันของเรานั้นดำเนินการบนซีรีส์ Intel E810 และ AWS ENA เป็นหลัก ดังนั้นเราจึงไม่สามารถรับประกันสถานะของการ์ดอินเทอร์เฟซเครือข่าย (NIC) อื่นๆ ได้
จุดสำคัญที่ควรทราบคือ รองรับเฉพาะซีรีส์ Intel E810 ร่วมกับ DPDK PMD เท่านั้น เนื่องจากฟีเจอร์จำกัดอัตรา การใช้งานประเภทอื่นๆ ทั้งหมดต้องใช้ TSC (ตัวนับการประทับเวลา) เป็นแหล่งการกำหนดอัตรา ซึ่งสามารถรับประกันได้เฉพาะการกำหนดอัตราแบบกว้างเท่านั้น
โปรดดูคู่มือการสร้างสำหรับคำแนะนำเกี่ยวกับวิธีการสร้าง DPDK ไลบรารี และแอปพลิเคชันตัวอย่าง
สำหรับ Windows โปรดดูคู่มือการสร้าง Win สำหรับคำแนะนำเกี่ยวกับวิธีการสร้าง
โปรดดูคำแนะนำเกี่ยวกับวิธีการตั้งค่าและเรียกใช้แอปพลิเคชันไปป์ไลน์สาธิตตามแบ็กเอนด์ DPDK PMD
สำหรับ Windows โปรดดูคู่มือการใช้งาน Windows
นอกจากนี้ โปรดดูคำแนะนำ VM และคู่มือ Windows VM สำหรับคำแนะนำในการตั้งค่า Linux และ Windows guest VM ตาม VF passthrough
สำหรับ AWS (สภาพแวดล้อมระบบคลาวด์) โปรดดูคู่มือการเรียกใช้ AWS เพื่อดูคำแนะนำเกี่ยวกับวิธีการตั้งค่าและเรียกใช้การสาธิต
หากต้องการเรียกใช้ไลบรารีนี้บนสแต็กเครือข่ายเคอร์เนลด้วยไดรเวอร์เคอร์เนล NIC ในตัว โปรดปฏิบัติตามคำแนะนำที่ให้ไว้ในคู่มือซ็อกเก็ตเคอร์เนล
หากต้องการพัฒนาแอปพลิเคชันอย่างรวดเร็วโดยใช้ Media Transport Library โปรดดู ## 6. ST2110 API
จากคู่มือการออกแบบ
MTL มีการรองรับสแต็ก UDP พื้นที่ผู้ใช้ที่เข้ากันได้กับ POSIX ที่โหลดล่วงหน้าของ LD ซึ่งทำงานโดยตรงภายในบริบทของกระบวนการปัจจุบัน การปรับปรุงนี้ช่วยเพิ่มประสิทธิภาพได้อย่างมากโดยการขจัดต้นทุนข้อความแบบข้ามคอร์ที่มักเกี่ยวข้องกับสถาปัตยกรรมบริการลูกค้าที่ใช้ในสแต็ก UDP พื้นที่ผู้ใช้อื่นๆ สแต็กของ MTL ช่วยให้ฟังก์ชันการส่งและรับ NIC ทำงานโดยตรงจาก sendto/recvfrom API ซึ่งช่วยลดความจำเป็นในการเรียกข้ามคอร์และรักษาความสัมพันธ์ของข้อมูล (LLC) กับผู้บริโภค UDP จึงเพิ่มประสิทธิภาพการทำงาน
หากต้องการเรียนรู้วิธีใช้สแตก LibOS UDP โปรดดูที่เอกสาร udp
MHV'23: กองการขนส่งสื่อแบบเรียลไทม์ที่ใช้ฮาร์ดแวร์นอกชั้นวางเชิงพาณิชย์ https://dl.acm.org/doi/10.1145/3588444.3591002
เอกสารไวท์เปเปอร์: ไลบรารีโอเพ่นซอร์สเปิดใช้งานสื่อแบบเรียลไทม์ผ่านเครือข่าย IP https://www.intel.com/content/www/us/en/content-details/786203/open-source-library-enables-real-time-media-over-ip-networks.html
การประชุมสุดยอดผู้ใช้ DPDK ปี 2022: สแต็กการขนส่งสื่อแบบเรียลไทม์และความหน่วงต่ำโดยอิงตาม DPDK https://www.youtube.com/watch?v=fiiOvHezpBs
เรายินดีต้อนรับการมีส่วนร่วมของชุมชนในโครงการ Media Transport Library หากคุณมีความคิดหรือปัญหาใด ๆ โปรดแบ่งปันกับเราโดยใช้ปัญหา GitHub หรือเปิดคำขอดึง
ก่อนที่จะเปิดคำขอดึง โปรดทำตามขั้นตอนเหล่านี้:
แยกพื้นที่เก็บข้อมูลนี้ไปยังพื้นที่ของคุณเอง
สร้างสาขาใหม่สำหรับการเปลี่ยนแปลงของคุณ
ทำการเปลี่ยนแปลงของคุณและยอมรับมัน
พุชการเปลี่ยนแปลงของคุณไปยังที่เก็บแบบแยกส่วนของคุณ
เปิดคำขอดึงไปยังที่เก็บหลัก
หากคุณไม่ต้องการให้สาขาหลักซิงค์กับอัปสตรีมโดยอัตโนมัติ โปรดไปที่ Actions
และปิดใช้งานเวิร์กโฟลว์ Upstream Sync
เราใช้การดำเนินการ super-linter สำหรับการตรวจสอบสไตล์
สำหรับการเข้ารหัส C/C++ คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อแก้ไขสไตล์ได้อย่างรวดเร็ว:
./format-coding.sh
สำหรับ Python จะใช้ฟอร์แมตเตอร์ black
และ isort
sudo pip ติดตั้งสีดำ sudo pip ติดตั้ง isort sudo pip ติดตั้ง pylint
หลามดำ/ isort หลาม / ค้นหา python/example/ -name "*.py" -exec pylint {} ;
สำหรับภาษาอื่นๆ โปรดตรวจสอบด้วยคำสั่งตัวอย่างต่อไปนี้ภายในคอนเทนเนอร์ Docker:
# super-linterdocker run -it --rm -v "$PWD":/opt/ --entrypoint /bin/bash github/super-lintercd /opt/# echo "shfmt check"find ./ -type f -name " *.sh" -exec shfmt -w {} +# echo "shell check"find ./ -name "*.sh" -exec shellcheck {} ;# hadolint checkhadolint นักเทียบท่า / ubuntu.dockerfile# actionlint checkactionlint# markdownlint checkfind ./ -name "*.md" -exec markdownlint {} -c .markdown-lint.yml ;# find ./ -name "*.md" -exec markdownlint { } --fix -c .markdown-lint.yml ;# textlintfind ./ -name "*.md" -exec textlint {} ;# find ./ -name "*.md" -exec textlint {} --fix ;