ffmpeg播放rtp流,为了降低首开延迟,需要在SDP文件中指定PPS、SPS、VPS信息。抓包后发现wireshark无法解析AP包。需要自己进行AP包解析。RTP协议AP包格式如下:
根据如上信息,我们可以解析AP包,效果如下
下图中红色部分是分隔符,橙色是VPS,黑色是SPS,黄色为PPS
SDP中的VPS等信息需要转换成base64。使用下面的函数可转换
#include <stdio.h>
#include <inttypes.h>
#include <math.h>
#include <limits.h>
#include <signal.h>
#include <stdint.h>
#include <string>
#include <string.h>
#include <iostream>
?
#define AV_BASE64_SIZE(x) ?(((x)+2) / 3 * 4 + 1)
# ? define AV_RB32(x) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? (((uint32_t)((const uint8_t*)(x))[0] << 24) | ? ?\
? ? ? ? ? ? ? ?(((const uint8_t*)(x))[1] << 16) | ? ?\
? ? ? ? ? ? ? ?(((const uint8_t*)(x))[2] << ?8) | ? ?\
? ? ? ? ? ? ? ? ((const uint8_t*)(x))[3])
using namespace std;
char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
{
? ? static const char b64[] =
? ? ? ? "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
? ? char *ret, *dst;
? ? unsigned i_bits = 0;
? ? int i_shift = 0;
? ? int bytes_remaining = in_size;
? ? if (in_size >= UINT_MAX / 4 ||
? ? ? ? out_size < AV_BASE64_SIZE(in_size))
? ? ? ? return NULL;
? ? ret = dst = out;
? ? while (bytes_remaining > 3) {
? ? ? ? i_bits = AV_RB32(in);
? ? ? ? in += 3; bytes_remaining -= 3;
? ? ? ? *dst++ = b64[ i_bits>>26 ? ? ? ?];
? ? ? ? *dst++ = b64[(i_bits>>20) & 0x3F];
? ? ? ? *dst++ = b64[(i_bits>>14) & 0x3F];
? ? ? ? *dst++ = b64[(i_bits>>8 ) & 0x3F];
? ? }
? ? i_bits = 0;
? ? while (bytes_remaining) {
? ? ? ? i_bits = (i_bits << 8) + *in++;
? ? ? ? bytes_remaining--;
? ? ? ? i_shift += 8;
? ? }
? ? while (i_shift > 0) {
? ? ? ? *dst++ = b64[(i_bits << 6 >> i_shift) & 0x3f];
? ? ? ? i_shift -= 6;
? ? }
? ? while ((dst - ret) & 3)
? ? ? ? *dst++ = '=';
? ? *dst = '\0';
? ? return ret;
}
?
int main() {
? ? uint8_t in[]={0x67, 0x42,0xc0,0x14,0xf4,0x0b,0x04,0xb4,0x20,0x00,0x00,0x03,0x00,0x20,0x00,0x00,0x03,0x03,0xd1,0xe2,0x85,0x54};
?? ?char str_sps[100]={0};
?? ?av_base64_encode(str_sps,100,in,22);
?? ?cout<<"sps'sbasecode:"<<str_sps<<endl;
?? ?uint8_t pps[]={0x68 ,0xce ,0x04 ,0xf2};
char str_sps2[100]={0};
?? ?av_base64_encode(str_sps2,100,pps,4);
?? ?cout<<"pps'sbasecode:"<<str_sps2<<endl;
? return 0;
}
?