สตรีม 24/7 ที่ไม่เชื่อมต่อใหม่ระหว่างวิดีโอ: ใช้ ffmpeg ตัวเดียวป้อนผ่านไปป์
วิดีโอ
ช่องถ่ายทอดสดที่เล่นวิดีโอสำเร็จรูปตลอด 24 ชั่วโมงมีสองรูปแบบที่ง่าย แต่ทั้งสองแบบมีข้อเสีย การรีสตาร์ท ffmpeg สำหรับแต่ละวิดีโอจะทำให้การเชื่อมต่อ RTMP ขาดหายทุกครั้งที่สลับ ส่วนเพลย์ลิสต์ concat จะถูกอ่านครั้งเดียวตอนเริ่ม ดังนั้นวิดีโอใหม่ต้องรอการรีสตาร์ทครั้งถัดไป
รูปแบบการออกแบบ
แปลงวิดีโอแต่ละไฟล์เป็น MPEG-TS ครั้งเดียวตามขนาดและเฟรมเรตของสตรีม วิดีโอแนวตั้งจะวางบนภาพเบลอของตัวเองแทนแถบสีดำ รัน ffmpeg หนึ่งกระบวนการอ่าน MPEG-TS จาก standard input และเข้ารหัสด้วย bitrate คงที่พร้อม keyframe ทุกสองวินาทีตามที่ระบบรับสตรีมสดต้องการ ตัวป้อนข้อมูลขนาดเล็กจะเขียนไฟล์ที่เตรียมไว้ลงในไปป์นั้นตามลำดับ ด้วยจังหวะเวลาจริง โดยเลือกไฟล์ถัดไปเมื่อถึงเวลาสลับ: ไฟล์ที่ไม่เคยเล่นก่อน จากนั้นไฟล์ที่เล่นนานที่สุดแล้ว ตัวอ่าน MPEG-TS ของ ffmpeg จะเห็นว่า timestamp ของแต่ละไฟล์เริ่มใหม่และปรับเลื่อนให้ต่อเนื่อง ทำให้ผลลัพธ์ทำงานได้โดยไม่ขาดตอน
รายละเอียดที่ 1: จังหวะเวลาเริ่มจากไบต์แรก
เวอร์ชันแรกเริ่มจับเวลาเมื่อ ffmpeg เริ่มทำงาน การเตรียมไฟล์แรกใช้เวลา 9 วินาที ทำให้ตัวป้อนข้อมูลคิดว่าล่าช้าไป 9 วินาทีและส่งข้อมูลทั้งหมดพร้อมกัน การเริ่มจับเวลาเมื่อเขียนไบต์แรกช่วยแก้ปัญหาได้: การรัน 53 วินาทีได้สตรีมยาว 53 วินาที
รายละเอียดที่ 2: เสียงตรงรอยต่อ
เมื่อสลับไฟล์ เสียงของไฟล์ถัดไปเริ่มก่อนเสียงของไฟล์ก่อนหน้า 17 มิลลิวินาที ตัวเข้ารหัสเตือนว่าอินพุต "ย้อนเวลา" และตัว muxer แก้ไข timestamp การ resample ด้วย aresample=async=1:min_hard_comp=0.01:first_pts=0 จะตัดหรือเติมส่วนที่ทับซ้อนดังกล่าวก่อนที่ตัวเข้ารหัสจะเห็น ในการรันนานกว่าหนึ่งนาทีเล็กน้อยพร้อมการสลับ 5 ครั้ง timestamp ของเสียงและวิดีโอในสตรีมที่ได้รับเพิ่มขึ้นต่อเนื่อง และสตรีมถอดรหัสได้โดยไม่มีข้อผิดพลาดแม้แต่ครั้งเดียว
รายละเอียดที่ 3: คำเตือนบางอย่างเป็นเรื่องปกติ
แต่ละไฟล์จะรีเซ็ตตัวนับ MPEG-TS และนาฬิกาของมัน ดังนั้น ffmpeg จะรายงาน "Packet corrupt" และ "timestamp discontinuity" ทุกครั้งที่สลับ บรรทัดเหล่านี้เป็นเรื่องที่คาดการณ์ไว้ และเรากรองมันออกจาก log เพื่อให้ข้อผิดพลาดจริงโดดเด่น
ตัวตรวจสอบระบบ
หาก ffmpeg หยุดทำงานหรือความคืบหน้าหยุดนิ่งไปหนึ่งนาที สตรีมจะรีสตาร์ทพร้อมช่วงหน่วงเวลาที่เพิ่มขึ้น และส่งข้อความแจ้งเตือนหลังจากล้มเหลวซ้ำหลายครั้ง ในการทดสอบของเรา เราหยุดตัวเข้ารหัสด้วยตนเอง สตรีมกลับมาทำงานภายในเจ็ดวินาที และวิดีโอที่เพิ่มเข้ามาขณะทำงานจะเข้าร่วมการหมุนเวียนโดยไม่ต้องเชื่อมต่อใหม่ การรีสตาร์ทคือการเชื่อมต่อใหม่ในช่วงสั้น ๆ ดังนั้นให้ตั้งค่าการออกอากาศบน YouTube ให้เริ่มอัตโนมัติและไม่หยุดอัตโนมัติ คีย์สตรีมจะถูกปิดบังในบรรทัดบันทึกทุกบรรทัด รวมถึงบรรทัดของ ffmpeg เองด้วย Studio จัดส่งช่องถ่ายทอดสดนี้ในรูปแบบบริการ systemd