Appearance
JoFmvToolsKit
1. 版本发布记录
1.1. 发布日期
1.2. 新增功能
1.3. 发布列表
2. 基本介绍
2.1. JoFmvToolsKit 功能介绍
JoFmvToolsKit能够实现
- 对视频流进行解复用,输出裸码数据
- 对视频帧进行解析,得到其中的元数据信息
- 对视频流进行解码,输出BGR24的数据
- 将视频流再复用,输出ts,flv,mp4等格式的视频数据
- 获取一些视频相关信息,如视频文件长度,视频帧宽高等
- 支持推流
- 启动流媒体服务,对视频流进行再次分发,支持rtsp,rtmp,http,webrtc协议
2.2. JoFmvToolsKit 支持的视频源以及支持的视频编码格式
- 支持的视频格式
- RTSP视频源
- RTMP视频源
- TS视频源
- 本地视频文件
- 支持的视频编码格式
- 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
| 名称 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| videoConfig | Joplayer配置文件 | VideoConfig | |
| isShowOsd | 是否显示OSD面板 | boolean | false |
| isAllOpenOSD | OSD面板显示模式:true 全开,false 半开 | boolean | true |
| isShowControls | 回放视频控制组件(仅回放传) | boolean | false |
- 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
}
