之前我们发布过一款EasyRTSPClient:《用EasyRTSPClient做工具分析RTSP流获取H.264/H.265/G711/G726/AAC原数据裸数据解析vps/sps/pps/I帧/P帧快速定位分析问题》,那个是基于live555对RTSP协议进行取流的一款拉流工具,基于EasyRTSPClient就可以不用考虑RTSP(OPTIONS、DESCRIBE、SETUP、PLAY、GET_PARAMETER、SET_PARAMETER)、RTP、RTCP那么些复杂的流程了,直接一个工具就能将音视频流回调给上层使用,比如录像、播放、AI分析等等!
那么,遇到不是RTSP流的协议怎么办?比如RTMP、HTTP、TCP、UDP等等等等!!!
这里,我第一个想到的其实是ffmpeg和vlc,但vlc二次开发基本上是搞笑,ffmpeg二次开发难度又相对比较高,想要完整地把音视频数据都给取出来,存起来,头皮发麻,好麻烦!
于是,我搞了一个 EasyStreamClient ,EasyStreamClient其实就是把ffmpeg封装起来,用几个简单的接口,就能把数据取出来,取出ES数据,回调给上层,上层就可以做各种事情了:
- 流媒体分发:流媒体服务器拿到这些数据,可以进行各种协议的转换,比如:RTSP、RTMP、FLV、WebSocket;
- 转推流:EasyStreamClient拉取到的ES数据,可以再次喂给RTMP推流器,推送到CDN等第三方平台;
- 录像:EasyStreamClient取到的音视频数据,可以进行本地的MP4、TS、PS等录像;
- AI分析:可以基于EasyStreamClient进行实时流的抽帧,抽帧再供给AI智能分析;
整个EasyStreamClient接口也是非常简单的:
/* 创建EasyStreamClient句柄 返回0表示成功,返回非0表示失败 ; loglevel : 0 - quiet 1 - debug*/
Easy_API int Easy_APICALL EasyStreamClient_Init(Easy_Handle *handle, int loglevel);
/* 释放EasyStreamClient 参数为EasyStreamClient句柄 */
Easy_API int Easy_APICALL EasyStreamClient_Deinit(Easy_Handle handle);
/* 设置背景音 flag: 1 开启 0:关闭 url:背景音路径包含文件名 ret: 0:成功 < 0:配置失败 1:不支持背景音功能*/
Easy_API int Easy_APICALL EasyStreamClient_SetBackAudio(Easy_Handle handle, int flag, char* url);
/* 设置数据回调 */
Easy_API int Easy_APICALL EasyStreamClient_SetCallback(Easy_Handle handle, EasyStreamClientCallBack callback);
/* 设置叠加图片 */
Easy_API int Easy_APICALL EasyStreamClient_SetOverlayImage(Easy_Handle handle, int left, int top, int scaleWidth, int scaleHeight, const char* imageFilePath);
/* 打开网络流 */
Easy_API int Easy_APICALL EasyStreamClient_OpenStream(Easy_Handle handle, char *url, EASY_RTP_CONNECT_TYPE connType, void *userPtr, int reconn, int timeout, int useExtraData);
/* 获取输入流的context */
Easy_API int Easy_APICALL EasyStreamClient_GetStreamContext(Easy_Handle handle, void** avFormatContext, void** avCodecContext);
/* 获取快照 */
Easy_API int Easy_APICALL EasyStreamClient_GetSnap(Easy_Handle handle);
Easy_API int Easy_APICALL EasyStreamClient_ConvertFrame2Image(const unsigned int videoCodec, const unsigned char* keyFrameData, int keyFrameDataSize, unsigned char** outImage, int* outImageSize);
Easy_API int Easy_APICALL EasyStreamClient_ReleaseImageData(unsigned char** imageData);
/* 设置音频是否启用 */
Easy_API int Easy_APICALL EasyStreamClient_SetAudioEnable(Easy_Handle handle, int enable);
Easy_API int Easy_APICALL EasyStreamClient_SetAudioOutFormat(Easy_Handle handle, unsigned int audioFormat, int samplerate, int channels);
/* 获取音频是否启用 */
Easy_API int Easy_APICALL EasyStreamClient_GetAudioEnable(Easy_Handle handle);
/*录像下载*/
Easy_API int Easy_APICALL EasyStreamClient_SetDownloadCallback(EasyDownloadCallBack callback);
Easy_API int Easy_APICALL EasyStreamClient_DownloadOneRecord(const char* rootPath, const char* streamName, const char* startTime, void* userPtr);
Easy_API int Easy_APICALL EasyStreamClient_DownloadPeriod(const char* rootPath, const char* streamName, const char* startTime, const char* endTime, void* userPtr);
上面的接口,开发能看懂,具体的在Github:https://github.com/EasyDarwin/EasyStreamClient
直接看使用效果吧: