Skip to content

JoFmvToolsKit

1. 版本发布记录

1.1. 发布日期

1.2. 新增功能

1.3. 发布列表

2. 基本介绍

2.1. JoFmvToolsKit 功能介绍

JoFmvToolsKit能够实现

  1. 对视频流进行解复用,输出裸码数据
  2. 对视频帧进行解析,得到其中的元数据信息
  3. 对视频流进行解码,输出BGR24的数据
  4. 将视频流再复用,输出ts,flv,mp4等格式的视频数据
  5. 获取一些视频相关信息,如视频文件长度,视频帧宽高等
  6. 支持推流
  7. 启动流媒体服务,对视频流进行再次分发,支持rtsp,rtmp,http,webrtc协议

2.2. JoFmvToolsKit 支持的视频源以及支持的视频编码格式

  1. 支持的视频格式
  • RTSP视频源
  • RTMP视频源
  • TS视频源
  • 本地视频文件
  1. 支持的视频编码格式
  • H264
  • H265

2.2.1 JoFmvToolsKit 的层级架构

3. 快速入门

3.1. 开发须知

3.2. 配置开发环境

3.2.1. 配置Linux开发环境

3.2.1.1. 安装开发工具

  • C++ 编译器:GCC 9.4.0 版本
  • CMake:3.12 及以上版本
  • Linux:Ubuntu 16.04

3.2.1.2 安装第三方依赖库

3.2.2. 配置 Windows 开发环境

4. 数据结构

cpp
static public class ImageVertexCoordinate
    {
        public int Lat;   ///< 纬度 1E7
        public int Lon;   ///< 经度 1E7
        public int HMSL;  ///< 高度,单位m
    }

简介:

  • 视频图像顶点及中心点坐标

cpp
 static public class CarrierVehiclePosInfo
    {
        public long TimeStamp;     ///< 从1970-01-01:00:00:00开始的毫秒数
        public byte TimeZone;       ///< 时区

        public short CarrierVehicleHeadingAngle;///< 飞机偏航角,1E4,单位弧度
        public short CarrierVehiclePitchAngle;  ///< 飞机俯仰角,1E4,单位弧度
        public short CarrierVehicleRollAngle;   ///< 飞机滚转角,1E4,单位弧度

        public int CarrierVehicleLat;         ///< 飞机纬度,1E7
        public int CarrierVehicleLon;         ///< 飞机经度,1E7
        public int CarrierVehicleHMSL;        ///< 飞机海拔高度,1E2,单位m

        public int DisFromHome;   ///< 离家距离,单位m
        public short HeadingFromHome;///< 离家方位角,*100,单位弧度

        public short VGnd;          ///< 地速,单位m/s
        public short Tas;           ///< 空速,单位m/s

        public short VNorth;         ///< 地速(北),1E2,单位m/s
        public short VEast;          ///< 地速(东),1E2,单位m/s
        public short VDown;          ///< 地速(地),1E2,单位m/s

        public int FlySeconds;    ///< 飞机飞行时间,单位s
    }

简介:

  • 无人机POS数据

cpp
static public class CarrierVehicleStatusInfo
    {
        public char CarrierVehicleSN[];             ///< 无人机飞控序列号,手动设置
        public short CarrierVehicleID;             ///< 无人机唯一ID
        public int CarrierVehicleFirmwareVersion;///< 无人机固件版本,手动设置
        public byte VeclType; ///< 飞机型号,0:cw007 1:cw10 2:cw15 3:cw20 4:cw25 5:cw30 6:CW100

        public byte Pdop;               ///< 卫星精度
        public byte NumSV;              ///< 卫星颗数

        public byte Orienteering;       ///< RTK状态,RTK状态,0: RTK 1:SINGLE

        public short RPM;               ///< 发动机转速,r/m
        public byte ThrottleCmd;        ///< 油门指令,1E2
        public short MPowerV;           ///< 主电源,单位V
        public short MPowerA;           ///< 动力电源,单位V
        public byte ElecricQuantity;    ///< 电池电量百分比
        public int EnduranceMileage;  ///< 剩余续航里程,单位m

        /**
        * @brief 搜索任务
        * @details \n
        *	0: NO_TASK,         无任务		OFF \n
        *	1: SEARCH_TASK,     搜寻任务		SCH \n
        *	2: TP_OBSERVE_TASK, 临时观察任务	TPO \n
        *	3: CT_OBSERVE_TASK, 持续观察任务	CTO \n
        *	4: TRACK_TASK,      跟踪任务		TRK \n
        *	5: IDLE_TASK,       闲置任务		IDL \n
        */
        public byte ScoutTask;

        /**
        * @brief 自驾状态
        * @details \n
        *	GROUND_TEST,                  //0  地面测试  GTST \n
        *	APV_PRE_LAUNCH_STATE,	      //1  飞前检查 PLCH \n
        *	APV_ATT_ASSIST_STATE,         //2  姿态辅助 ATT \n
        *	APV_HOVER_ASSIST_STATE,       //3  悬停辅助 HOR \n
        *	APV_LIFT_OFF_STATE,           //4  离地 LIFT \n
        *	APV_CLIMB_OUT_STATE,          //5  爬升 CLMB \n
        *	APV_ACCELERATE_STATE,         //6  加速 ACCL \n
        *	APV_V2L_STATE,                //7  垂转平 V2L \n
        *	APV_FLYING_STATE,             //8  飞行  FLY \n
        *	APV_LANDING_STATE,            //9  降落 LAND \n
        *	APV_DECELERATE_STATE,         //10 减速 DECL \n
        *	APV_L2V_STATE,                //11 平转垂 L2V \n
        *	APV_FINAL_HOVER_STATE,        //12 末端悬停 FNHR \n
        *	APV_FINAL_DESCENT_STATE,      //13 末端下降 FNDC \n
        *	APV_FORCED_LANDING_STATE,     //14 迫降 FRLD \n
        *	APV_AHRS_FORCED_LANDING_STATE,//15 AHRS迫降  AFRLD \n
        *	APV_SEMI_AUTO_ASSIST_STATE,   //16 半自动辅助 SAST \n
        *	APV_SEMI_AUTO_V2L_STATE,      //17 半自动垂转平 SV2L \n
        *	APV_SEMI_AUTO_L2V_STATE,      //18 半自动平转垂 SL2V \n
        *	APV_AUTO_HOVER_STATE,         //19 即时悬停 AHOR \n
        *	APV_SELF_DESTRUCTION_STATE,   //20 自毁 DSRC
        */
        public int APModeStates;

        public short TasCmd;            ///< 空速指令,*10
        public short HeightCmd;          ///< 高度指令,单位m

        public short WypNum;             ///< 当前跟踪航路点
    }

