Tíchhợp khả năngtruyềntảivideovàoứng
dụng C/C++
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ềntả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íchhợp hàm API để NGMS để giám sát, điều
khiển chức năngtruyềntải dữ liệu từ ứngdụ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íchhợp NGMS trực tiếp vào bất kỳ ứngdụ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.so và ngms/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ềntả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ì ứngdụ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íchhợp chức năngtruyềntả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!
. Tích hợp khả năng truyền tải video vào ứng
dụng C/C++
Trong bài viết dưới đây, chúng tôi sẽ giới thiệu. 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