在4G时代,移动终端网络越来越快,网络流量费越来越便宜,客观上为视频在各种领域应用创造了条件,尤其移动端视频监控,视频直播成为当下几个热点。car-eye-push就是为这些需求设计而成的一个高性能推送视频流库,它支持RTSP和RTMP两个种主要的视频直播协议。通过该库可以快速有效的将视频音频数据推送到视频服务器。下面记录下在整个推送库中涉及到几个要点。
1. 解决视频卡机不连续的问题
car-eye 视频库中本身就包含一个环形队列池,能够在网络不十分好的时候具备一定的缓冲能力。在遇到缓冲满的时候,根据优先保持视频关键帧的数据的前提下删除最远的不能推送成功的数据。
2. 在推送音视频数据的时候,声音和视频不同步的问题
其实严格来说这个工作在客户端可以根据时间戳进行处理,但在推送这端,进行一点的同步也是有必要,我们采取音视频同步
到机器时间的方法,保证数据帧尽量在相同的时间推送出去。要知道视频和音频推送是在不同的线程中完成,这就需要处理临界段的问题。
3. 解决断开重连的问题
这个真的很重要,尽管网络采用4G,但终究是移动网络,在没有信号的时候,库本身要具有一定的重新连接能力。我们对视频发送长时间不成功,网络断开等都进行了自动连接处理。这不仅仅体现在设备端,同样体现在不同播放端。
4. 推送文件的精确定位
car-eye-push库不仅仅应用于视频直播,还应用历史回放。这样就要对历史文件进行处理。播放的程序可能是一些文件的一部分。甚至可能在客户端就要求视频对视频文件直接定位,快进等。所以我们需要对MP4等文件格式进行在时间轴上精确定位。
car-eye-push支持多通道推送数据,支持windows android,linux等多种系统,支持ARM,x86,x64和mips多种架构 API 接口简单,方便快速移植到自己的系统中。
我们看下他的接口定义:
/*
* Comments: 使用有效的Key进行CarEye推流器的注册以便使用, 使用本系统前必须进行注册才能正常使用
* Param key: 有效的密钥
* Param packName: 针对Android系统的应用程序包名
* @Return int CAREYE_NOERROR: 成功, 返回结果参考CarEyeError
*/
#ifdef ANDROID
CE_API int CE_APICALL CarEye_Register(char* key, char* packName);
#else
CE_API int CE_APICALL CarEye_Register(char* key);
#endif
/*
* Comments: 注册推流状态事件
* Param event: 获取推流状态的回调函数
* @Return None
*/
CE_API void CE_APICALL CarEye_RegisterStateChangedEvent(CarEyePusher_StateChanged event);
/*
* Comments: 启动RTSP推流通道 推流地址以三个参数进行组合: rtsp://svrip:port/name
* Param svrip: 流媒体服务器IP地址或域名
* Param port: 流媒体服务器端口号
* Param name: 推流的sdp名
* Param mediaInfo: 要推流的媒体信息
* @Return int 大于等于0: 启动的推流通道号 小于0错误编号参考CarEyeError
*/
CE_API int CE_APICALL CarEye_StartRTSPPusher(char* svrip, unsigned short port, char* name, CarEye_MediaInfo mediaInfo);
/*
* Comments: 关闭指定的RTSP推流通道
* Param channel: 已启动的RTSP推流通道号
* @Return int 是否成功关闭, 状态码参考CarEyeError
*/
CE_API int CE_APICALL CarEye_StopRTSPPusher(int channel);
/*
* Comments: 获取当前通道的推流器是否已经连接到服务器并做好推流准备
* Param channel: 通道号
* @Return int 0未做好准备, 非0做好准备
*/
CE_API int CE_APICALL CarEye_PusherIsReady(int channel);
/*
* Comments: 启动RTSP推流本地文件通道 推流地址以三个参数进行组合: rtsp://svrip:port/name
* Param svrip: 流媒体服务器IP地址或域名
* Param port: 流媒体服务器端口号
* Param name: 推流的sdp名
* Param fileName: 要推流的本地文件路径 目前暂时支持MP4文件
* Param startMs: 推流起始的毫秒数
* Param endMs: 推流结束的毫秒数 endMs必须大于startMs, 否则推流失败, 当两个参数都为0时推送全文件
* @Return int 大于等于0: 启动的推流通道号 小于0错误编号参考CarEyeError
*/
CE_API int CE_APICALL CarEye_StartNativeFileRTSP(char* svrip, unsigned short port, char* name, char* fileName, int startMs, int endMs);
/*
* Comments: 关闭指定的本地文件RTSP推流通道
* Param channel: 已启动的RTSP推流通道号
* @Return int 是否成功关闭, 状态码参考CarEyeError
*/
CE_API int CE_APICALL CarEye_StopNativeFileRTSP(int channel);
/*
* Comments: 启动RTMP推流通道
* Param svrip: 流媒体服务器IP地址或域名
* Param port: 流媒体服务器端口号
* Param name: 推流的通道名
* Param mediaInfo: 要推流的媒体信息
* @Return int 大于等于0: 启动的推流通道号 小于0错误编号参考CarEyeError
*/
CE_API int CE_APICALL CarEye_StartRTMPPusher(char* svrip, unsigned short port, char* name, CarEye_MediaInfo mediaInfo);
/*
* Comments: 关闭指定的RTMP推流通道
* Param channel: 已启动的RTMP推流通道号
* @Return int 是否成功关闭, 状态码参考CarEyeError
*/
CE_API int CE_APICALL CarEye_StopRTMPPusher(int channel);
/*
* Comments: 启动RTMP推流本地文件通道
* Param svrip: 流媒体服务器IP地址或域名
* Param port: 流媒体服务器端口号
* Param name: 推流的通道名
* Param fileName: 要推流的本地文件路径 目前暂时支持MP4文件
* Param startMs: 推流起始的毫秒数
* Param endMs: 推流结束的毫秒数 endMs必须大于startMs, 否则推流失败, 当两个参数都为0时推送全文件
* @Return int 大于等于0: 启动的推流通道号 小于0错误编号参考CarEyeError
*/
CE_API int CE_APICALL CarEye_StartNativeFileRTMP(char* svrip, unsigned short port, char* name, char* fileName, int startMs, int endMs);
/*
* Comments: 关闭指定的本地文件RTMP推流通道
* Param channel: 已启动的RTMP推流通道号
* @Return int 是否成功关闭, 状态码参考CarEyeError
*/
CE_API int CE_APICALL CarEye_StopNativeFileRTMP(int channel);
/*
* Comments: 推送流媒体数据到指定通道中
* Param channel: 要推送的通道号
* Param frame: 要推送的帧数据
* @Return int 是否推送成功, 状态码参考CarEyeError
*/
CE_API int CE_APICALL CarEye_PushData(int channel, CarEye_AV_Frame* frame);
有关car-eye-push 开源平台和源码下载:www.car-eye.cn QQ技术交流群:590411159