使用Nex Gen Media Server API将视频流集成到C / C ++应用程序中

使用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.songms / 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库来构建自己的视频流客户端。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