5.11.1 基本功能介绍
实时视频流功能是用于机载计算机读取相机的实时视频流,M300上为OSDK端口功能,对应OSDK 4.1中高级视觉的实时视频流功能。区别与PSDK端口相机功能中的推流,PSDK是开发者第三方的相机流向飞机推送,OSDK实时流是读取负载相机推送的视频流。实时视频流接口也支持读取PSDK开发的第三方负载相机流。
实时视频流需要一定的带宽能力来传输,必须使用USB来传输视频流。机载计算机通过此功能实时的获取负载相机或FPV的视频数据,结合实际应用进行视频图像处理,以及通过机载计算机对视频流进行转发等。实时视频流功能仅支持Linux平台,RTOS不支持读取实时视频流。
PSDK 3.x中实时视频流功能与OSDK 4.1中的读取实时视频流功能基本保持一致,都是通过SDK接口向飞机端发起实时流读取,飞机端持续向机载计算机端推送H264的裸流。为方便开发者理解SDK功能,PSDK 3.x中提供的C sample只实现了如何从飞机读取实时流,在C++ sample中实现了基于实时流的解码以及图像处理等sample。实际上,OSDK 4.1也是获取到的H264然后再解码成RGB图像。在此系列文档中,我们对应sample将视频流获取与视频流处理分开说明。
5.11.2 主要代码文件
C sample代码文件
liveview/
├── test_liveview.c
└── test_liveview.h
dji_liveview.h
5.11.3 sample代码实现
功能入口函数
T_DjiReturnCode DjiTest_LiveviewRunSample(E_DjiMountPosition mountPosition);
初始化
/**
* @brief Initialize the liveview module.
* @note The interface initialization needs to be after DjiCore_Init.
* @return Execution result.
*/
T_DjiReturnCode DjiLiveview_Init(void);
API简介:
-
初始化live view模块,使用live view接口时需要先调用此接口。在camera manager sample中因为调用live view接口切换镜头就需要先初始化live view模块。
开始获取H264流
/**
* @brief Start the FPV or Camera H264 Stream by selected position.
* @param position: point out which camera to output the H264 stream
* @param source: point out which sub camera to output the H264 stream
* @param callback: callback function that is called in a callback thread when a new h264 frame is received
* @return Execution result.
*/
T_DjiReturnCode DjiLiveview_StartH264Stream(E_DjiLiveViewCameraPosition position, E_DjiLiveViewCameraSource source,
DjiLiveview_H264Callback callback);
API简介
-
向飞机发起读取指定位置相机/FPV,指定镜头(H20/T)的视频流,发起之后,飞机将持续通过回调上抛H264流数据,可通过DjiLiveview_StopH264Stream停止。
参数
-
position,指定需要开启视频流的位置
-
source,指定获取视频流的镜头源,H20/T包含多镜头,通过此参数设置镜头。
-
callback,注册给lib的回调函数,通过此回调函数来上抛H264流数据,通常为应用端对流的处理。sample将裸流保存为H264文件。
回调函数原型:
typedef void (*DjiLiveview_H264Callback)(E_DjiLiveViewCameraPosition position, const uint8_t *buf, uint32_t len);
流数据处理
sample代码中同时开启了FPV和主相机的视频流,分别注册将回调注册到Lib中:
DjiTest_FpvCameraStreamCallback
DjiTest_PayloadCameraStreamCallback
两个函数均是将裸流写入文件,可以根据实际需要修改此部分处理。
说明:
因为实时视频流涉及解码性能以及实时性,且DJI相机的码流较大,简单说明理解一下回调函数的应用。回调函数注册到lib中是被lib中触发和执行的,以此回调函数举例,我们可以大致猜想Lib也是在拿到视频流后执行这个函数,上抛数据。按照视频帧率,拿到的视频流应该在30fps左右,如果此回调在lib中执行时间过长,很可能会影响底层数据的上抛,从而导致拿到的数据不全。此已经在OSDK 4.1 + H20T中验证过。参考帖。
也就是如果平台解码性能不佳的情况下,如果直接在注册的回调中解码,就可能出现回调的执行影响底层数据的接收。所以建议不要在此回调中执行耗时且不确定的功能,可以在此回调中再将数据抛到一个缓存,总之一个原则,应用端使用不要影响到底层数据接收。
PSDK 3.x中用了较多的回调函数来关联应用与底层lib功能,严格来说回调都可能存在干扰底层的工作,如果回调发生阻塞可能会导致PSDK功能异常,甚至会出现与飞机通信断开。所以在PSDK开发过程中需要注意回调的使用。
5.11.4 开发注意事项
-
实时视频流通过USB通信,需要确保USB连接正常且通信正常。
-
可以同时指定多路视频流,但需要评估带宽是否足够。
-
从飞机端拿视频流很简单,是固定的H264(GDR),重点在于拿到视频后的处理。解码可以根据实际应用和需求进行处理,比如使用ffmpeg、硬解码等。
-
注意回调的处理,不要干扰lib对流数据的接收。
-
OSDK获取视频流是从飞机端获取视频流,本身没有转发或组网功能。可以结合机载计算机组网,并开发转发功能。
-
评论
4 条评论
运行这个sample,报这个错误,是怎么回事?
[4.204][user]-[Info]-[DjiTest_LiveviewRunSample:69) --> Step 1: Init liveview module
[4.204][liveview]-[Error]-[DjiLiveview_UdpRegisterCallback:824) Get remote addr failed, ret:228.
[4.204][liveview]-[Error]-[DjiLiveview_Init:310) Init fpv udp stream channel failed, ret:236.
[4.204][user]-[Error]-[DjiTest_LiveviewRunSample:73) Liveview init failed, error code: 0x000000EC
同问
M300上OSDK端口使用PSDK 3.3及之后的版本,注意将USB链路设置为bulk:
https://sdk-forum.dji.net/hc/zh-cn/articles/13296411829145
dji_sdk_config.h
#define DJI_USE_ONLY_UART (0)
#define DJI_USE_UART_AND_USB_BULK_DEVICE (1)
#define DJI_USE_UART_AND_NETWORK_DEVICE (2)
/*!< Attention: Select your hardware connection mode here.
*/#define CONFIG_HARDWARE_CONNECTION DJI_USE_UART_AND_USB_BULK_DEVICE
你好,我一个负载上有两个Linux系统,可以一个运行PSDK 与M350通讯,一个通过UDP 往指定端口发送视频流吗?
请登录写评论。