一、什么是NDI协议
首页了解NDI是什么意思?
NDI是什么?它是Network Device Interface的简称,是种IP网络设备接口协议。
NDI是使视频兼容产品通过局域网进行视频共享的开放式协议。
NDI协议详解就是在单一的制作环境中,NDI任何设备都可以连接到其他所有设备中,每个信号来源都可以成为目标位置,NDI它将可以灵活获取到任意的信号输入与输出。是一个完全创新的IP工作模式。
Newtek NDI协议
NDI协议能实时通过IP网络对多重广播级质量信号进行传输和接收,同时具有低延迟、精确帧视频、数据流相互识别和通信等特性。
国外很多电视台已经把传统SDI/HDMI的视频传输形式转为NDI网络传输。NDI是一种全新的网络应用领域,简化了系统的信号传输。
NDI在信号、调用、复用,使得系统设计、集成、应用、维护、功能拓展等更加简单和灵活。
NDI的特点:
1、NDI音视频信号在进行NDI编码后,能实时通过IP网络对多重广播级质量信号进行传输和接收。
2、同时具有低延迟、精确帧视频、数据流相互识别和通信等特性。
NDI应用场景:
NDI可以直接热靴摄像机,可将SDI或HDMI视频源编码成NDI协议流,通过有线网络或无线WIFI网络进行视频传输,通过有线网络或无线WIFI网络进行视频传输,减少布线成本和部署时间,很好地满足演播室、现场多机位视频制作等需求。
NDI编码器优势:
内置5G加强WIFI模块,可实现更加稳定的无线传输,同时支持USB扩充有线网络传输;
内置大容量锂电池供电,亦支持5-16v外置移动电源供电,无需考虑有线供电问题;
主动散热设计(内置风扇),适应高温工况,运行稳定可靠;
便携小巧,仅重380g,自带热靴,便于摄像机一体化安装;
支持使用手机/PAD端APP实现无线远程管理,操作便捷;
支持双码流输出,主码率支持1080p60Hz的视频编码,子码流支持720 p 60Hz的视频编码,可同时推流到两个平台;
自带SD/TF卡槽,支持本地录制,同时支持NAS网络存储;
支持1080p60Hz视频格式,输出分辨率可自定义;
采用进口芯片及H.264视频编码技术,同时结合视频动态降噪、图像增强等技术处理,可实现低码率编码并能保证高清画质;
二、NDI协议移植
在写这编之前我有在网上查过资料但是基本上没找到相关资料,给官方写邮件,磕磕绊绊终于移植成功了。写下这编博文是想希望后面有相关需求的人有些借鉴资料少走弯路。
NDI移植的关键点是dbus和avahi的移植。只要移植好dbus和avahi配置对就能运行NDI的例子了。
在移植前我们需要下载以下软件包 ,大家可以自己下载也可以使用我提供的软件包,
avahi-0.7.tar.xz
dbus-1.12.16.tar.xz
expat-2.2.9.tar.xz
libdaemon-0.14.tar.xz
libcap-2.25.tar.xz
2.1) expat移植
expat的移植很简单,就是configure,make,make install三部曲。configure可以参照我的配置:
#!/bin/bash ./configure \ CC=arm-hisiv300-linux-gcc \ CXX=arm-hisiv300-linux-g++ \ --host=arm-hisiv300-linux \ --prefix=$(pwd)/_hisiv300_install \ ac_cv_func_setpgrp_void=yes\ --enable-shared=no\ --enable-static=yes\
需要加上 ac_cv_func_setpgrp_void=yes不然会报错。
2.2) libdaemon移植
libdaemon移植也是configure,make,make install就可以了。configure可以参照我的配置:
#!/bin/bash ./configure \ CC=arm-hisiv300-linux-gcc \ CXX=arm-hisiv300-linux-g++ \ --host=arm-hisiv300-linux \ --prefix=$(pwd)/_hisiv300_install \ ac_cv_func_setpgrp_void=yes\
2.3) libcap移植
make -j8 CROSS_COMPILE=arm-hisiv300-linux- make DESTDIR=/home/softwares/libcap-2.25/_hisiv300_install install
2.4) dbus移植
在libdaemon移植的时候我们可以先用--prefix=$(pwd)/_hisiv300_install选项在一个目录下面编译出libdbus-1.so以便后面我们编译 avahi的时候使用,再去掉—prefix=$(pwd)/_hisiv300_install,这样我们把 dbus-daemon放到板子上的时候就没有路径问题了。
#!/bin/bash ./configure \ CC=arm-hisiv300-linux-gcc \ CXX=arm-hisiv300-linux-g++ \ --host=arm-hisiv300-linux \ --enable-systemd=no\ --enable-selinux=no\ --enable-tests=no\ EXPAT_CFLAGS="-I/home/softwaves/expat-2.2.9/_hisiv300_install/include"\ EXPAT_LIBS="/home/softwaves/expat-2.2.9/_hisiv300_install/lib/libexpat.a"\ --with-session-socket-dir=/var/run/dbus\ --with-system-socket=/var/run/dbus/system_bus_socket\ --with-system-pid-file=/var/run/dbus/pid\ #--prefix=$(pwd)/_hisiv300_install\
2.5) avahi移植
avahi移植起来比较困难 (至少在我看来)。因为在我进行./configure的时候不论怎么设置都提示找不到expat,有知道的大佬可以分享一下。所以我手动改了configure之后的生成的avahi-daemon/Makefile文件。
#!/bin/bash ./configure \ CC=arm-hisiv300-linux-gcc \ CXX=arm-hisiv300-linux-g++ \ --host=arm-hisiv300-linux \ --disable-libevent \ --disable-qt3 \ --disable-qt4 \ --disable-mono \ --with-distro=none \ --disable-glib \ --disable-gobject \ --disable-gtk \ --disable-gtk3 \ LIBDAEMON_CFLAGS="-I/home/softwaves/libdaemon-0.14/_hisiv300_install/include" \ LIBDAEMON_LIBS="/home/softwaves/libdaemon-0.14/_hisiv300_install/lib/libdaemon.a"\ --with-xml=none\ --disable-gdbm\ --disable-python\ --disable-python-dbus\ ac_cv_header_sys_capability_h=yes \ #--prefix=$(pwd)/_hisiv300_install \
avahi-daemon/Makefile修改内容如下,请修改为自己的路径
View Code
至此已经完成所有库的移植。
3. 配置
在ntfs下面运行编译生成的dbus-daemon,会提示找不到配置,把配置拷的板子相关目录,并把编译avahi生成的share/dbus-1/interfaces拷到dbus-daemon的配置目录下面。以下是我的操作,
生成的dbus配置:
生成的avahi,share/dbus-1/interfaces:
考到板子如下:
把生成的so文件拷贝到板子上并添加相应软链接,需要拷贝的so文件有:
libavahi-client.so.3.2.9
libavahi-common.so.3.5.3
libavahi-core.so.7.0.2
libdbus-1.so.3.19.11
添加dbus-daemon和avahi-daemon用户:
adduser avahi -D -H
adduser messagebus -D -H
到现在为此dbus-daemon和avahi-daemon应该能跑起来了。
4. 运行NDI例子
当然你NDI的SDK大家到NDI官网下载就可以了,下载解压是一个shell脚本,运行之后会生成头文件库文件例子等等,把NDI的examples编译出来,比如我的编译命令是
make NDILIB=arm-hisiv300-linux CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++
需要注意的是有编译出来的可执行文件可能会报错,需要在Makefile.proj里面添加
CXXFLAGS += -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations
在运行NDI之前先运行dbus-daemon和avahi-daemon
好了我们可以运行NDI例子了比如NDIlib_Send_HEVC
至此NDI的整个移植算完成了。