Tích hợp khả năng truyền tải video vào ứng dụng C/C++

Quản Trị Mạng - Trong bài viết dưới đây, chúng tôi sẽ giới thiệu với các bạn một số đặc tính của mô hình hệ thống Nex Gen Media Server - NGMS và nền tảng framework API đi kèm. Về mặt kỹ thuật, NGMS có thể được xem là 1 trong những hệ thống server xử lý và truyền tải media với nhiều mục đích khác nhau, hỗ trợ nhiều giao thức phổ biến hiện nay như RTSP, RTMP, HTTP Live của Apple hoặc MPEG-2 Transport Stream. Bên cạnh đó, NGMS còn đi kèm với khả năng mã hóa, chuyển đổi định dạng các luồng dữ liệu Live Video, qua đó các thiết bị thu phát phổ biến ngày nay như HD Player, hoặc điện thoại iPhone có thể nhận được qua sóng 3G. Và tại bài thử nghiệm này, Quản Trị Mạng sẽ chủ yếu tập trung vào quá trình tích hợp hàm API để NGMS để giám sát, điều khiển chức năng truyền tải dữ liệu từ ứng dụng viết bằng ngôn ngữ lập trình C trên nền tảng Ubuntu Linux 10.04.

Việc trước tiên các bạn cần làm là download và tham khảo thông tin hướng dẫn cơ bản - NGMS User Guide tại đây, và một số thiết lập liên quan tới API tại đây. Chú ý rằng các bạn hãy download Package NGMS cài đặt dành cho Linux (trong bài thử nghiệm này là phiên bản NGMS v1.3.4), sau đó giải nén gói này vào thư mục tùy chọn trên phân vùng (tại đây là ~/ngmsStreaming).

Các bước thiết lập cơ bản:

Để tích hợp NGMS trực tiếp vào bất kỳ ứng dụng C nào, thì yếu tố quan trọng nhất là phải gán được ngms/include/ngmslib.h vào trong mã nguồn. Do vậy, khi bắt tay vào việc xây dựng chương trình thì các bạn nên chuẩn bị sẵn thư viện ngms/lib/libngms.songms/lib/libxcode.so. Trên thực tế thì libngms.so lại phụ thuộc vào libcrypto.so.

Ví dụ, file makefile:

 #Example Makefile
 
 CC=gcc
 
 CFLAGS=-ggdb
 
 INCLUDES+= -I ngms/include
 
 LDFLAGS+= -L ngms/lib -lngms -xlcode -crypto
 
 all: myapp
 
 %.o: %.c
 
         $(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $<
 
 myapp: myapp.o
 
         $(CC) -fpic -o myapp myapp.o  $(LDFLAGS)
 

Và đây là mã nguồn của myapp.c: 

 /**
 
  *
 
  * Example myapp application
 
  *
 
  */
 
 
 typedef unsigned int uint32_t;
 
 typedef unsigned long long uint64_t;
 
 #include <stdio.h>
 
 #include "ngmslib.h"
 
 
 
 int main(int argc, char *argv[]) {
 
     NGMSLIB_STREAM_PARAMS_T ngmsConfig;
 
     NGMS_RC_T returnCode;
 
 
 
     returnCode = ngmslib_open(&ngmsConfig);
 
     if(NGMS_RC_OK != returnCode) {
 
       fprintf(stderr, "ngmslib_open failed\n");
 
       return -1;
 
     }
 
 
     ngmsConfig.inputs[0] = "mediaTestFile.mp4";
 
     ngmsConfig.output = "rtp://127.0.0.1:5004";
 
 
     returnCode = ngmslib_stream(&ngmsConfig);
 
     if(NGMS_RC_OK != returnCode) {
 
       fprintf(stderr, "ngmslib_open failed\n");
 
     }
 
 
     ngmslib_close(&ngmsConfig);
 
 
     return 0;
 
 }

Các đoạn mã nguồn trên sử dụng cấu trúc NGMSLIB_STREAM_PARAMS_T để can thiệp và điều khiển thư viện ngms, yếu tố cần hoàn tất trước tiên chính là thủ tục gọi chức năng ngmslib_open. Sau đó tiếp tục xây dựng các hệ thống tùy chọn để giám sát hoạt động của NGMS, và cuối cùng là sử dụng ngmslib_stream để tạo file video output.

Sau khi hoàn tất, chúng ta đã có thể sử dụng VLC Player để mở và xem video theo tùy chọn:

VLC Player -> Open Network rtp://@:5004

Tại đây, chức năng gọi hàm ngmslib_stream được coi là toán tử ngăn chặn, và nếu muốn làm gián đoạn quá trình truyền tải thì các bạn có thể gọi ngmslib_close từ thread khác và việc gọi hàm ngmslib_stream sẽ kết thúc. Ví dụ tại đây, chúng ta sẽ thêm một số chức năng hỗ trợ đối với dữ liệu video Flash nhúng bằng cách gán thêm những dòng mã dưới đây:

ngmsConfig.rtmplive = "1935";

ngmsConfig.live = "8080";

Sau đó, mở trình duyệt và gõ đường dẫn: http://127.0.0.1:8080/live, kết quả trả về từ hệ thống sẽ là trang web với video Flash đang được trình chiếu.

Mặt khác, thay vì việc trình chiếu 1 file video Flash bất kỳ nào đó thì người sử dụng vẫn có thể thay đổi nguồn input của Live Video. Trong ví dụ này, tác giả tạo ra 2 ví dụ thay vì ứng dụng chính, trong đó 1 ví dụ sẽ trích xuất file video qua cổng 5006, phần còn lại sẽ giám sát dữ liệu video trên cổng 5006 này, và sau đó dẫn trở lại cổng 5004:

//ngmsConfig.inputs[0] = "mediaTestFile.mp4";

ngmsConfig.inputs[0] = "rtp://127.0.0.1:5006";

ngmsConfig.strfilters[0] = "type=m2t";

Trên đây là một số ví dụ khá cơ bản để tích hợp chức năng truyền tải video vào ứng dụng dựa trên mã nguồn C. Còn với ngôn ngữ C++, các bạn có thể bao quát tất cả các chức năng gọi hàm tới thư viện ngmslib bằng cách sử dụng từ khóa C. Bên cạnh đó, chúng ta còn có thể áp dụng tương tự với Java, nhưng để làm được như vậy thì hệ thống yêu cầu chức năng interface JNI để quản lý từng câu lệnh gọi hàm tới NGMS. Chúc các bạn thành công!

Thứ Ba, 11/10/2011 17:39
51 👨 552