gstreamer

 
 

ไลบรารี Python โอเพ่นซอร์สสำหรับการประมวลผลมัลติมีเดีย

สร้างแอปพลิเคชันสตรีมมิ่งสื่อด้วย GStreamer: พายไลน์เสียง/วิดีโอ การจัดการรูปแบบและการประมวลผลแบบเรียลไทม์.

gstreamer คืออะไร?

GStreamer เป็นกรอบงานมัลติมีเดียโอเพ่นซอร์สที่ทรงพลังซึ่งช่วยให้นักพัฒนาสร้างแอปพลิเคชันสตรีมมิ่งสื่อที่ซับซ้อนได้ มันให้สถาปัตยกรรมแบบท่อที่ยืดหยุ่นสำหรับการจัดการสตรีมเสียงและวิดีโอ รองรับรูปแบบ โปรโตคอล และปลั๊กอินหลากหลาย ด้วยการเชื่อมต่อ Python นักพัฒนาสามารถสร้างต้นแบบและปรับใช้กระบวนการประมวลผลสื่อได้อย่างรวดเร็ว รวมถึงการสตรีมสด การบันทึก การแปลงรูปแบบ และเอฟเฟกต์แบบเรียลไทม์ กรอบงานนี้ถูกใช้กันอย่างแพร่หลายในระบบฝังตัว แอปพลิเคชันบนเดสก์ท็อป และบริการสื่อบนคลาวด์

โดยพื้นฐานแล้ว GStreamer ใช้ระบบปลั๊กอินโมดูลาร์ที่ช่วยให้การรวมโค้ดเคอดแบบกำหนดเอง, ตัวกรอง และแหล่งข้อมูลเป็นไปอย่างราบรื่น การสนับสนุนข้ามแพลตฟอร์มของมันครอบคลุม Linux, Windows, macOS และสภาพแวดล้อมมือถือ ทำให้เหมาะสำหรับโซลูชันสื่อพกพา นักพัฒนาสามารถใช้ Python เพื่อควบคุมการสร้างพายป์ไลน์ การกำหนดค่าองค์ประกอบ และการจัดการเหตุการณ์ พร้อมรับประโยชน์จากการประมวลผลระดับ C ที่มีประสิทธิภาพสูง โครงการนี้ได้รับการดูแลอย่างต่อเนื่องโดยชุมชน freedesktop.org และมีเอกสารครบถ้วน คู่มือการสอน และตัวอย่างเพื่อเร่งการพัฒนา

Previous Next

เริ่มต้นกับ gstreamer

