网站建设群,网站建设以及维护,内蒙古呼和浩特特产,网站建设人工智能开发解决音视频发送的rtp问题
openrtp增加了音频aac的发送#xff0c;地址 OpenRTP Gitee开源地址
同时使用两个rtp #xff0c;来发送音频和视频 使用以下音频rtp#xff0c;是可以发送和接收的#xff0c;音频端口在视频端口上2
v0
o- 0 0 IN IP4 127.0.0.1
sMy Stream
cI…解决音视频发送的rtp问题
openrtp增加了音频aac的发送地址 OpenRTP Gitee开源地址
同时使用两个rtp 来发送音频和视频 使用以下音频rtp是可以发送和接收的音频端口在视频端口上2
v0
o- 0 0 IN IP4 127.0.0.1
sMy Stream
cIN IP4 0.0.0.0
t0 0
maudio 1234 RTP/AVP 97
artpmap:97 mpeg4-generic/44100/2
afmtp:97 profile-level-id1;modeAAC-hbr;sizelength13;indexlength3;indexdeltalength3音视频合成发送rtp vlc 使用分开的端口来接收经过测试无误
v0
o- 0 0 IN IP4 127.0.0.1
sMy Stream
cIN IP4 0.0.0.0
t0 0
maudio 6002 RTP/AVP 97
artpmap:97 mpeg4-generic/44100/2
afmtp:97 profile-level-id1;modeAAC-hbr;sizelength13;indexlength3;indexdeltalength3
mvideo 6000 RTP/AVP 96
artpmap:96 H264/90000我把sdp文件放在了这里 是否使用同一端口发送音视频
一、协议规范 RTPReal-time Transport Protocol通常为音频和视频分别分配不同的端口以区分不同类型的媒体流。这样做符合协议设计的常规做法使得接收端能够明确地识别和处理不同类型的媒体数据。 二、处理复杂性 解码和播放如果音频和视频使用同一个端口接收端在处理数据时需要更加复杂的逻辑来区分音频和视频数据包。这增加了处理的难度和出错的可能性可能导致播放不稳定或不同步。 同步问题不同的媒体流需要进行同步才能保证良好的播放效果。使用不同的端口可以更容易地实现音频和视频的同步因为接收端可以独立地处理每个流的时间戳和同步信息。如果使用同一个端口同步处理会变得更加复杂可能会影响播放质量。 三、网络传输考虑 带宽管理音频和视频通常具有不同的带宽需求。分开使用不同的端口可以更好地进行带宽管理和流量控制。例如可以为视频流分配更多的带宽以确保高质量的视频播放而音频流可以使用相对较少的带宽。 网络故障处理如果音频和视频使用同一个端口当该端口出现网络问题时音频和视频都会受到影响。而使用不同的端口可以在一定程度上隔离问题使得在一个流出现问题时另一个流可能仍然能够正常传输。 综上所述为了保证音频和视频的稳定播放、便于处理和同步以及更好地进行网络管理建议为音频流和视频流分别使用不同的端口。
以上其实问题都能解决比如rtmp协议就是一个端口处理所有音视频对于rtp协议如果使用udp其实可以使用不同的端口来发送视频和音频这样处理逻辑更为简单但不是必要。
计算时间戳增量
音频时间戳
音频时间戳的单位就是采样率的倒数例如采样率44100那么1秒就有44100个采样每个采样1/44ms每个采样对应一个时间戳。RTP音频包如果是10毫秒的数据对应的采样数为 44100 * 10 / 1000 441也就是说每个音频包里携带440个左右的音频采样因为1个采样对应1个时间戳那么相邻两个音频RTP包的时间戳之差就是960。
那如果是回调函数采集的音频我们可以计算回调两次之间的时间差t - t0t0是第一次的时间这样有可能造成越来越来的累计时间如果我们知道是采样一次位1024个样本那样就好计算了
1024 每次就是增加1024缓冲区计算就是1024* channel声道* perbytes字节比如16位就是2字节那就是1024 X 2 X 2 4096个字节的缓冲每次增加1024时间戳就行
nt rtp_pakc_aac(unsigned char *ptr,int bytes,unsigned char *rtpPkt)
{if (0xFF ptr[0] 0xF0 (ptr[1] 0xF0) bytes 7){// skip ADTS headerassert(bytes (((ptr[3] 0x03) 11) | (ptr[4] 3) | ((ptr[5] 5) 0x07)));ptr 7;bytes - 7;}int rtpHeadLen rtp_pack_header(rtpPkt);//RTP Headerunsigned char * header rtpPkt rtpHeadLen;// 3.3.6. High Bit-rate AAC// SDP fmtp: modeAAC-hbr;sizeLength13;indexLength3;indexDeltaLength3;header[0] 0;header[1] 16; // 16-bits AU headers-lengthheader[2] (uint8_t)(bytes 5); header[3] (uint8_t)(bytes 0x1f) 3;//13bit AU-size、3bit AU-Index/AU-Index-deltaunsigned char * pPayload rtpPkt rtpHeadLen 4;memcpy(pPayload, ptr,bytes);return bytes rtpHeadLen 4;从RTP包里面得到AAC音频数据的方法//功能解RTP AAC音频包声道和采样频率必须知道。
//参数1.RTP包缓冲地址 2.RTP包数据大小 3.H264输出地址 4.输出数据大小
//返回true:表示一帧结束 false:帧未结束 一般AAC音频包比较小没有分片。
bool UnpackRTPAAC(void * bufIn, int recvLen, void** pBufOut, int* pOutLen)
{unsigned char* bufRecv (unsigned char*)bufIn;//char strFileName[20];unsigned char ADTS[] {0xFF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0xFC}; int audioSamprate 32000;//音频采样率int audioChannel 2;//音频声道 1或2int audioBit 16;//16位 固定switch(audioSamprate){case 16000:ADTS[2] 0x60;break;case 32000:ADTS[2] 0x54;break;case 44100:ADTS[2] 0x50;break;case 48000:ADTS[2] 0x4C;break;case 96000:ADTS[2] 0x40;break;default:break;}ADTS[3] (audioChannel2)?0x80:0x40;int len recvLen - 16 7;len 5;//8bit * 2 - 11 5(headerSize 11bit)len | 0x1F;//5 bit 1 ADTS[4] len8;ADTS[5] len 0xFF;*pBufOut (char*)bufIn16-7;memcpy(*pBufOut, ADTS, sizeof(ADTS));*pOutLen recvLen - 16 7;unsigned char* bufTmp (unsigned char*)bufIn;bool bFinishFrame false;if (bufTmp[1] 0x80){//DebugTrace::D(Marker);bFinishFrame true;}else{bFinishFrame false;}return true;
}视频时间戳
rtp协议中视频一般以90000为时间基一帧应该是对应多少次的采集比如视频20帧采样率是90KHZ那么1帧就3600次的采集(90000 / 20 4500 )也就是时间戳每帧每次增加4500个单位。 其他
rtp receive 暂时没有增加音频的接收仍然是ps流的接收和普通rtp流的接收rtmp流发送照旧是视频近期增加音频的同步发送