简介:

  • 无人机状态数据

cpp
 static public class GimbalPosInfo
    {
        public short VisualViewAngleHorizontal; ///< 可见光水平视场角,单位弧度,1E4
        public short VisualViewAngleVertical;   ///< 可见光垂直视场角,单位弧度,1E4
        public short InfaredViewAngleHorizontal;///< 红外水平视场角,单位弧度,1E4
        public short InfaredViewAngleVertical;  ///< 红外垂直视场角,单位弧度,1E4

        public short FocalDistance;             ///< 焦距,单位mm

        public short GimbalPan;                  ///< 吊舱航向欧拉角,单位弧度,1E4
        public short GimbalTilt;                 ///< 吊舱俯仰欧拉角,单位弧度,1E4
        public short GimbalRoll;                 ///< 吊舱滚转欧拉角,单位弧度,1E4

        public short FramePan;                   ///< 航向框架角,单位弧度,1E4
        public short FrameTilt;                  ///< 俯仰框架角,单位弧度,1E4
        public short FrameRoll;                  ///< 滚转框架角,单位弧度,1E4

        public int TGTLat;                     ///< 目标纬度,单位度
        public int TGTLon;                     ///< 目标经度,单位度
        public short TGTHMSL;                    ///< 目标高度,单位m
        public short TGTVelocity;               ///< 目标速度,*100,单位m/s
        public short TGTHeading;                 ///< 目标速度方位角,*100,单位弧度
        public short SlantR;                    ///< 目标估距
    }

简介:

  • 吊舱POS数据

cpp
static public class GimbalStatusInfo
    {
        public short GMPower;                   ///< 吊舱电源,*50

        /**
        * @brief 吊舱工作模式
        * @details \n
        *	0x00 速率模式
            ServoCmd0为航向指令,1e4,rad/s \n
            ServoCmd1为俯仰指令,1e4,rad/s \n
             \n
            0x01 姿态模式,手柄不支持 \n
             \n
            0x02 关伺服(休眠使用) \n
             \n
            0x03 归零位锁定 \n
             \n
            0x04 零位调整,1e4,rad/s \n
            ServoCmd0为航向零位调整量, \n
            ServoCmd1为俯仰零位调整量, \n
             \n
            0x05 航向扫描 \n
            ServoCmd0为航向扫描速率 1e4,rad/s \n
             \n
            0x06 框架角模式 \n
            ServoCmd0为航向指令,1e4,rad \n
            ServoCmd1为俯仰指令,1e4,rad \n
             \n
            0x08 低能量控制 \n
             \n
            0x09 球机速率补偿注入(每按下一次发送0.01度/S的补偿速率值) \n
        */
        public byte ServoCmd;

        public short ServoCmd0;                  ///< 吊舱航向指令,1E4,单位rad,rad/s
        public short ServoCmd1;                  ///< 吊舱俯仰指令,1E4,单位rad,rad/s

        public short PixelElement;              ///< 像元大小,单位um

        public byte GimbalDeployCmd;             ///< 吊舱收放 0:收起 1:放下

        /**
        * @brief 黑热或白热
        * @details \n
        *	0:白热 \n
        *	1:黑热 \n
        *	2:伪彩1 \n
        *	3:伪彩2 \n
        *	4:伪彩3 \n
        *	5:伪彩4 \n
        *	6:伪彩5 \n
        */
        public byte W_or_B;

        public byte FovLock;                    ///< 视场角是否锁定
    }

简介:

  • 吊舱状态数据

cpp
static public class ImageProcessingBoardInfo
    {
        public short SearchWidth;               ///< 搜索框宽度
        public short SearchHeight;              ///< 搜索框高度

        public short ServoCrossX;               ///< 随动中心X坐标
        public short ServoCrossY;               ///< 随动中心Y坐标
        public short ServoCrossWidth;           ///< 随动十字宽度
        public short ServoCrossHeight;          ///< 随动十字高度

        public short TrackLeftTopX;             ///< 跟踪框左上角X坐标
        public short TrackLeftTopY;             ///< 跟踪框左上角Y坐标
        public short TrackWidth;                ///< 跟踪框宽度
        public short TrackHeight;               ///< 跟踪框高度

        ImageVertexCoordinate ImgCood[];   ///< 视频图像5个点的坐标

        public short SDMemory;                  ///< SD卡剩余内存,*10,单位G
        public short SnapNum;                   ///< 快照数

        /**
        * @brief SD卡状态
        * @details \n
        *	0:SD卡正常; \n
        *	1:无mmcblk1设备; \n
        *	2:mmcblk1设备挂载成功,但删除文件失败,SD卡内存空间小于200M; \n
        *	3:mmcblk1设备挂载成功,但删除文件失败,SD卡内存空间大于200M,小于8G; \n
        *	4:有mmcblk1设备,但是未挂载成功
        */
        public byte SDFlag;

        /**
        * @brief 录制状态
        * @details \n
        *	0:未录制; \n
        *	1:录制; \n
        *	2:未录制;
        */
        public byte RecordFlag;

        /**
        * @brief 跟踪类型
        * @details \n
        *	0:红外跟踪 \n
        *	1:可见光跟踪 \n
        *	2:非跟踪态
        */
        public byte TrackFlag;

        /**
        * @brief 车辆跟踪 \n
        * @details \n
        *	0:关闭 \n
        *	1:开启
        */
        public byte AI_R;

        /**
        * @brief 车辆跟踪状态
        * @details \n
        *	1:车辆跟踪 \n
        *	0:非车辆跟踪
        */
        public byte CarTrack;

        /**
        * @brief 跟踪类别
        * @details \n
            0:Car ; \n
            1:Truck; \n
            2:Bus; \n
            3:not
        */
        public byte TrackClass;

        /**
        * @brief 跟踪状态
        * @details \n
            0x00:非车辆锁定  \n
            0x01:脱锁,进入速率半自主 \n
            0x02:跟踪状态不佳,但仍是跟踪态,仅关闭RTT \n
            0x03:车辆锁定
        */
        public byte TrackStatus;

        public int Version;                   ///< 图像处理程序版本号
    }

    static public class GimbalPayloadInfos
    {
        public GimbalPosInfo GimbalPosInfo_p;
        public GimbalStatusInfo GimbalStatusInfo_p;
        public ImageProcessingBoardInfo ImageProcessingBoardInfo_p;
    }