เพื่อเริ่มใช้ GStreamer กับ Python ให้ติดตั้งไลบรารีหลักและไบด์ดิ้งของ Python วิธีที่ง่ายที่สุดคือผ่าน pip: `pip install pygobject` และตรวจสอบให้แน่ใจว่าแพ็กเกจระบบเช่น `gstreamer1.0` ถูกติดตั้งแล้ว สำหรับการพัฒนา ให้คลอนรีโพซิทอรีอย่างเป็นทางการจาก [GitHub ของ gstreamer](https://github.com/GStreamer/gstreamer) และสร้างจากซอร์สโดยใช้ Meson GStreamer รองรับ Python 3.8+ และรวมเข้ากับดิสทริบิวชัน Linux หลัก, Windows, และ macOS เมื่อทำการติดตั้งแล้ว คุณสามารถสร้างพายป์ไลน์สื่อโดยโปรแกรมได้โดยใช้วัตถุและเมธอดของ Python ทำให้สามารถทำต้นแบบแอปพลิเคชันมัลติมีเดียได้อย่างรวดเร็ว

ติดตั้ง GStreamer ผ่าน Pip (การเชื่อมต่อ Python)

pip install pygobject
# On Ubuntu/Debian: sudo apt install gir1.2-gstreamer-1.0 gstreamer1.0-plugins-base
# On macOS: brew install gstreamer pygobject3

สร้างสายงานสื่อด้วย Python

สถาปัตยกรรม pipeline ของ GStreamer อนุญาตให้ผู้พัฒนาสามารถเชื่อมต่อองค์ประกอบต่าง ๆ เช่น แหล่งข้อมูล, ตัวกรอง, และ sink เพื่อประมวลผลสตรีมสื่อได้ โดยใช้ Python คุณสามารถสร้าง, กำหนดค่า, และควบคุม pipeline เหล่านี้ได้โดยโปรแกรม องค์ประกอบสื่อสารผ่าน pads และรองรับการเชื่อมโยงแบบไดนามิก ทำให้สามารถดำเนินการเวิร์กโฟลว์ที่ซับซ้อนเช่น การแปลงรูปแบบ, การบันทึก, หรือการสตรีมสดได้ API ของ Python bindings เปิดเผย GStreamer API ทั้งหมด รวมถึงการจัดการข้อความบน bus, การเปลี่ยนสถานะ, และการจัดการคุณสมบัติ ซึ่งทำให้สามารถสร้างแอปพลิเคชันที่ตอบสนองต่อเหตุการณ์สื่อ, ข้อผิดพลาด, หรือเงื่อนไข end-of-stream ได้แบบเรียลไทม์ Pipeline สามารถกำหนดได้โดยใช้ฟังก์ชัน `gst_parse_launch` หรือสร้างองค์ประกอบทีละส่วนเพื่อการควบคุมที่ละเอียด

สร้างสายงานวิดีโอแบบง่ายด้วย Python

import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst

Gst.init(None)

pipeline = Gst.parse_launch("videotestsrc ! autovideosink")
pipeline.set_state(Gst.State.PLAYING)

# Wait for EOS or error
bus = pipeline.get_bus()
msg = bus.timed_pop_filtered(Gst.CLOCK_TIME_NONE, Gst.MessageType.EOS | Gst.MessageType.ERROR)

pipeline.set_state(Gst.State.NULL)

การสตรีมแบบเรียลไทม์และการสนับสนุนเครือข่าย

GStreamer โดดเด่นในการสตรีมแบบเรียลไทม์พร้อมการสนับสนุนที่แข็งแกร่งสำหรับโปรโตคอลเช่น RTSP, RTP, HLS, และ DASH. นักพัฒนาสามารถสร้างเซิร์ฟเวอร์หรือไคลเอนต์สตรีมมิ่งสดโดยใช้ Python เพื่อจัดการแหล่งข้อมูล, ตัวเข้ารหัส, และ sink ของเครือข่าย. เฟรมเวิร์กจัดการการซิงโครไนซ์, การบัฟเฟอร์จิตเตอร์, และการปกปิดการสูญเสียแพ็กเกจอย่างโปร่งใส. ด้วยองค์ประกอบเช่น `tcpserversink`, `udpsink`, และ `rtspclientsink`, คุณสามารถสตรีมวิดีโอจากกล้องหรือไฟล์ผ่านเครือข่ายท้องถิ่นหรืออินเทอร์เน็ต. สคริปต์ Python สามารถปรับอัตราบิต, ความละเอียด, หรือพารามิเตอร์การเข้ารหัสแบบไดนามิกตามสภาพเครือข่ายหรือการป้อนข้อมูลของผู้ใช้, ทำให้สามารถใช้โซลูชันสตรีมมิ่งแบบปรับตัวได้. การออกแบบโมดูลาร์ของ GStreamer ยังสนับสนุนปลั๊กอินโปรโตคอลแบบกำหนดเองสำหรับกรณีการใช้งานเฉพาะ.

สตรีมวิดีโอผ่าน RTSP ด้วย Python

import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject

Gst.init(None)

pipeline = Gst.parse_launch("videotestsrc ! x264enc ! rtspclientsink location=rtsp://localhost:8554/stream")
pipeline.set_state(Gst.State.PLAYING)

loop = GObject.MainLoop()
try:
    loop.run()
except KeyboardInterrupt:
    pass

pipeline.set_state(Gst.State.NULL)

การเร่งความเร็วด้วยฮาร์ดแวร์และการขยายปลั๊กอิน

GStreamer ให้การบูรณาการที่ราบรื่นกับตัวเร่งความเร็วฮาร์ดแวร์เช่น NVIDIA CUDA, Intel Quick Sync, และ ARM Mali ผ่านปลั๊กอินเฉพาะทาง นักพัฒนาสามารถใช้ประโยชน์จากการเร่งความเร็วด้วย GPU สำหรับการถอดรหัสวิดีโอ, การเข้ารหัส, และการรวมภาพโดยไม่ต้องเขียนโค้ดหลักใหม่ ระบบปลั๊กอินอนุญาตให้สร้างองค์ประกอบแบบกำหนดเองด้วยภาษา C, Python หรือภาษาอื่น ๆ และโหลดแบบไดนามิก ปลั๊กอิน Python สามารถสร้างได้โดยใช้ `Gst.ElementFactory` และลงทะเบียนในเวลารันไทม์ ทำให้การทดลองทำได้อย่างรวดเร็ว ความยืดหยุ่นนี้สนับสนุนกรณีการใช้งานเช่น ตัวกรองกำหนดเอง, pipeline การสรุปผล AI, หรือโค้ดเอกสารที่เป็นกรรมสิทธิ์ ปลั๊กอินจะถูกค้นหาอัตโนมัติผ่าน `gst-inspect-1.0` และความสามารถของมันสามารถสอบถามได้โดยโปรแกรมใน Python เพื่อสร้าง pipeline ที่ปรับตัวได้

เปิดใช้งานการถอดรหัสด้วยการเร่งฮาร์ดแวร์ผ่าน Python

import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst

Gst.init(None)

# Example for VAAPI on Linux with Intel GPU
pipeline = Gst.parse_launch("filesrc location=video.mp4 ! qtdemux ! h264parse ! vaapih264dec ! autovideosink")
pipeline.set_state(Gst.State.PLAYING)

# Run pipeline...

การประมวลผลสื่อและสายงานเอฟเฟกต์

GStreamer มีชุดของอิลิเมนต์ในตัวที่หลากหลายสำหรับการประมวลผลเสียง/วิดีโอ เช่น การปรับขนาด การแปลงสี การครอป การผสมสี และการผสมเสียง นักพัฒนาสามารถเชื่อมต่ออิลิเมนต์เหล่านี้เพื่อสร้างสายผลลัพธ์ที่ซับซ้อน—เช่น การใช้ฟิลเตอร์, การวางซ้อน, หรือการแปลงตามเวลา—ทั้งหมดใน Python อิลิเมนต์เช่น `videoscale`, `videoconvert`, `textoverlay`, และ `audioresample` ให้การประมวลผลคุณภาพสูงด้วยการกำหนดค่าที่น้อยที่สุด เอฟเฟกต์แบบกำหนดเองสามารถทำได้โดยใช้ `GstBase.BaseTransform` หรือ `GstBase.BaseAggregator` ใน Python ทำให้สามารถจัดการสตรีมสื่อแบบเรียลไทม์ได้ นี่ทำให้ GStreamer เหมาะสำหรับแอปพลิเคชันเช่น การประชุมวิดีโอ, การถ่ายทอดสด, หรือเครื่องมือสร้างเนื้อหา ที่ต้องการการประมวลผลความหน่วงต่ำ

เพิ่มข้อความซ้อนทับและปรับขนาดวิดีโอผ่าน Python

import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst

Gst.init(None)

pipeline = Gst.parse_launch("videotestsrc ! textoverlay text='Hello GStreamer' font-desc='Sans 24' ! videoscale ! videoconvert ! autovideosink")
pipeline.set_state(Gst.State.PLAYING)

# Run pipeline...
 ไทย