Cơ chế xử lý dữ liệu truyền thông đa phương tiện (MMF) là một hệ thống nền xử lý các luồng dữ liệu multimedia (các loại ảnh, video, hoạt hình hiển thị) trên hệ điều hành Linux. GStreamer là một MMF mã nguồn mở mà em đã sử dụng để xử lý dữ liệu video và truyền hình ảnh trực tuyến về GCS. Qui trình của Gstreamer được chia thành các bộ phận (element). Các bộ phận nối với nhau
SVTH: Nguyễn Nhật Anh Lớp: KTDT & THCN K56
bằng các đường dẫn (pipeline) có đầu vào (source pad) và đầu ra (sink pad). Các bộ phận đường cung cấp thông qua các plug-in (phần mềm bổ sung) như các thư viện dùng chung.
HÌNH 3.18. Qui trình truyền dữ liệu của GStreamer.
Trên thực tế, việc sử dụng kỹ thuật nén video kỹ thuật số đóng một vai trò rất quan trọng cho phép truyền và lưu trữ hiệu quả nội đa phương tiện trong môi trường giới hạn băng thông và không gian lưu trữ. Đặc biệt trong trường hợp gửi dữ liệu theo thời gian thực thông qua mạng internet này nên em đã lựa chọn chuẩn nén h.264. Thư viện MMF cũng hỗ trợ plug-in mã hóa và giải nén theo tiêu chuẩn H.264/ AVC, được gọi là “x264”.
X264 là kỹ thuật nén dữ liệu tiên tiến theo chuẩn H.264/ AVC, và kỹ thuật này chứa một số xử lý tăng cường tâm thần – thị giác (psychovisual enhancement) giúp cả thiện chất lượng mã hóa video như lượng tử hóa tương thích ở hai chế độ, sử dụng làm mới định kỳ (Periodic Intra Refresh). Điều này cho phép mỗi khung hình được đăng lên theo cùng một kích thước, nên cho phép từng lát cắt được truyền ngay lập tức trong từng gói UDP/ TCP và cho phép giải mã ngay lập tức khi nhận, và nhiều chức năng khác được nêu trong [21].
Để sử dụng MMF GStreamer trên hệ điều hành Ubuntu rất đơn giản. Sua khi cập nhật gói dependencies của ubuntu core, ta cài đặt framework thông qua các lệnh sau: sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-base streamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly
Tổng quan về qui trình xử lý video gửi dữ liệu video trực tuyến. Đầu tiên ở phía bộ truyền hình ảnh chúng ta cần thực hiện các bước sau:
1. Lấy dữ liệu video 2. Nén dữ liệu video
3. Đóng thành các gói dữ liệu video 4. Gửi các gói dữ liệu qua giao thức mạng
SVTH: Nguyễn Nhật Anh Lớp: KTDT & THCN K56
Ở phía bộ xử lý hình ảnh để nhận dữ liệu hình ảnh truyền đến, ta cần thực hiện các bước sau:
1. Nhận các gói dữ liệu thông qua giao thức mạng 2. Tái tạo dữ liệu video từ các gói dữ liệu
3. Giải mã dữ liệu video 4. Hiển thị dữ liệu video
Theo các bước thực hiện ở trên, tại bên gửi em thực hiện lệnh:
gst-launch-1.0 v4l2src device = “/dev/video0” ! video/x-raw,framerate=30/1 ! videoscale ! videoconvert ! x264enc latency = zero-latency bitrate = 1024 speed-preset=superfast ! rtph264pay ! udpsink host=42.0.3.1 port=5000
Câu lệnh trên của bên gửi (sender) sẽ thực hiện lấy dữ liệu từ camera đã kết nối với máy tính nhúng Raspberry Pi chạy hệ điều hình Ubiquity Robotics. Dữ liệu video sẽ được ghi lại bằng hàm video4linux “v4l2src”. Sau đó dữ liệu sẽ được đưa vào “x264enc” để nén theo tiêu chuẩn h.264, tốc độ truyền dữ liệu là 1024 và cài đặt độ trễ là “zero-latency” tức là không có. Tiếp theo sau khi mã hóa dữ liệu hoàn tất là bước đóng gói dữ liệu bằng “rtph264pay”, việc đóng gói dữ liệu là chuyển đổi các dữ liệu thành giao thức mạng RTP (Real-time Transport Protocol). Đây là giao thức được thiết kế dành riêng cho việc truyền tín hiệu kỹ thuật số đa phương tiện trên giao thức mạng internet (Internet Protocol - IP), tín hiệu video kỹ thuật số sẽ được đóng thành các gói dữ liệu theo định dạng RFC 6184 dành riêng cho H.264/AVC [22]. Dữ liệu sẽ được truyền qua địa chỉ IP của bên phía nhận bằng giao thức UDP “udpsink” cổng 5000.
HÌNH 3.19.Qui trình truyền dữ liệu hình ảnh về trạm.
x264 encoder videosrc v4l2src
src sink src
rtph264pay
sink src
udpsinkadd=<client’s IP>
port = 5000
sink
x264enc bitrate = 1024 latency = Zero-latency
SVTH: Nguyễn Nhật Anh Lớp: KTDT & THCN K56
HÌNH 3.20. Truyền hình ảnh từ UAV (trái) và nhận dữ liệu ở GCS (phải) sử dụng Gstreamer.
Qui trình nhận dữ liệu tại trạm GCS:
gst-launch-1.0 -v udpsrc port=5000 caps = "application/x-rtp, media=(string)video, clock- rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! ffdec_h264 ! h264parse ! autovideosink
Tại phía nhận (client) sẽ gọi các gói dữ liệu video bằng udpsrc đã được điều hướng tới địa chỉ của client từ phía gửi. Do dữ liệu vẫn đang là các gói định dạng rtp nên ta phải giải nén các gói dữ liệu bằng “rtph264depay”, nhưng dữ liệu vẫn còn ở dạng mã hóa h.264 nên ta sẽ giải mã dữ liệu sử dụng
“ffdec_h264”. Sau khi giải mã dữ liệu video sẽ được kiểm tra và hiển thị bằng “h264parse” và “autovideosink”.
HÌNH 3.21. Qui trình nhận dữ liệu hình ảnh từ thiết bị bay.
rtph264depay udpsrc port = 5000 src sink src ffdec_x264 sink src autovideosink sink application/x-rtp enconding-name = H264 payload = 96
SVTH: Nguyễn Nhật Anh Lớp: KTDT & THCN K56