Интеграция потокового видео в C/C++ приложение с помощью Nex Gen Media Server Api
Вступление
NGMS — многофункциональный потоковый сервер, поддерживающий большинство популярных потоковых протоколов, — таких, как RTSP, RTMP, Apple's HTTP Live и MPEG-2 Transport Stream. У NGMS есть возможность перекодирования, а также захвата и форматирования прямых видео-потоков и их адаптация для получения устройствами другого типа. Например, захват видео высокого разрешения с последующим преобразованием и передачей на iPhone через 3g. Мы сосредоточимся на интеграции NGMS API для управления возможностями потока прямо из собственного приложения на C. В этом примере использована Ubuntu Linux 10.04.
Сперва следует прочитать руководство пользователя: http://ngmsvid.com/ngms.php и документацию по API: http://ngmsvid.com/develop.php. Существует большое множество опций настройки, мы же остановимся на основных. Теперь вам требуется скачать пакет NGMS для Linux. В примере ниже использована версия 1.3.4. После загрузки пакета, просто разархивируйте его содержимое в любую директорию. В примере использована ~/ngmsStreaming.
Настройка приложения
Чтобы внедрить NGMS непосредственно в приложении на C, требуется включить в код заголовок ngms/include/ngmslib.h.
При компановке приложения, необходимо включить библиотеки ngms/lib/libngms.so и ngms/lib/libxcode.so. Видно, что libngms.so также зависит от libcrypto.so, которую и нужно указать в опциях компановщика.
Вот простой 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)
Исходный код myapp.c:
/*
* Example myapp application
*/
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
#include
#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;
}
Данный код использует структуру NGMSLIB_STREAM_PARAMS_T для управления библиотекой ngms. Сначала вызывается функция ngmslib_open для «предустановки» данной структуры. Далее вы можете заполнять любое из её полей для управления NGMS. Затем вызывается ngmslib_stream для создания выходного видео.
Теперь можно открыть поток в VLC плеере и воспроизвести видео:
VLC Player -> Open Network rtp://@:5004
Таким простым образом, медиа-поток проигрывается прямо из приложения.
Чтобы прервать поток, в коде вызвана функция ngmslib_close из другого потока. После этого ngmslib_stream закончит свою работу.
Также можно добавить поддержку встроенного Flash-плеера, вставив всего несколько строк:
ngmsConfig.rtmplive = "1935";
ngmsConfig.live = "8080";
Теперь, открыв в браузере http://127.0.0.1:8080/live, отобразится страница с Flash-плеером, проигрывающим видео.
Вместо проигрывания файла видео, можно встроить и прямой видео-поток. Создадим два отдельных экземпляра приложения. Один будет отдавать видео на порт 5006, а другой будет захватывать видео с порта 5006 и выводить его на порт 5004. Все, что требуется поменять, это лишь:
//ngmsConfig.inputs[0] = "mediaTestFile.mp4";
ngmsConfig.inputs[0] = "rtp://127.0.0.1:5006";
ngmsConfig.strfilters[0] = "type=m2t";
Заключение
Эти небольшие примеры демонстрируют, насколько легко добавить видео-поток в ваше собственное приложение. В данных примерах использован язык C. Если ваше приложение написано на C++, вы можете использовать ключевое слово "extern "C" ". Для использования данной библиотеки в Java-приложении, потребуется построение JNI-интерфейса для всех вызовов функций.
|