原因:由于上次简单分析了一下RTP推流,并创建了一个简单demo用于RTP推流,为了检测RTP推流故在此简单实现一个播放器用于播放RTP流.
概述:通过url创建解码器,但是由于没有使用sdp作为信息传递,故解码器信息需要在接收到sps和pps后,才会被真实填充,通过获取的音视频的pts进行音视频通过,重点为pts的时间戳转换。
下面进行伪代码分析:可以看出流程为常规流程,通过打开url获取对应的AVFormatContext对象,内部会进行udp创建,随后获取并打开解码器,但是此时解码器内部参数为空,只有在avcodec_send_packet函数解析出sps和pps后,才会进行参数赋值.
char *url = "rtp://127.0.0.1:1234";
char *url_a = "rtp://127.0.0.1:1236";
int ir = avformat_open_input(&pFormatCtx, url, nullptr, nullptr);
ir = avformat_find_stream_info(pFormatCtx, nullptr);
ir = avcodec_open2(pCodecCtx, pCodec,nullptr);
int ir = avcodec_send_packet(pCodecCtx, &pkt);
avcodec_receive_frame(pCodecCtx, pFrame)
获取到音视频数据后目前是通过SDL进行绘制,具体代码如下:下面为音频输出,可以看出首先需要配置SDL_AudioSpec.如果配置的参数属性和真实接收到的数据不匹配,则需要进行重采样变换后才能正确输出.
int iSDL = SDL_Init(SDL