简介:

  • 图像处理板数据

cpp
static public class JoFmvMetaDataBasic
    {
        public CarrierVehiclePosInfo CarrierVehiclePosInfo_p;       ///< 无人机POS数据
        public CarrierVehicleStatusInfo CarrierVehicleStatusInfo_p; ///< 无人机状态数据

        /**
        * @brief 标明载荷类型
        * @details \n
        *	PayloadOptions & 0x01 不等于0代表存在吊舱载荷
        */
        public byte PayloadOptions;// TODO: 这个可以去掉

        public GimbalPayloadInfos GimbalPayloadInfos_p;             ///< 吊舱POS数据
    }
}

public class CommonDefines {
    static public enum MuxedDataType { MuxedDataType_FLV, MuxedDataType_TS, MuxedDataType_FMV_TS, MuxedDataType_FMP4};

    static public class JoFmvTKConfig
    {
        // 线程数
        public int thread_num;

        // 日志级别,支持0~4
        public int log_level;
        //控制日志输出的掩模,请查看JO_FMVTK_LOG_CONSOLE、JO_FMVTK_LOG_FILE、JO_FMVTK_LOG_CALLBACK等宏
        public int log_mask;
        //文件日志保存路径,路径可以不存在(内部可以创建文件夹),设置为NULL关闭日志输出至文件
        public String log_file_path;
        //文件日志保存天数,设置为0关闭日志文件
        public int log_file_days;

        // 配置文件是内容还是路径
        public int ini_is_path;
        // 配置文件内容或路径,可以为NULL,如果该文件不存在,那么将导出默认配置至该文件
        public String ini;

        // ssl证书是内容还是路径
        public int ssl_is_path;
        // ssl证书内容或路径,可以为NULL
        public String ssl;
        // 证书密码,可以为NULL
        public String ssl_pwd;

        public String http_root_path;
    }

简介:

  • 元数据数据基础

cpp
static public class JoFmvTKPacket
    {
        public int size;                           ///< 数据长度

        public int flags;                          ///< A combination of AV_PKT_FLAG values

        public long pts;                        ///< 显示时间戳
        public long dts;                        ///< 解码时间戳
        public long duration;                   ///< 当前帧建议的播放时长

        public byte data[];                      ///< 码流缓冲区

        public byte meta_data_valid;         ///< 元数据是否有效
        public MetaDataStructure.JoFmvMetaDataBasic meta_data_basic; ///< 姿态数据
    }

简介:

  • 视频裸码帧数据结构,包括相关属性和元数据

cpp
static public class JoFmvTKMuxedData
    {
        public byte data[];                        ///< 视频数据缓冲区
        public int size;                             ///< 视频数据大小

        public long current_time;               ///< 当前包时间点,从0开始,单位毫秒
        public long pts;							///< 显示时间戳
        public long dts;							///< 解码时间戳

        //public MuxedDataType muxed_data_type;        ///< 封装类型

        public byte meta_data_valid;           ///< 元数据是否有效
        public MetaDataStructure.JoFmvMetaDataBasic meta_data_basic;   ///< 姿态数据
    }
}

简介:

  • 复用封装后的数据结构,包含相关属性和元数据

5. 功能模块

5.1. jo_fmv_tk.h

5.1.1. 所有方法


cpp
typedef void(*jo_fmvtk_meta_data_callback)(JoFmvMetaDataBasic meta_data, int64_t current_time, void* opaque);

功能:

元数据(姿态数据)回调

参数:

  • meta_data:元数据结构体指针,无需删除,用户需拷贝一份,函数返回后将不再可用
  • current_time:当前时间点,从0开始,单位毫秒
  • opaque:透传参数

cpp
typedef void(*jo_fmvtk_packet_callback)(jo_fmvtk_packet packet, void* opaque);

功能:

  • 视频裸码数据回调

参数:

  • packet:视频裸码数据结构体指针,需要调用jav_vtk_packet_free删除
  • opaque:透传指针

返回值:


cpp
typedef void(jo_fmvtk_stop_callback)(int exit_code, void* opaque);

功能:

  • 结束处理时回调,可能文件读取完成,可能发生不可恢复错误,可能用户调用了close

参数:

  • exit_code:退出码
  • opaque:透传指针

返回值:


cpp
typedef void(jo_fmvtk_stream_timeout_recover_callback)(int type_code, void* opaque);

功能:

  • 流超时、恢复回调

参数:

  • type_code:0超时,1恢复
  • opaque:透传指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT jo_fmvtk* jo_fmvtk_create();

功能:

  • 创建一个jouav full motion video tools kit实例

参数:

  • exit_code:退出码
  • opaque:透传指针

返回值:

  • fmvtk:实例指针

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT void jo_fmvtk_destroy(jo_fmvtk* fmvtk);

功能:

  • 销毁一个jouav full motion video tools kit实例

参数:

  • fmvtk:video tools kit实例指针

返回值:

  • 0成功,非0失败

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_set_meta_data_callback(jo_fmvtk* fmvtk, jo_fmvtk_meta_data_callback meta_data_callback, void* opaque);

功能:

  • 设置元数据回调函数

参数:

  • fmvtk:video tools kit实例指针
  • meta_data_callback:元数据回调

返回值:

  • 0成功,非0失败

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_set_packet_callback(jo_fmvtk* fmvtk, jo_fmvtk_packet_callback packet_callback, void* opaque);

