使用 Nex Gen Media Server API 将视频流集成到您的应用程序中





1.00/5 (1投票)
示例说明如何将您的应用与 Nex Gen Media Server 流媒体框架集成。
引言
最近,我仔细研究了 Nex Gen Media Server 及其 API 框架。NGMS 是一个多用途流媒体服务器,支持一些流行的流媒体协议,如 RTSP、RTMP、Apple 的 HTTP Live 和 MPEG-2 传输流。NGMS 具有转码支持,能够捕获和重新格式化实时视频流,并使其适应另一种类型的设备接收,例如捕获高清视频源并将其转换为 iPhone 通过 3g 接收。我的重点是将 NGMS API 集成到我的 C 应用程序中,以直接控制流媒体功能。 在此示例中,我使用的是 Ubuntu Linux 10.04。
首先是从这里下载并阅读 NGMS 用户指南: http://ngmsvid.com/ngms.php 以及从这里下载 API 参考指南: http://ngmsvid.com/develop.php 。 其中有很多配置选项,但我们只关注基础知识。 然后,您需要下载适用于 Linux 的 NGMS 包。 我使用的版本是 NGMS v1.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 <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;
}
上面的代码使用 NGMSLIB_STREAM_PARAMS_T 结构类型来控制 ngms 库。 首先需要做的是调用 ngmslib_open 来“预设”结构。 之后,您可以填写结构中的任何选项来控制 NGMS 将要做什么。 然后,您可以“ngmslib_stream”来创建输出视频。
我能够在 VLC 播放器中打开流并播放视频。
VLC Player -> Open Network rtp://@:5004
瞧! 就这么简单!!! 我现在可以直接从我的应用程序流式传输媒体文件了!
由于 ngmslib_stream 函数调用是一个阻塞操作,要中断流,我可以从另一个线程调用 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" " 关键字包装对 ngmslib 的所有调用。 您也可以在 Java 中执行此操作,但这需要构建一个 JNI 接口来将每个调用包装到 NGMS。
这是一个非常简单的例子。 在不久的将来,我将介绍如何使用 NGMS 库来构建您自己的视频流客户端。