GStreamer cho người mới bắt đầu - Phần 1: Giới thiệu thuật ngữ.

0 0 0

Người đăng: Lê Minh Tú

Theo Viblo Asia

Khi chạy các bài toán Computer Vision cần phải xử lý các stream camera, mình hay đọc stream và lưu video bằng OpenCV. Vì nó đơn giản, dễ dùng, và code trên mạng sử dụng đầy 😃. À đó là khi mình chỉ xử lý trên 1 camera thôi, cho đến khi mình phải xử lý cùng lúc nhiều stream camera, làm việc trên môi trường với tài nguyên hạn chế, mình buộc phải tối ưu quá trình xử lý stream. Thì mình nhận ra rằng OpenCV không phải là lựa chọn tốt để xử lý stream cho lắm... 🥲

Và đó là lý do mình tìm đến GStreamer! GStreamer là một công cụ mã nguồn mở, được lập trình chủ yếu bằng C/C++, có binding sang Python để người dùng Python dễ tiếp cận hơn 💖. Gstreamer cho phép mình thao tác, chỉnh sửa với stream ở mức low-level, như thay đổi phần cứng xử lý, gom nhiều stream camera thành 1 stream, tách video stream và audio stream, ….

Mà từ từ nào, muốn làm được mấy việc trên, mình cần làm rõ vài thuật ngữ, thành phần chính trong GStreamer đã. Giống như tìm hiểu các phím di chuyển, tấn công trước khi chơi game ấy 👌. Nên trong bài viết này, mình sẽ tập trung giới thiệu các thuật ngữ, thành phần chính trong GStreamer, với đề tài là Computer Vision.

image.png

Mình không định nói GStreamer thay thế OpenCV hoàn toàn nhé :v. Xử lý ảnh thì mình vẫn dùng OpenCV vì nó tiện cực kì 😀

1. Pipeline GStreamer

Để xử lý một stream, GStreamer sử dụng một pipeline để xử lý từng bước một. Khi nhắc đến pipeline, bạn có thể tưởng tượng nó giống như đường ống nước, gồm nhiều ống nối vào nhau, data từ ống này sẽ được xử lý, sau đó đổ ra ống sau.

image.png

Ảnh minh họa cho một GStreamer pipeline dùng để lưu video từ stream, bạn hiện chưa cần hiểu hết nội dung bên trong đâu ✌️

Một pipeline sẽ gồm các element được nối với nhau. Và tùy theo chức năng, các element sẽ chia ra làm các loại:

  • Source element (còn được gọi là producer): là element chỉ có nhiệm vụ đổ data cho element khác trong pipeline.
  • Filter element: là element vừa nhận data từ element trước , vừa đổ data cho element sau trong pipeline.
  • Sink element (còn được gọi là consumer): là element chỉ nhận data từ element khác trong pipeline.

image.png

Minh họa các loại element trong pipeline

Hay nói cách khác, source element sẽ lấy data từ file hoặc stream, đổ qua các filter element để xử lý, cuối cùng đổ xuống sink element để lưu hoặc xuất đi nơi khác.

2. Element và Pad

Yay, qua mục trên, mình mong các bạn hình dung được pipeline GStreamer nó hình thù như thế nào rồi 👾. Nhưng như thế vẫn chưa đủ đâu, mình tiếp tục đào sâu thêm về các element nào.

Hai element kết nối được với nhau thông qua Pad. Một element có thể gồm nhiều pad, bạn có thể hiểu pad giống như miệng ống nối của element, và để hai element kết nối với nhau, hai pad của hai element phải được nối với nhau.

Tương tự như element, pad cũng được chia thành nhiều loại:

  • Sink pad: pad để kết nối với element trước đó để nhận data.
  • Source pad: pad để kết nối với element tiếp theo để đổ data vào element đó.

Nên hai element kết nối với nhau khi source pad của element đổ data phải kết nối với sink pad của element nhận data. Từ này mình cũng có thể suy ra source element chỉ gồm các source pad, sink element chỉ gồm các sink pad, và filter element có thể gồm cả source pad và sink pad.

image.png

