FFmpeg รวมการรองรับสตรีมมิง WebRTC (WHIP) แบบหน่วงต่ำมาก
(git.ffmpeg.org)- FFmpeg
avformat/whipมี WHIP muxer เพิ่มเข้ามา ทำให้สามารถจัดการ สตรีมมิงที่มีความหน่วงต่ำกว่า 1 วินาที บนพื้นฐาน WebRTC ได้ภายใน FFmpeg - การเปลี่ยนแปลงอ้างอิง WHIP Version 3 และมีการปรับทั้งชื่อ muxer กับการติดตั้งใช้งาน รวมถึงบริบทล็อกของ SSL·DTLS·RTC และข้อความผิดพลาดด้วย
- magic number ภายใน implementation ถูกแทนที่ด้วย มาโครและฟังก์ชัน และมีการปรับปรุงการจัดการ DTLS curve list, SRTP profile, ICE STUN magic number และ RTP payload type
- ในเส้นทางสื่อ เปลี่ยนจากการใช้ขนาดเฟรมคงที่มาใช้
rtc->audio_par->frame_sizeและใช้ h264_mp4toannexb สำหรับการแปลง Annex B ของอินพุต MP4/ISOM - การตั้งค่าบิลด์ถูกเปลี่ยนให้
whipเปิดใช้ เฉพาะเมื่อเปิดใช้ DTLS เท่านั้น และปัจจุบันจำกัดการรองรับไว้ที่ OpenSSL
เพิ่ม WHIP muxer และเชื่อมกับระบบบิลด์
- เพิ่ม WHIP muxer ใน
avformat/whipเพื่อรองรับสตรีมมิงที่มีความหน่วงต่ำกว่า 1 วินาที - implementation อ้างอิง WHIP Version 3
- เพิ่มไฟล์ implementation ใหม่ libavformat/whip.c
- เอกสารและคอนฟิกการบิลด์ก็ถูกเปลี่ยนแปลงด้วย
ปรับปรุงการจัดการ DTLS·ICE·RTP
- WHIP muxer ได้รับการปรับปรุง implementation พร้อมกับการเปลี่ยนชื่อ และปรับปรุงข้อความผิดพลาดกับบริบทล็อกของ SSL·DTLS·RTC
- magic number ถูกแทนที่ด้วย มาโคร และตรรกะบางส่วนถูกแยกออกเป็นฟังก์ชัน
- ปรับระดับล็อกให้ชัดเจนยิ่งขึ้นด้วย
- เส้นทาง DTLS มีการเปลี่ยนแปลงหลายจุดที่เกี่ยวกับความเข้ากันได้และประสิทธิภาพ
- อัปเดต DTLS curve list
- ปรับปรุงชื่อ SRTP profile สำหรับ FFmpeg และ OpenSSL
- ปรับแต่ง DTLS handshake และการจัดการ ICE เพื่อเพิ่มประสิทธิภาพ
- ใช้ handshake timeout เดียวและ server role เพื่อป้องกัน ARQ
- การจัดการ ICE ถูกจัดระเบียบไปในทิศทางที่รวม request/response และ DTLS handshake ไว้ในฟังก์ชันเดียว
- ปรับปรุง ICE STUN magic number
- RTP payload type ถูกอัปเดตตามนิยามของ Chrome
การจัดการสื่อและข้อจำกัดของ OpenSSL
- ฝั่งเสียงเปลี่ยนจากขนาดเฟรมคงที่มาใช้
rtc->audio_par->frame_size - ใช้
h264_mp4toannexbเพื่อแปลงอินพุต MP4/ISOM เป็น Annex B - แก้ไขปัญหา OPUS timestamp และการตั้งค่า marker หลังใช้ BSF ไปพร้อมกัน
- implementation ของ TLS และ DTLS ถูกรวมเข้ากับโครงสร้างร่วมกัน
- ใช้ BIO callback, read, write,
print_ssl_error,openssl_init_ca_key_cert,init_bio_methodร่วมกัน - ใช้โครงสร้างข้อมูลเดียวกัน
- ใช้ BIO callback, read, write,
- แก้ไขข้อผิดพลาดการบิลด์ของ OpenSSL และปรับให้ทำงานร่วมกับ Pion ได้
configureถูกเปลี่ยนให้เปิดwhipเฉพาะเมื่อเปิดใช้dtls- ปัจจุบันรองรับเฉพาะ OpenSSL
1 ความคิดเห็น
ความคิดเห็นใน Hacker News
ตื่นเต้นกับ การออกอากาศผ่าน WebRTC มาก ได้สรุปเหตุผลไว้ใน README ของ Broadcast Box และ PR ของ OBS แล้ว
ตอนนี้ GStreamer, OBS และ FFmpeg รองรับ WHIP กันหมดแล้ว ก็เท่ากับว่าได้โปรโตคอลการออกอากาศวิดีโอแบบสากลที่ใช้ได้บนทุกแพลตฟอร์ม ทั้งมือถือ เว็บ อุปกรณ์ฝังตัว และซอฟต์แวร์กระจายเสียง
ทำงานฝั่งโอเพนซอร์สและการออกอากาศด้วย WebRTC มาหลายปี มองว่านี่เป็นหมุดหมายสำคัญ
[0] https://github.com/Glimesh/broadcast-box?tab=readme-ov-file#...
[1] https://github.com/obsproject/obs-studio/pull/7926
ไม่ใช่ส่วนของ SCTP ที่จริงคือการทำ WebRTC-HTTP Ingestion Protocol หรือ WHIP ซึ่งเป็นโปรโตคอล HTTP แบบหน่วงต่ำสำหรับเชื่อมต่อเข้ากับเกตเวย์ที่สื่อสารกับเพียร์ผ่านโปรโตคอลบน SCTP ของ WebRTC
https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html
หวังว่าสักวันจะย้ายจาก SCTP ไปเป็นโปรโตคอล P2P ที่อิง QUIC หรือ WebTransport ได้ QUIC จัดการสิ่งที่ SCTP เคยทำบน UDP ได้ดี โดยไม่เพิ่มความซับซ้อนและความต่างของการติดตั้งใช้งานมากนัก
ตัวเลือกหนึ่งคือ Media-over-QUIC (MoQ) แต่เบราว์เซอร์ยังไม่มี P2P QUIC และความคืบหน้าฝั่งนั้นก็แทบหยุดนิ่งมาหลายปีแล้ว
https://quic.video/ https://datatracker.ietf.org/group/moq/about/
ผู้ให้บริการ WHIP ส่วนใหญ่รองรับ DataChannel ด้วย แต่ยังไม่ได้เป็นมาตรฐาน
สงสัยว่านี่หมายความว่าอะไร หมายถึงเว็บไซต์จะเชื่อมต่อกับ อินสแตนซ์ FFmpeg โดยตรงเพื่อรับสตรีมเสียงหรือวิดีโอได้ใช่ไหม?
คำอธิบายจากฝั่ง Phoronix ละเอียดกว่าเล็กน้อย: https://www.phoronix.com/news/FFmpeg-Lands-WHIP-Muxer
แบบนี้น่าจะทำ สตรีมแบบโฮสต์เอง หรือ CDN สำหรับสตรีมมิงได้ง่ายขึ้นมาก
FFmpeg เป็นซอฟต์แวร์สื่อแบบสแตนด์อโลนและ plug-and-play ที่น่าทึ่งมากถ้ารู้วิธีใช้
สร้าง https://github.com/Glimesh/broadcast-box ขึ้นมาเพราะอยากให้การโฮสต์เองและ WebRTC ทำได้ง่ายกว่านี้มาก
Gajim ซึ่งเป็นไคลเอนต์ XMPP รอสิ่งนี้มานานมาก ฟีเจอร์โทรเสียง/วิดีโอแทบถูกปล่อยทิ้งไว้ และก็เฝ้ารออย่างอดทนว่า FFmpeg จะช่วยให้เพิ่มกลับมาได้ง่ายขึ้น
ตอนนี้กลายเป็นสวนปิดหรือบริการแยกตามแอปกันหมดแล้ว
พอเห็นกราฟิก Anubis แบบไม่คาดคิดแล้วรู้สึกยินดี เคยเห็นมาก่อนกับ ffmpeg และ gnu เป็นต้น
หวังว่านี่จะไม่ทำให้การมี ffmpeg อยู่ในระบบเสี่ยงขึ้นอีก ช่องโหว่ความปลอดภัยของ WebRTC เป็นสาเหตุของการเจาะระบบหลายครั้ง และเป็นหนึ่งในฟีเจอร์แรก ๆ ที่ปิดหลังติดตั้งเบราว์เซอร์
การติดตั้งใช้งานนี้เล็กมาก และมั่นใจ 100% ว่ากำลังมอบสิ่งที่ดีที่สุดเท่าที่ทำได้ให้ผู้ใช้
--without-whipได้หรือไม่ นั่นน่าจะเหมาะที่สุดวิธีที่ดีคือสร้าง Docker image ที่มีแค่ ffmpeg และ dependency ของมัน แล้วรัน
docker runสำหรับแต่ละงานแปลงไฟล์ ถ้าต้องสร้างภาพขนาดย่อของรูปหรือเอกสารด้วย ก็ใส่ ClamAV, OpenOffice และ ImageMagick เข้าไปด้วยได้โดยส่วนตัวมองว่าเซิร์ฟเวอร์ที่ประมวลผลไฟล์จากผู้ใช้ ไม่ใช่แค่รับมาแล้วเสิร์ฟกลับ ควรอยู่ใน VLAN ที่ล็อกเข้มแยกออกมาต่างหาก หรือถ้าอยู่บน AWS ก็อยู่ใน Security Group ที่แยกต่างหาก
นี่ไม่ใช่การโจมตีแบบไม่รู้อะไรต่อโปรเจกต์ที่ถูกกล่าวถึง ความปลอดภัยเป็นเรื่องยาก และยิ่งยากขึ้นอีกเมื่อทำงานกับฟอร์แมตไบนารีที่สั่งสมมายาวนานและบางครั้งก็ถูก reverse engineer มาอย่างน่าสงสัย การยอมรับเรื่องนี้ก่อนจะโดนแบบ 4chan ถือว่าฉลาดกว่า
[1] https://ffmpeg.org/security.html
ดีมากจริง ๆ กำลังทำระบบควบคุมระยะไกลผ่านเว็บอยู่ ถ้าสามารถใช้สิ่งนี้ทำให้
ffmpeg gdigrabกลายเป็นสตรีม WebRTC แล้วให้ไคลเอนต์รับไปใช้ได้โดยตรงโดยไม่ต้องมี งานอ้อมผ่าน ExpressJS ที่ทำอยู่ตอนนี้ ก็น่าจะยอดเยี่ยมมากน่าสนใจที่บน iOS Safari โดนระบบตรวจจับบอตบล็อกตลอด ทั้งบน WiFi บริษัทและเครือข่ายมือถือ
อยากให้ Anubis ปล่อยผ่านสักที
"access denied"หรือว่าลูป challenge ไม่รู้จบAnubis ไม่ยอมปล่อยผ่าน ;(