使用Nex Gen Media Server API将视频流集成到C / C ++应用程序中
介绍
最近我仔细看了一下Nex Gen Media Server及其API框架。 NGMS是一种多用途流媒体服务器,支持一些流行的流媒体协议,如RTSP,RTMP,Apple的HTTP Live和MPEG-2传输流。 NGMS带有代码转换支持,并且能够捕获和重新格式化实时视频流,并使其适应其他类型的设备接收,例如捕获高清视频馈送并将其转换为由3g以上的iPhone接收。 我的重点是集成NGMS API直接从我自己的C应用程序控制流特性。 在这个例子中,我使用的是Ubuntu Linux 10.04。
首先是从这里http://ngmsvid.com/ngms.php和API参考指南http://ngmsvid.com/develop.php下载并阅读“ NGMS用户指南”。 那里有许多配置选项,但我们只是坚持基础。 那么你需要下载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库来构建自己的视频流客户端。