Spoil tí: về sau bạn có thể cần phải truy xuất pad của element để theo dõi luồng data khi đi qua element đấy 🤓

Nâng cao hơn một tí, Pad còn có thể phân loại vào điều kiện xuất hiện của nó trên element:

  • Always pad: pad xuất hiện từ đầu trên element.
  • Sometimes pad: pad chỉ xuất hiện trên element khi đạt một vài điều kiện cho trước.
  • Request pad: pad chỉ xuất hiện trên element khi người dùng yêu cầu.

Nên một pad có thể vừa là sink pad, vừa là always pad.

Việc phân loại các pad này là cần thiết, nhất là khi debug và tra cứu trên document của GStreamer: https://gstreamer.freedesktop.org/documentation/

3. Caps

Chúng ta đã cùng tìm hiểu qua pipeline, element, và pad rồi. Nhưng mình nghĩ tốt nhất vẫn đào sâu hơn nữa ❤️‍🔥, chúng ta sẽ tìm hiểu Caps bây giờ.

Để hai element kết nối với nhau, source pad phải kết nối với sink pad. Nhưng để hai source pad và sink pad kết nối với nhau, hai pad này phải có cùng Caps.

Caps (hay Capabilities) là định dạng data mà pad trả/nhận. Caps có thể bao gồm thông tin về media type, code, resolution, …. Bạn có thể hình dung để hai miệng ống (Pad) kết nối được với nhau, thì hình dáng của cả hai (Caps) phải khớp với nhau. Quá trình hai pad chọn ra caps được gọi là negotiation. Nên khi bạn cố kết nối hai element không có chung caps, bạn sẽ gặp lỗi giống như “reason not-negotiated”.

Bạn có thể biết caps của từng pad cho một element thông qua document hoặc lệnh gst-inspect-1.0

4. Bin

Ờ phần này giống như bonus trước khi hết bài ấy mà. Khi ráp hai ống nối lại với nhau, có phải chúng ta cũng được một ống nối mới, dài hơn trước không? Yeah, Bin cũng như thế, Bin cũng được coi là một element, nhưng bên trong Bin lại chứa các element con được nối với nhau để xử lý data. Một vài Bin phổ biến mà sau này bạn có thể gặp là playbin, uridecodebin, parsebin.

5. Kết bài

Ờm… mình định sẽ làm một vài thứ như thực hành chạy vài pipeline GStreamer, giới thiệu thêm vài thứ như signal, properties cho element, và một vài loại element đặc trưng trong GStreamer. Nhưng mình nghĩ nên để sang bài sau để mọi người dễ theo dõi 🙏.

Tóm lại chúng ta vừa bỏ túi vài thuật ngữ như pipeline → element → pad → caps và bin trong GStreamer, tuy chỉ là lý thuyết thôi nhưng mình nghĩ chúng cần thiết để đọc hiểu tài liệu và debug sau này.

Cảm ơn các bạn đã đọc đến đây nhé 💖.

6. Tham khảo

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tìm hiểu về YOLO trong bài toán real-time object detection

1.Yolo là gì. . Họ các mô hình RCNN ( Region-Based Convolutional Neural Networks) để giải quyết các bài toán về định vị và nhận diện vật thể.

0 0 294

- vừa được xem lúc

[Paper Explain] [Deep Neural Network] -ImageNet Classification with Deep Convolutional Neural Networks

Source paper. . Link paper ImageNet Classification with Deep Convolutional Neural Networks. .

0 0 98

- vừa được xem lúc

Những vấn đề liên quan đến dữ liệu ảnh trong Computer Vision

Như mọi người cũng biết data cực kỳ quan trọng đối với Machine learning vì vậy hôm nay mình sẽ chia sẻ xung quanh vấn đề ảnh. .

0 0 46

- vừa được xem lúc

Hướng dẫn convert Pytorch sang TF Lite

I. Giới thiệu.

0 0 60

- vừa được xem lúc

Triển khai các mô hình với OpenVINO

I. Giới thiệu.

0 0 76

- vừa được xem lúc

CenterNet - CenterTrack - TraDeS: Từ object detection đến multiple object tracking

1. Mở đầu.

0 0 244