- typed-ffmpeg คือ แรปเปอร์สมัยใหม่ ที่ช่วยให้ใช้งาน FFmpeg ใน Python ได้อย่างเป็นธรรมชาติ
- มี การรองรับไทป์ที่แข็งแกร่ง พร้อมเอกสารประกอบที่ครบถ้วนและการเติมโค้ดอัตโนมัติใน IDE ช่วยยกระดับประสบการณ์การพัฒนาและความเสถียรของโค้ด
- ช่วยให้สร้าง filter graph ที่ซับซ้อน ได้ง่ายขึ้น และรองรับความสามารถขั้นสูงอย่าง การแสดงผลแบบภาพ และการซีเรียลไลซ์เป็น JSON
- ติดตั้งและใช้งานได้ง่าย และยังทดลองผ่าน interactive playground บนเบราว์เซอร์ได้ด้วย
- ได้แรงบันดาลใจจาก ffmpeg-python พร้อมแก้ข้อจำกัดเดิม และมีแผนจะรองรับ FFmpeg เวอร์ชันและฟิลเตอร์ที่หลากหลายยิ่งขึ้นในอนาคต
ภาพรวมและความสำคัญของ typed-ffmpeg
- typed-ffmpeg เป็นแพ็กเกจโอเพนซอร์สสำหรับควบคุม FFmpeg ในสไตล์ Pythonic แบบสมัยใหม่
- สร้างขึ้นด้วย Python standard library เพียงอย่างเดียว จึง ไม่มี dependency และมีจุดเด่นด้านความปลอดภัยกับความเข้ากันได้สูง
- จุดเด่นสูงสุด คือการรองรับไทป์อย่างครบถ้วน ไวยากรณ์ที่เรียบง่าย การเติมโค้ดอัตโนมัติ และเอกสาร inline ที่ช่วยให้การทำงานกับ FFmpeg filter ที่ซับซ้อน เขียนเป็นโค้ดได้ง่ายและปลอดภัยยิ่งขึ้น
- ช่วยชดเชยข้อจำกัดของ ffmpeg-python เดิม โดยเฉพาะเรื่องการเชื่อมต่อกับ IDE และการขาดไทป์ พร้อมรองรับฟีเจอร์ใหม่หลากหลาย เช่น การซีเรียลไลซ์เป็น JSON การตรวจสอบ filter graph อัตโนมัติ และกราฟแบบภาพ
- ในกระบวนการแรปและทำงานอัตโนมัติจริง GPT-3 และ Copilot มีส่วนช่วยเพิ่มประสิทธิภาพการพัฒนา แต่หัวใจหลักของการสร้างโค้ดยังเป็นแนวทาง การสร้างโค้ดแบบดั้งเดิมที่เชื่อถือได้
ฟีเจอร์หลัก (Features)
- ไม่มี dependency: ใช้เฉพาะ Python standard library
- อินเทอร์เฟซที่เข้าใจง่าย: สร้าง FFmpeg filter graph ได้ง่ายด้วยโค้ด Python
- รองรับฟิลเตอร์อย่างครอบคลุม: รองรับฟิลเตอร์ส่วนใหญ่ของ FFmpeg และการเติมโค้ดอัตโนมัติใน IDE
- เอกสารแบบรวมในตัว: มี docstring แบบ inline ช่วยลดความจำเป็นในการเปิดเอกสารภายนอก
- รองรับไทป์อย่างแข็งแรง: เพิ่มความน่าเชื่อถือของโค้ดและความสะดวกในการดีบักด้วยการตรวจสอบไทป์ทั้งแบบ static/dynamic
- การซีเรียลไลซ์ filter graph: บันทึกและกู้คืน filter graph ในรูปแบบ JSON ได้
- การแสดงกราฟแบบภาพ: รองรับการทำแผนภาพ filter graph ผ่าน graphviz
- ตรวจสอบและแก้ไขอัตโนมัติ: ตรวจจับข้อผิดพลาดใน filter graph และปรับแก้ให้อัตโนมัติ
- ขยายตัวเลือกอินพุต/เอาต์พุต: รองรับ codec/format หลากหลายเพื่อขยายขอบเขตการใช้งาน FFmpeg
- ความสามารถด้าน partial evaluation: ช่วยให้ filter graph มีความเป็นโมดูลและนำกลับมาใช้ซ้ำได้มากขึ้น
ฟีเจอร์ที่วางแผนไว้ในอนาคต
- มีแผนขยาย ความเข้ากันได้อย่างกว้างขวาง ไปยังเวอร์ชันอื่นนอกเหนือจาก FFmpeg 6.0
- มีแผนรองรับ ฟิลเตอร์ที่ซับซ้อนมากขึ้น และเดินหน้าขยายความสามารถอย่างต่อเนื่อง
ตัวอย่างแบบรวดเร็ว (Quick Usage)
import ffmpeg
# พลิกวิดีโอซ้ายขวาและส่งออก
f = (
ffmpeg
.input(filename='input.mp4')
.hflip()
.output(filename='output.mp4')
)
f
- ในตัวอย่างที่ซับซ้อนขึ้น สามารถแสดง filter graph ที่ตัดหลายช่วงแล้วเพิ่ม overlay และ drawbox ได้
import ffmpeg.filters
import ffmpeg
in_file = ffmpeg.input("input.mp4")
overlay_file = ffmpeg.input("overlay.png")
f = (
ffmpeg.filters
.concat(
in_file.trim(start_frame=10, end_frame=20),
in_file.trim(start_frame=30, end_frame=40),
)
.video(0)
.overlay(overlay_file.hflip())
.drawbox(x="50", y="50", width="120", height="120", color="red", thickness="5")
.output(filename="out.mp4")
)
f
- สามารถดูตัวอย่างเพิ่มเติมและคำอธิบายแบบละเอียดได้ในเอกสาร
Interactive Playground
- สามารถทดลองฟิลเตอร์และคำสั่ง FFmpeg บนเบราว์เซอร์ ดูผลลัพธ์แบบภาพ ทดสอบตัวเลือกอินพุต/เอาต์พุตที่หลากหลาย เรียนรู้ผ่านตัวอย่างแบบอินเทอร์แอ็กทีฟ และแชร์ filter graph ได้
- เป็นสภาพแวดล้อมที่มีประสิทธิภาพมากสำหรับการทำต้นแบบและเรียนรู้ filter chain ของ FFmpeg โดยไม่ต้องมีสภาพแวดล้อมในเครื่อง
ที่มาของโปรเจกต์และคำขอบคุณ
- โปรเจกต์นี้เริ่มต้นจากแนวคิดการสร้าง SDK อัตโนมัติโดยได้รับแรงบันดาลใจจากเอกสาร FFmpeg ของ GPT-3
- แกนหลักของการสร้างโค้ดได้เปลี่ยนมาใช้แนวทางสร้างโค้ดด้วยมือเพื่อให้มั่นใจในความน่าเชื่อถือ
- ระหว่างการพัฒนา GitHub Copilot และ GPT-3 มีส่วนช่วยเพิ่มประสิทธิภาพการทำงาน
- ffmpeg-python เป็นแรงบันดาลใจด้านสไตล์ API และการออกแบบ และมีอิทธิพลต่อสถาปัตยกรรมของโปรเจกต์อย่างมาก
- โปรเจกต์นี้อุทิศให้กับ Austin ลูกของผู้พัฒนา
เอกสารและข้อมูลอ้างอิง
- สามารถดูข้อมูลที่ละเอียดและความสามารถขั้นสูงเพิ่มเติมได้ใน Documentation อย่างเป็นทางการ
- นอกเหนือจากการติดตั้งแพ็กเกจหลักเพียงตัวเดียว หากต้องการความสามารถเพิ่มเติมอย่างการแสดงกราฟแบบภาพ ก็สามารถเปิดใช้การรองรับ graphviz ผ่านตัวเลือกเพิ่มเติมได้
- มีเวอร์ชันแยกต่างหาก (typed-ffmpeg-compatible) สำหรับความเข้ากันได้กับ ffmpeg-python
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
/usr/binด้วยออปชัน--help,-hแล้วมีอัตราความล้มเหลวในการได้ข้อความช่วยเหลือตามที่คาดหวังค่อนข้างสูง พร้อมให้กำลังใจว่าการนำข้อมูลชนิดมาใช้กับเครื่องมือซับซ้อนอย่าง ffmpeg จะช่วยให้มองเห็นปัญหาความหลากหลายนี้ได้ชัดขึ้นและให้ประโยชน์เชิงปฏิบัติจริงด้วยman fooเชื่อถือได้และมีประโยชน์กว่าfoo --helpหรือfoo -hมากcolorที่ทำงานได้โดยไม่ต้องมี input, ไม่มีวิธีกำหนด Popen flags อย่างsubprocess.CREATE_NO_WINDOWเพื่อกันไม่ให้หน้าต่าง CMD เด้งขึ้นมาในแอป GUI, แม้กรณี ffmpeg จะพอแก้ได้ด้วยการรันเองหลังffmpeg.compile()แต่กับffmpeg.probe()วิธีนี้ใช้ไม่ได้ อีกทั้งยังระบุว่าพบประเด็นเรื่อง source filter ผ่านffmpeg.sources.colorแล้ว แต่ก็ยังสงสัยว่ามีวิธีใช้ source filter แบบกำหนดเองเหมือนvfilter/afilterหรือไม่