基于LIVE555 拉取H264,每帧H264数据流,代码重新以C++方式使用指针
本着开箱即使用原则:可应用于实际开发中,采用C++ 17 20,代码以最简单的方式编写接口测试用例,代码支持多平台。
本实例针对WINDOWS平台测试,如需要其它平台请自行创建工程
文章最后会提供下载地址
#include "live555Pull.h"
#include <windows.h>
int main()
{
live555Pull obj;
obj.add("test001", "rtsp://192.168.1.2/test.264");
while (true)
{
Sleep(1000);
}
}
一、针对H264 1K 2K 重新重构封装
1、#define MAX_CODEC_SIZE (2000000) 对高分辨率支持
2、重构与封装对拉流的处理 并返回当前获取的当前帧接口类
class IPullRTSPClient
{
public:
virtual void exitRTSPClient(const std::string& key) = 0;
virtual void frame(codec_data* data) = 0;
virtual ~IPullRTSPClient(){}
};
3、多路拉流管理与封装
class live555Pull : public IPullRTSPClient
{
public:
live555Pull();
~live555Pull();
void add(const std::string& key, const std::string& url);
void remove(const std::string& key);
protected:
void pullThread();
static void continueAfterDESCRIBE(RTSPClient* rtspClient, int resultCode, char* resultString);
protected:
virtual void exitRTSPClient(const std::string& key) override;
virtual void frame(codec_data* data) override;
private:
UsageEnvironment* env;
std::atomic_bool m_bRun;
BasicTaskScheduler0* m_pBasicTaskScheduler0;
std::future<void> m_netThread;
int m_iCount = 0;
std::map<std::string, PullRTSPClient*> m_mapRTSPClient;
std::vector<PullRTSPClient*> m_vecRemoveClient;
std::mutex m_mutexMap;
std::mutex m_mutexVec;
};
4、接口实现测试部分
void live555Pull::frame(codec_data* data)
{
if (data->len <= 0)
return;
static int count = 0;
count ++;
static FILE* file_ = fopen("D:/file.h264", "wb");
static int i=0;
if(count<600)
{
fwrite(data->data, data->len, 1, file_);
}
else if(count==600)
{
fflush(file_);
fclose(file_);
exit(0 );
}
}
二、测试部分
请自行下载 LIVE555或直接使用程序中修改后的LIVE555,The LIVE555 Media Server
1、编译流媒体服务器:
2、打开工程文件中的(VS2022)如采用不同的IDE或在其它ARM 或其它平台,请自行重创建工程。本文只是针对性测试未提供CMAKE支持还请谅解
3、生成H264文件 ./ffmpeg -i "d:/test.264" -c:v copy -an "d:/output.h264" (请自行下载ffmpeg)
4、生成的文件结构如下图
5、使用VLC来打开自己输出的H264文件。