添加注释,完善接口

This commit is contained in:
xiongziliang 2018-10-23 14:32:06 +08:00
parent 4af9927e8c
commit c5e372c155
4 changed files with 245 additions and 17 deletions

View File

@ -118,12 +118,15 @@ void getAACInfo(const AACFrame &adts,int &iSampleRate,int &iChannel){
iChannel = adts.channel_configuration;
}
bool getAVCInfo(const string& strSps,int &iVideoWidth, int &iVideoHeight, float &iVideoFps) {
return getAVCInfo(strSps.data(),strSps.size(),iVideoWidth,iVideoHeight,iVideoFps);
}
bool getAVCInfo(const char * sps,int sps_len,int &iVideoWidth, int &iVideoHeight, float &iVideoFps){
T_GetBitContext tGetBitBuf;
T_SPS tH264SpsInfo;
memset(&tGetBitBuf,0,sizeof(tGetBitBuf));
memset(&tH264SpsInfo,0,sizeof(tH264SpsInfo));
tGetBitBuf.pu8Buf = (uint8_t *)strSps.data() + 1;
tGetBitBuf.iBufSize = strSps.size() - 1;
tGetBitBuf.pu8Buf = (uint8_t*)sps + 1;
tGetBitBuf.iBufSize = sps_len - 1;
if(0 != h264DecSeqParameterSet((void *) &tGetBitBuf, &tH264SpsInfo)){
return false;
}

View File

@ -45,5 +45,7 @@ void writeAdtsHeader(const AACFrame &adts, uint8_t *pcAdts) ;
string makeAdtsConfig(const uint8_t *pcAdts);
void getAACInfo(const AACFrame &adts,int &iSampleRate,int &iChannel);
bool getAVCInfo(const string &strSps,int &iVideoWidth, int &iVideoHeight, float &iVideoFps);
bool getAVCInfo(const char * sps,int sps_len,int &iVideoWidth, int &iVideoHeight, float &iVideoFps);
#endif /* SRC_PLAYER_PLAYER_H_ */

View File

@ -10,11 +10,12 @@
#include "Frame.h"
#include "Util/RingBuffer.h"
#include "Rtsp/Rtsp.h"
#include "Player.h"
using namespace std;
using namespace ZL::Util;
class Track : public FrameRingInterface , public CodecInfo{
class Track : public FrameRing , public CodecInfo{
public:
typedef std::shared_ptr<Track> Ptr;
Track(){}
@ -24,52 +25,231 @@ public:
class VideoTrack : public Track {
public:
TrackType getTrackType() const override { return TrackVideo;};
/**
*
* @return
*/
virtual int getVideoHeight() const = 0;
/**
*
* @return
*/
virtual int getVideoWidth() const = 0;
/**
* fps
* @return
*/
virtual float getVideoFps() const = 0;
};
class AudioTrack : public Track {
public:
TrackType getTrackType() const override { return TrackAudio;};
/**
*
* @return
*/
virtual int getAudioSampleRate() const = 0;
/**
* 168
* @return
*/
virtual int getAudioSampleBit() const = 0;
/**
*
* @return
*/
virtual int getAudioChannel() const = 0;
};
class H264Track : public VideoTrack{
public:
H264Track(const string &sps,const string &pps){
_sps = sps;
_pps = pps;
/**
* h264类型的媒体
* @param sps sps帧数据
* @param pps pps帧数据
* @param sps_prefix_len 264340x00 00 00 01
* @param pps_prefix_len 264340x00 00 00 01
*/
H264Track(const string &sps,const string &pps,int sps_prefix_len = 4,int pps_prefix_len = 4){
_sps = sps.substr(sps_prefix_len);
_pps = pps.substr(pps_prefix_len);
parseSps(_sps);
}
/**
* h264类型的媒体
* @param sps sps帧
* @param pps pps帧
*/
H264Track(const Frame::Ptr &sps,const Frame::Ptr &pps){
if(sps->getCodecId() != CodecH264 || pps->getCodecId() != CodecH264 ){
throw std::invalid_argument("必须输入H264类型的帧");
}
_sps = string(sps->data() + sps->prefixSize(),sps->size() - sps->prefixSize());
_pps = string(pps->data() + pps->prefixSize(),pps->size() - pps->prefixSize());
parseSps(_sps);
}
/**
* 0x00 00 00 01sps
* @return
*/
const string &getSps() const{
return _sps;
}
/**
* 0x00 00 00 01pps
* @return
*/
const string &getPps() const{
return _pps;
}
CodecId getCodecId() const override{
CodecId getCodecId() const override {
return CodecH264;
}
/**
*
* @return
*/
int getVideoHeight() const override{
return _width;
}
/**
*
* @return
*/
int getVideoWidth() const override{
return _height;
}
/**
* fps
* @return
*/
float getVideoFps() const override{
return _fps;
}
private:
/**
* sps获取宽高fps
* @param sps sps不含头数据
*/
void parseSps(const string &sps){
getAVCInfo(sps,_width,_height,_fps);
}
private:
string _sps;
string _pps;
int _width = 0;
int _height = 0;
float _fps = 0;
};
class AACTrack : public AudioTrack{
public:
/**
* aac类型的媒体
* @param aac_cfg aac两个字节的配置信息
*/
AACTrack(const string &aac_cfg){
if(aac_cfg.size() != 2){
throw std::invalid_argument("adts配置必须为2个字节");
}
_cfg = aac_cfg;
parseAacCfg(_cfg);
}
/**
* aac类型的媒体
* @param adts_header adts头7
* @param adts_header_len adts头长度7
*/
AACTrack(const char *adts_header,int adts_header_len = 7){
if(adts_header_len < 7){
throw std::invalid_argument("adts头必须不少于7个字节");
}
_cfg = makeAdtsConfig((uint8_t*)adts_header);
parseAacCfg(_cfg);
}
/**
* aac类型的媒体
* @param aac_frame_with_adts adts头的aac帧
*/
AACTrack(const Frame::Ptr &aac_frame_with_adts){
if(aac_frame_with_adts->getCodecId() != CodecAAC || aac_frame_with_adts->prefixSize() < 7){
throw std::invalid_argument("必须输入带adts头的aac帧");
}
_cfg = makeAdtsConfig((uint8_t*)aac_frame_with_adts->data());
parseAacCfg(_cfg);
}
/**
* aac两个字节的配置
* @return
*/
const string &getAacCfg() const{
return _cfg;
}
/**
*
* @return
*/
CodecId getCodecId() const override{
return CodecAAC;
}
/**
*
* @return
*/
int getAudioSampleRate() const override{
return _sampleRate;
}
/**
* 168
* @return
*/
int getAudioSampleBit() const override{
return _sampleBit;
}
/**
*
* @return
*/
int getAudioChannel() const override{
return _channel;
}
private:
/**
* 2aac配置
* @param aac_cfg
*/
void parseAacCfg(const string &aac_cfg){
AACFrame aacFrame;
makeAdtsHeader(aac_cfg,aacFrame);
getAACInfo(aacFrame,_sampleRate,_channel);
}
private:
string _cfg;
int _sampleRate = 0;
int _sampleBit = 16;
int _channel = 0;
};

View File

@ -15,51 +15,98 @@ namespace Rtsp{
/**
* sdp基类
*/
class Sdp : public Track , public RtpRingInterface{
class Sdp : public FrameRingInterface , public RtpRingInterface , public CodecInfo{
public:
typedef std::shared_ptr<Sdp> Ptr;
/**
* sdp
* @param sample_rate
* @param playload_type pt类型
*/
Sdp(uint32_t sample_rate, uint8_t playload_type){
_sample_rate = sample_rate;
_playload_type = playload_type;
}
virtual ~Sdp(){}
/**
* sdp字符串
* @return
*/
virtual string getSdp() const = 0;
/**
*
* @return
*/
TrackType getTrackType() const override {
return TrackInvalid;
}
/**
* id
* @return
*/
CodecId getCodecId() const override{
return CodecInvalid;
}
/**
*
* @return
*/
FrameRingInterface::RingType::Ptr getFrameRing() const override {
return _encoder->getFrameRing();
}
/**
* rtp环形缓存
* @return
*/
RtpRingInterface::RingType::Ptr getRtpRing() const override{
return _encoder->getRtpRing();
}
/**
* rtp打包
* @param frame
* @param key_pos
*/
void inputFrame(const Frame::Ptr &frame,bool key_pos) override{
_encoder->inputFrame(frame,key_pos);
}
/**
* rtp后直接输入rtp
* @param rtp rtp数据包
* @param key_pos rtp包
*/
void inputRtp(const RtpPacket::Ptr &rtp, bool key_pos) override{
_encoder->inputRtp(rtp,key_pos);
}
/**
* rtp打包器共用一个环形缓存
* @param ring
*/
void setFrameRing(const FrameRingInterface::RingType::Ptr &ring) override{
_encoder->setFrameRing(ring);
}
/**
* rtp打包器共用一个环形缓存
* @param ring
*/
void setRtpRing(const RtpRingInterface::RingType::Ptr &ring) override{
_encoder->setRtpRing(ring);
}
/**
* Rtp打包器
* @param ssrc ssrc0
* @param mtu mtu大小15001400
*/
virtual void createRtpEncoder(uint32_t ssrc, int mtu) {
_encoder = RtpCodec::getRtpCodec (getCodecId(),
ssrc,
@ -127,20 +174,17 @@ public:
*
* @param sps 264 sps,0x00000001
* @param pps 264 pps,0x00000001
* @param sample_rate 90000
* @param playload_type rtp playload type 96
* @param track_id trackID TrackVideo
* @param playload_type rtp playload type 96
* @param bitrate
*/
H264Sdp(const string &sps,
const string &pps,
int sample_rate = 90000,
int playload_type = 96,
int bitrate = 4000) : Sdp(sample_rate,playload_type) {
int bitrate = 4000) : Sdp(90000,playload_type) {
//视频通道
_printer << "m=video 0 RTP/AVP " << playload_type << "\r\n";
_printer << "b=AS:" << bitrate << "\r\n";
_printer << "a=rtpmap:" << playload_type << " H264/" << sample_rate << "\r\n";
_printer << "a=rtpmap:" << playload_type << " H264/" << 90000 << "\r\n";
_printer << "a=fmtp:" << playload_type << " packetization-mode=1;profile-level-id=";
char strTemp[100];
@ -186,11 +230,10 @@ class AACSdp : public Sdp {
public:
/**
* aac sdp
*
* @param aac_cfg aac两个字节的配置描述
* @param sample_rate
* @param playload_type rtp playload type 96
* @param track_id trackID TrackVideo
* @param playload_type rtp playload type 98
* @param bitrate
*/
AACSdp(const string &aac_cfg,