#pragma once #ifdef __cplusplus extern "C"{ #endif extern "C" { #include "librtmp\rtmp.h" #include "librtmp\rtmp_sys.h" #include "librtmp\amf.h" } #ifdef __cplusplus } #endif #include #include #include #include #include using namespace std; #ifdef WIN32 #include #pragma comment(lib,"WS2_32.lib") #pragma comment(lib,"winmm.lib") #endif class RtmpPuller2 { public: class RtmpPullObserver { public: enum ObserverType { Observer_Video = 0, Observer_Audio = 1, }; virtual void OnRtmpFrame(void * dat, uint32_t size) {}; ObserverType mObserverType; }; enum CAP_STATUS { CONNECTED = 0, RUNNING = 1, STOP = 2, PAUSE = 3, FAIL = 4, NOSOURCE = 6, }; RtmpPuller2(); ~RtmpPuller2(); int StopPull(); int StartPull(); int PullData(); int SetObserver(RtmpPuller2::RtmpPullObserver *); CAP_STATUS Status(); int ConnectServer(string url); private: std::thread *mThread; RTMP *mRtmp; string mUrl; CAP_STATUS mStatus; vector mObserver; mutex mMux; uint8_t *mAccBuffer; // adts 头部信息,因为aac码流只会在首包发送 uint8_t ch0 = 0; uint8_t ch1 = 0; uint16_t config = 0; uint16_t object_type = 0; uint16_t sample_frequency_index = 0; uint16_t channels = 0; uint16_t frame_length_flag = 0; uint16_t depend_on_core_coder = 0; uint16_t extension_flag = 0; };