功能:

  • 设置裸流回调函数

参数:

  • fmvtk:video tools kit实例指针
  • packet_callback:裸流回调

返回值:

  • 0成功,非0失败

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_set_stop_callback(jo_fmvtk* fmvtk, jo_fmvtk_stop_callback stop_callback, void* opaque);

功能:

  • 设置结束时回调函数

参数:

  • fmvtk:video tools kit实例指针
  • stop_callback 回调

返回值:

  • 0成功,非0失败

plain
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_set_stream_timeout_recover_callback(jo_fmvtk* fmvtk,
    jo_fmvtk_stream_timeout_recover_callback stream_timeout_recover_callback, void* opaque);

功能:

  • 设置流超时、恢复的回调函数

参数:

  • fmvtk:video tools kit实例指针
  • stream_timeout_recover_callback 回调:0流超时,1流恢复

返回值:

  • 0成功,非0失败

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_open(jo_fmvtk* fmvtk, const char* url, int timeout_ms, int frame_rate=0, const char* adapter_ip = NULL);

功能:

  • 初始化并开始读取或接收处理,获取数据需要用户调用函数

参数:

  • fmvtk:video tools kit实例指针
  • url: 本地视频文件路径、udp地址(格式udp://127.0.0.1:8080)、RTSP地址、RTMP地址
  • timeout_ms 打开超时时间,单位毫秒
  • adapter_ip udp组播时,可指定从哪个ip接入(网卡)
  • frame_rate: 设置的帧率

**返回值:**0成功,非0失败


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_set_current_network_adapter(jo_fmvtk* fmvtk, const char* adapter_ip);

功能:

  • 打开udp组播或广播时,可设置接收网卡open之后调用才有效

参数:

  • fmvtk:video tools kit实例指针
  • url: 本地视频文件路径、udp地址(格式udp://127.0.0.1:8080)、RTSP地址、RTMP地址
  • adapter_ip:udp组播时,可指定从哪个ip接入(网卡)

返回值:

0成功,非0失败


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT void jo_fmvtk_close(jo_fmvtk* fmvtk);

功能:

  • 关闭实例

参数:

  • fmvtk:video tools kit实例指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int64_t jo_fmvtk_get_duration(jo_fmvtk* fmvtk);

功能:

  • 获取视频文件长度

参数:

  • fmvtk:video tools kit实例指针

返回值:

  • 视频文件的长度,单位为秒,在线视频返回0

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_get_frame_width(jo_fmvtk* fmvtk);

功能:

  • 获取视频宽度,在获取到第一帧数据后才可调用

参数:

  • fmvtk:video tools kit实例指针

返回值:

  • 视频宽度

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_get_frame_height(jo_fmvtk* fmvtk);

功能:

  • 获取视频高度

参数:

  • fmvtk:video tools kit实例指针

返回值:

  • 视频高度

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT void jo_fmvtk_seek(jo_fmvtk* fmvtk, float percent);

功能:

  • 视频跳转,播放文件时有效

参数:

  • fmvtk:video tools kit实例指针

返回值:

  • 视频高度

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_get_error_description(jo_fmvtk* fmvtk);

功能:

  • 获取错误描述

参数:

  • fmvtk:video tools kit实例指针

返回值:

错误描述的字符串


plain
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT GeographicLatLng jo_fmvtk_get_geographic_lat_lng(jo_fmvtk* fmvtk, double heading,
    double pitch, double roll, double psi, double theta, double delta, double latitude, double lontitude, double altitude,
    double pHeight, int x, int y, float foh);

功能:

  • 获取直接地理定位计算坐标

参数:

  • fmvtk:video tools kit实例指针
  • heading:飞机偏航角
  • pitch:飞机俯仰角
  • roll:飞机滚转角
  • psi:吊舱框架偏航角
  • theta:吊舱框架俯仰角
  • delta:吊舱框架滚转角
  • latitude:飞机经度
  • lontitude:飞机纬度
  • altitude:飞机高度
  • pHeight:物体高度
  • x:输入像素x坐标
  • y:输入像素y坐标
  • foh:水平视场角

返回值:

直接地理定位计算坐标

5.2 jo_fmv_tk_decoder.h

5.2.1. 所有方法

cpp
typedef void(*jo_fmvtk_frame_callback)(jo_fmvtk_frame frame, void* opaque);

功能:

  • 解码后的图像数据回调

参数:

  • frame:解码后图像数据结构体指针,图像格式为BGR24,需要调用jav_vtk_frame_free删除
  • opaque: 透传参数

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_create_decoder(jo_fmvtk* fmvtk, jo_fmvtk_frame_callback frame_callback, void* opaque);

功能:

  • 解码后的图像数据回调

参数:

  • frame:video tools kit实例指针
  • frame_callback: 解码后图像回调
  • opaque
    返回值:

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT void jo_fmvtk_destroy_decoder(jo_fmvtk* fmvtk);

功能:

  • 停止解码并销毁解码器

参数:

  • fmvtk:video tools kit实例指针

返回值:

  • 0成功,非0失败

5.3. jo_fmv_tk_frame.h

5.3.1. 所有方法

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT uint8_t** jo_fmvtk_frame_get_data(jo_fmvtk_frame frame);

功能:

  • 获取图像数据缓冲区指针,数组长度为8

参数:

  • packet:图像数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int* jo_fmvtk_frame_get_line_size(jo_fmvtk_frame frame);

功能:

  • 获取图像数据行长度,数组长度为8

参数:

  • packet:图像数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_frame_get_width(jo_fmvtk_frame frame);

功能:

  • 获取图像宽度

参数:

  • packet:图像数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_frame_get_height(jo_fmvtk_frame frame);

功能:

  • 获取图像高度

参数:

  • packet:图像数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_frame_get_format(jo_fmvtk_frame frame);

功能:

  • 获取图像格式

参数:

  • packet:图像数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int64_t jo_fmvtk_frame_get_pts(jo_fmvtk_frame frame);

功能:

  • 获取图像显示时间戳

参数:

  • packet:图像数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int64_t jo_fmvtk_frame_get_dts(jo_fmvtk_frame frame);

功能:

  • 获取图像解码时间戳

参数:

  • packet:图像数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int64_t jo_fmvtk_frame_get_duration(jo_fmvtk_frame frame);

功能:

  • 获取图像时间长度

参数:

  • packet:图像数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int64_t jo_fmvtk_frame_get_current_time(jo_fmvtk_frame frame);

功能:

  • 获取图像当前时间点

参数:

  • packet:图像数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_frame_get_meta_data_valid(jo_fmvtk_frame frame);

功能:

  • 获取元数据是否有效

参数:

  • packet:图像数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT JoFmvMetaDataBasic jo_fmvtk_frame_get_meta_data_basic(jo_fmvtk_frame frame);

功能:

  • 获取元数据

参数:

  • packet:图像数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT void jo_fmvtk_frame_release(jo_fmvtk_frame frame);

功能:

  • 销毁这帧数据,使用完必须删除

参数:

  • packet:图像数据结构指针

返回值:

5.4. jo_fmv_tk_muxed_data.h

5.4.1. 所有方法

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT uint8_t* jo_fmvtk_muxed_data_get_data(jo_fmvtk_muxed_data muxed_data);

功能:

  • 获取封装数据缓冲区指针

参数:

  • packet:封装数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_muxed_data_get_size(jo_fmvtk_muxed_data muxed_data);

功能:

  • 获取封装数据缓冲区大小

参数:

  • packet:封装数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int64_t jo_fmvtk_muxed_data_get_current_time(jo_fmvtk_muxed_data muxed_data);

功能:

  • 获取封装数据缓冲区当前时间点,单位毫秒

参数:

  • packet:封装数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int64_t jo_fmvtk_muxed_data_get_pts(jo_fmvtk_muxed_data muxed_data);

功能:

  • 获取封装数据显示时间戳

参数:

  • packet:封装数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int64_t jo_fmvtk_muxed_data_get_dts(jo_fmvtk_muxed_data muxed_data);

功能:

  • 获取封装数据解码时间戳

参数:

  • packet:封装数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT enum MuxedDataType jo_fmvtk_muxed_data_get_type(jo_fmvtk_muxed_data muxed_data);

功能:

  • 获取封装数据的格式

参数:

  • packet:封装数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_muxed_data_get_meta_data_valid(jo_fmvtk_muxed_data muxed_data);

功能:

  • 获取元数据是否有效

参数:

  • packet:图像数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT JoFmvMetaDataBasic jo_fmvtk_muxed_data_get_meta_data(jo_fmvtk_muxed_data muxed_data);

功能:

  • 获取元数据

参数:

  • packet:图像数据结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT void jo_fmvtk_muxed_data_release(jo_fmvtk_muxed_data muxed_data);

功能:

  • 销毁这帧数据,使用完必须删除

参数:

  • packet:图像数据结构指针

返回值:

5.5. jo_fmv_tk_muxer.h

5.5.1. 所有方法

cpp
typedef void(*jo_fmvtk_muxed_data_callback)(jo_fmvtk_muxed_data muxed_data, void* opaque);

功能:

  • 复用后的视频流数据回调

参数:

  • muxed_data:复用后的视频流数据指针,需要调用jav_vtk_muxed_data_free删除
  • opaque:透传参数

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_add_muxer(jo_fmvtk* fmvtk,
    jo_fmvtk_muxed_data_callback muxed_data_callback, void* opaque, MuxedDataType muxed_data_type = MuxedDataType_FMV_TS);

功能:

  • 创建复用器

参数:

  • fmvtk:video tools kit实例指针
  • muxed_data_callback:封装后的数据回调
  • opaque:透传参数

返回值:

  • 复用器ID,大于等于0成功,小于0失败

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_delete_muxer(jo_fmvtk* fmvtk, int id);

功能:

  • 停止复用并销毁复用器

参数:

  • fmvtk:video tools kit实例指针
  • id:复用器ID

返回值:

  • 0成功,非0失败

5.6. jo_fmvtk_packet.h

5.6.1. 所有方法

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT uint8_t* jo_fmvtk_packet_get_data(jo_fmvtk_packet packet);

功能:

  • 获取裸流数据缓冲区

参数:

  • packet:裸流结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_packet_get_size(jo_fmvtk_packet packet);

功能:

  • 获取裸流数据大小

参数:

  • packet:裸流结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int64_t jo_fmvtk_packet_get_pts(jo_fmvtk_packet packet);

功能:

  • 获取显示时间戳

参数:

  • packet:裸流结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int64_t jo_fmvtk_packet_get_dts(jo_fmvtk_packet packet);

功能:

  • 获取解码时间戳

参数:

  • packet:裸流结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int64_t jo_fmvtk_packet_get_duration(jo_fmvtk_packet packet);

功能:

  • 获取时间长度

参数:

  • packet:裸流结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_packet_get_meta_data_valid(jo_fmvtk_packet packet);

功能:

  • 获取元数据是否有效

参数:

  • packet:裸流结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT JoFmvMetaDataBasic jo_fmvtk_packet_get_meta_data(jo_fmvtk_packet packet);

功能:

  • 获取元数据

参数:

  • packet:裸流结构指针

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT void jo_fmvtk_packet_release(jo_fmvtk_packet packet);

功能:

  • 销毁这一包数据,用完后必须删除

参数:

  • packet:裸流结构指针

返回值:

5.7. jo_fmv_tk_pusher.h

5.7.1. 所有方法

cpp
typedef void(*jo_fmvtk_push_stop_callback)(int index, int err_code, const char* err_str, void* opaque);

功能:

  • 推流停止的回调声明

参数:

  • index:推流器的索引
  • err_code:错误码,为0则无错误,正常断开
  • err_str:错误信息描述

返回值:

  • opaque:透传参数

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT void jo_fmvtk_set_push_stop_callback(jo_fmvtk* fmvtk, jo_fmvtk_push_stop_callback push_stop_callback, void* opaque);

功能:

  • 设置推流停止的回调

参数:

  • fmvtk:video tools kit实例指针
  • push_stop_callback:推流停止时的回调
  • opaque:透传参数

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_add_pusher(jo_fmvtk* fmvtk, const char* url, int timeout_ms);

功能:

  • 创建推流器

参数:

  • fmvtk:video tools kit实例指针
  • url:推流地址
  • timeout_ms:打开超时时间

返回值:

  • 推流器ID,大于等于0成功,小于0失败

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_delete_pusher(jo_fmvtk* fmvtk, int id);

功能:

  • 停止推流并销毁推流器

参数:

  • fmvtk:video tools kit实例指针
  • id:推流器ID

返回值:

  • 0成功,非0失败

5.8. jo_fmv_tk_startup.h

5.8.1 所有方法

cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_media_source_get_schema(const jo_fmvtk_media_source ctx);

功能:

  • 从media source获取协议类型

参数:

  • ctx:数据源对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_media_source_get_vhost(const jo_fmvtk_media_source ctx);

功能:

  • 从media source获取虚拟主机

参数:

  • ctx:数据源对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_media_source_get_app(const jo_fmvtk_media_source ctx);

功能:

  • 从media source获取流app

参数:

  • ctx:数据源对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_media_source_get_stream(const jo_fmvtk_media_source ctx);

功能:

  • 从media source获取流id

参数:

  • ctx:数据源对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_media_source_get_reader_count(const jo_fmvtk_media_source ctx);

功能:

  • 从media source获取当前协议播放数量

参数:

  • ctx:数据源对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT int jo_fmvtk_media_source_get_total_reader_count(const jo_fmvtk_media_source ctx);

功能:

  • 从media source获取所有协议当前播放数量

参数:

  • ctx:数据源对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_media_info_get_params(const jo_fmvtk_media_info ctx);

功能:

  • 从media info获取URL参数

参数:

  • ctx:媒体信息对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_media_info_get_params(const jo_fmvtk_media_info ctx);

功能:

  • 从media info获取协议类型

参数:

  • ctx:媒体信息对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_media_info_get_vhost(const jo_fmvtk_media_info ctx);

功能:

  • 从media info获取虚拟主机

参数:

  • ctx:媒体信息对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_media_info_get_app(const jo_fmvtk_media_info ctx);

功能:

  • 从media info获取流app

参数:

  • ctx:媒体信息对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_media_info_get_host(const jo_fmvtk_media_info ctx);

功能:

  • 从media info获取ip地址

参数:

  • ctx:媒体信息对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_media_info_get_stream(const jo_fmvtk_media_info ctx);

功能:

  • 从media info获取流id

参数:

  • ctx:媒体信息对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_media_info_get_host(const jo_fmvtk_media_info ctx);

功能:

  • 从media info获取ip地址

参数:

  • ctx:媒体信息对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT uint16_t jo_fmvtk_media_info_get_port(const jo_fmvtk_media_info ctx);

功能:

  • 从media info获取端口

参数:

  • ctx:媒体信息对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_sock_info_peer_ip(const jo_fmvtk_sock_info ctx, char* buf);

功能:

  • 从socket info获取远程IP地址

参数:

  • ctx:套接字对象
  • buf:存储返回的IP地址

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT const char* jo_fmvtk_sock_info_local_ip(const jo_fmvtk_sock_info ctx, char* buf);

功能:

  • 从socket info获取本地IP地址

参数:

  • ctx:套接字对象
  • buf:存储返回的IP地址

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT uint16_t jo_fmvtk_sock_info_peer_port(const jo_fmvtk_sock_info ctx);

功能:

  • 从socket info获取远程端口

参数:

  • ctx:套接字对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT uint16_t jo_fmvtk_sock_info_local_port(const jo_fmvtk_sock_info ctx);

功能:

  • 从socket info获取本地端口

参数:

  • ctx:套接字对象

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT void jo_fmvtk_publish_auth_invoker_do(const jo_fmvtk_publish_auth_invoker ctx, const char* err_msg);

功能:

  • 在on_fmvtk_media_publish中执行以执行鉴权结果

参数:

  • err_msg:为空或null则代表鉴权成功

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT void jo_fmvtk_auth_invoker_do(const jo_fmvtk_auth_invoker ctx, const char* err_msg);

功能:

  • 在on_fmvtk_media_play中执行以执行鉴权结果

参数:

  • err_msg:为空或null则代表鉴权成功

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT void jo_fmvtk_auth_invoker_do(const jo_fmvtk_auth_invoker ctx, const char* err_msg);

功能:

  • 在on_fmvtk_media_play中执行以执行鉴权结果

参数:

  • err_msg:为空或null则代表鉴权成功

返回值:


cpp
void (* on_fmvtk_media_changed)(int regist, const jo_fmvtk_media_source sender);

功能:

  • 注册或反注册MediaSource事件广播

参数:

  • regist:注册为1,注销为0
  • sender:该MediaSource对象

返回值:


cpp
        void (* on_fmvtk_media_publish)(const jo_fmvtk_media_info url_info,
                                             const jo_fmvtk_publish_auth_invoker invoker,
                                             const jo_fmvtk_sock_info sender);

功能:

  • 收到rtsp/rtmp推流事件广播,通过该事件控制推流鉴权

参数:

  • url_info:推流url相关信息
  • invoker:执行invoker返回鉴权结果
  • sender:该tcp客户端相关信息

返回值:


cpp
void (* on_fmvtk_media_play)(const jo_fmvtk_media_info url_info,
                                          const jo_fmvtk_auth_invoker invoker,
                                          const jo_fmvtk_sock_info sender);

功能:

  • 播放rtsp/rtmp/http-flv/hls事件广播,通过该事件控制播放鉴权

参数:

  • url_info:推流url相关信息
  • invoker:执行invoker返回鉴权结果
  • sender:该tcp客户端相关信息

返回值:


cpp
int (* on_fmvtk_media_not_found)(const jo_fmvtk_media_info url_info,
                                               const jo_fmvtk_sock_info sender);

功能:

  • 未找到流后会广播该事件,请在监听该事件后去拉流或其他方式产生流,这样就能按需拉流了

参数:

  • url_info:推流url相关信息
  • sender:播放客户端相关信息

返回值:

  • 1 直接关闭 0 等待流注册

cpp
 void (* on_fmvtk_media_no_reader)(const jo_fmvtk_media_source sender);

功能:

  • 某个流无人消费时触发,目的为了实现无人观看时主动断开拉流等业务逻辑

参数:

  • sender:该MediaSource对象

返回值:


cpp
void (* on_fmvtk_flow_report)(const jo_fmvtk_media_info url_info,
                                           size_t total_bytes,
                                           size_t total_seconds,
                                           int is_player,
                                           const jo_fmvtk_sock_info sender);

功能:

  • 停止rtsp/rtmp/http-flv会话后流量汇报事件广播

参数:

  • url_info:推流url相关信息
  • total_bytes:耗费上下行总流量,单位字节数
  • total_seconds:本次tcp会话时长,单位秒
  • is_player:客户端是否为播放器

返回值:


cpp
void (* on_fmvtk_log)(int level, const char* file, int line, const char* function, const char* message);

功能:

  • 日志输出广播

参数:

  • level:日志级别
  • file:源文件名
  • line:源文件行
  • function:源文件函数名
  • message:日志内容

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT void jo_fmvtk_startup(jo_fmvtk_config* config, jo_fmvtk_events* events = NULL);

功能:

  • 初始化环境

参数:

  • config:初始化配置
  • log_callback:日志回调函数

返回值:


cpp
JOFULLMOTIONVIDEOTOOLSKIT_EXPORT void jo_fmvtk_cleanup();

功能:

  • 销毁所有环境资源

参数:

返回值:

joplayer.js 是在 HTML5 上直接播放 webrtc 的播放器,针对低延迟直播优化,可用于各种低延迟回放。

6. joplayer

概述

joplayer.js 通过 JavaScript 对接流媒体服务器,完成建链,把音视频数据喂入 HTML5 <video> 元素。

下载

javascript
http://47.92.86.16:4873/-/web/detail/joplayer.js

功能

  • 回放流媒体服务器分发的 webrtc 流;
  • 超低延迟,最佳情况延迟可低达 1 秒以内;
  • 支持 Chrome, FireFox, Safari, Edge 或任何基于 Chromium 的浏览器;
  • 支持对 HTMLMediaElement 内部缓冲的自动延迟追赶;
  • 极低的 CPU 使用率和内存使用量(单个实例约使用 JS 堆 10MiB);
  • 超低开销并且由你的浏览器硬件加速;
  • 专门的元数据传输通道,保证同步,灵活开发;

跨域

若在与页面不同的独立的服务器串流,必须设置 CORS 的 Access-Control-Allow-Origin 头。

快速开始

html
<script src="joplayer.js"></script>

<video id="videoElement"></video>

<script>
  var videoElement = document.getElementById("videoElement");
  var player = joplayer.createPlayer(
    {
      type: "rtc",
      url: "webrtc://127.0.0.1/live/livestream"
    },
    {
      timeOut: 5000,
      isTcp: false
    }
  );
  player.on(
    joplayer.Events.ERROR,
    function (errorType, errorDetials, errorInfo) {
      (logbox.value = logbox.value + "player error: error type: " + errorType),
        " + error detials: " + errorDetials,
        " + error info: " + errorInfo;
      logbox.scrollTop = logbox.scrollHeight;
    }
  );
  player.on(joplayer.Events.LOADING_COMPLETE, function () {
    logbox.value = logbox.value + "loading complete" + "\n";
    logbox.scrollTop = logbox.scrollHeight;
  });
  player.on(joplayer.Events.MEDIA_INFO, function (mediaInfo) {
    logbox.value = logbox.value + "media info: " + mediaInfo + "\n";
    logbox.scrollTop = logbox.scrollHeight;
  });
  player.on(joplayer.Events.WEBRTC_CONNECTED, function () {
    logbox.value = logbox.value + "webrtc connected" + "\n";
    logbox.scrollTop = logbox.scrollHeight;
  });
  player.on(joplayer.Events.WEBRTC_CONNECT_FAILED, function () {
    logbox.value = logbox.value + "webrtc connect failed" + "\n";
    logbox.scrollTop = logbox.scrollHeight;
  });
  player.on(joplayer.Events.WEBRTC_DISCONNECTED, function () {
    logbox.value = logbox.value + "webrtc disconnected" + "\n";
    logbox.scrollTop = logbox.scrollHeight;
  });
  player.on(joplayer.Events.WEBRTC_DATA_ARRIVED, function (data) {
    //logbox.value = logbox.value + "webrtc data arrived: " + data + '\n';
    //logbox.scrollTop = logbox.scrollHeight;
  });
  player.attachMediaElement(videoElement);
  player.load();
  player.play();
</script>

限制

  • IE11 等旧浏览器不支持
  • iOS 必须走tcp,但在 iPadOS 上可用udp

6.2 joplayer-vue

概述

该组件是基于Vue3+vite+ts,以及joplayer.js封装的适用于播放实时直播流:
包含功能:
1、支持ai数据的绘制
2、支持回放视频流的播放,暂停,快进、全屏
3、支持OSD数据的显示,全开、半开展示

下载

javascript
http://47.92.86.16:4873/-/web/detail/joplayer-vue

快速开始

javascript
<script setup lang="ts">
import { onMounted, ref, onBeforeUnmount, reactive } from "vue";
import { JoPlayer } from "joplayer-vue";  // 引入组件
import "joplayer-vue/dist/style.css";// 引入组件样式

const isShowOsd = ref(false); // 是否显示OSD面板
const joplayerRef = ref();
const isAllOpenOSD = ref(true); // 是否全开OSD面板
const isShowControls = ref(false); // 是否打开回放控制条
// 视频配置文件
const videoConfig = reactive({
  videoUrl: "webrtc://xxxxxx", // 视频直播流地址
  videoId: "video-id", // 视频id
});
/**
 * 修改播放状态
 * @param state 播放状态,true表示播放,false表示暂停
 */
const changePlayState = (state: boolean) => {
  console.log("修改播放状态", state);
  // 请求接口更改回放状态
};
/**
 * 修改播放时间
 * @param time 播放时间,以毫秒为单位
 */
const changePlayTime = (time: number) => {
  console.log("修改播放时间", time);
  // 请求接口更改回放时间
};
/**
 * 开始视频回放
 * 此函数模拟请求接口以开始回放,并在获取到地址后创建joplayer实例
 */
const startVideo = () => {
  console.log("开始回放");
  // 请求接口开始回放
  // 拿到地址后创建joplayer
};

onMounted(() => {
  // 创建joplayer
  joplayerRef.value.loadJoPlayer();
});
onBeforeUnmount(() => {
  // 销毁joplayer
  joplayerRef.value.destroyPlayer();
});
</script>

<template>
  <div class="container">
    <JoPlayer
      ref="joplayerRef"
      :videoConfig="videoConfig"
      :isAllOpenOSD="isAllOpenOSD"
      :isShowOsd="isShowOsd"
      :isShowControls="isShowControls"
    />
    <button class="button" @click="isAllOpenOSD = !isAllOpenOSD">
      切换OSD
    </button>

    <button class="button1" @click="isShowOsd = !isShowOsd">打开OSD</button>

    <button class="button2" @click="isShowControls = !isShowControls">
      打开控制组件
    </button>

  </div>

</template>

API

  • Props
名称描述类型默认值
videoConfigJoplayer配置文件VideoConfig
isShowOsd是否显示OSD面板booleanfalse
isAllOpenOSDOSD面板显示模式:true 全开,false 半开booleantrue
isShowControls回放视频控制组件(仅回放传)booleanfalse
  • Events
名称说明Type
changePlayState回放-改变回放视频状态:true:开始,false:暂停(state: boolean) => void
changePlayTime回放-改变当前回放的进度(time: number) => void
startVideo回放-开始播放回放视频() => void

方法
Joplayer 组件有以下方法
loadJoPlayer: 创建Joplayer播放
destroyPlayer:销毁joplayer

7.代码示例

7.1 decode

decode示例代码如下:

plain
#include <iostream>
#include <thread>

#include <signal.h>

#include "jo_fmv_tk.h"
#include "jo_fmv_tk_decoder.h"

static int flag = 1;

static void frame_callback(jo_fmvtk_frame frame, void* opaque);
static void stop_callback(int exit_code, void* opaque);

int main(int argc, char* argv[])
{
    if (argc < 2) {
        //to do something...
    }

    jo_fmvtk* fmvtk = jo_fmvtk_create();

    jo_fmvtk_set_stop_callback(fmvtk, stop_callback, nullptr);

    int ret = jo_fmvtk_open(fmvtk, url.c_str(), 5000);
    if (ret != 0) {
        //to do something...
    }

    ret = jo_fmvtk_create_decoder(fmvtk, frame_callback, nullptr);
    if (ret != 0) {
        //to do something...
    }

    signal(SIGINT, [](int) { flag = 0; });
    while (flag) {
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }

    jo_fmvtk_destroy_decoder(fmvtk);

    jo_fmvtk_close(fmvtk);

    jo_fmvtk_destroy(fmvtk);

    return 0;
}

static void frame_callback(jo_fmvtk_frame frame, void* opaque)
{
     //frame_callback
}

static void stop_callback(int exit_code, void* opaque)
{
    //stop_callback
}

7.2 muxer

muxer示例代码如下:

cpp
#include <iostream>
#include <thread>

#include <signal.h>
#include <stdio.h>

#include "jo_fmv_tk.h"
#include "jo_fmv_tk_muxer.h"

static int flag = 1;
static FILE* out_file{};

int main(int argc, char* argv[])
{
    if (argc < 2) {
        //to do something...
    }


    jo_fmvtk* fmvtk = jo_fmvtk_create();

    jo_fmvtk_set_stop_callback(fmvtk, [](int exit_code, void* opaque) {
        //stop_callback
    }, nullptr);

    out_file = fopen("test.ts", "wb");

    int ret = jo_fmvtk_open(fmvtk, url.c_str(), 5000, 50);
    if (ret != 0) {
        //to do something...
    }


    int muxer_index = jo_fmvtk_add_muxer(fmvtk, [](jo_fmvtk_muxed_data muxed_data, void* opaque) {
        //jo_fmvtk_muxed_data_callback
        }
    }, nullptr);
    if (muxer_index < 0) {
        //to do something...
    }


    signal(SIGINT, [](int) { flag = 0; });
    while (flag) {
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }

    jo_fmvtk_delete_muxer(fmvtk, muxer_index);


    jo_fmvtk_close(fmvtk);

    jo_fmvtk_destroy(fmvtk);

    fclose(out_file);
    out_file = nullptr;


    return 0;
}

7.3 push

push示例代码如下:

cpp
#include <iostream>
#include <thread>
#include <memory>

#include <signal.h>

#include "jo_fmv_tk.h"
#include "jo_fmv_tk_pusher.h"

static int flag = 1;

static void stop_callback(int exit_code, void* opaque);
static void packet_callback(jo_fmvtk_packet packet, void* opaque, JoFmvMetaDataBasic* meta_data, int& enable_replace_meta_data);

int main(int argc, char* argv[])
{
    if (argc < 3) {
        //to do something...
    }


    jo_fmvtk* fmvtk = jo_fmvtk_create();

    jo_fmvtk_set_stop_callback(fmvtk, stop_callback, nullptr);
    jo_fmvtk_set_packet_callback(fmvtk, packet_callback, nullptr);


    int ret = jo_fmvtk_open(fmvtk, url.c_str(), 5000, 50);
    if (ret != 0) {
        return false;
    }



    std::string push_url(argv[2]);
    int pusher_index = jo_fmvtk_add_pusher(fmvtk, push_url.c_str(), 5000);
    if (pusher_index < 0) {
        //to do something...
    }


    signal(SIGINT, [](int) { flag = 0; });
    while (flag) {
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }

    jo_fmvtk_delete_pusher(fmvtk, pusher_index);


    jo_fmvtk_close(fmvtk);

    jo_fmvtk_destroy(fmvtk);

    return 0;
}

static void stop_callback(int exit_code, void* opaque)
{
    //stop_callback
}

static void packet_callback(jo_fmvtk_packet packet, void* opaque, JoFmvMetaDataBasic* meta_data, int& enable_replace_meta_data)
{
    //packet_callback
}