extern "C" { #include #include } #define RTP_PAYLOAD_TYPE 96 #define RTP_CLOCK_RATE 90000 #define BIT_RATE 1000000 #define VIDEO_WIDTH 1280 #define VIDEO_HEIGHT 720 AVCodecContext *codec_ctx = NULL; AVPacket rtp_packet; uint8_t *rtp_payload = NULL; int rtp_payload_size = 0; int rtp_ret; int main(int argc, char *argv[]) { uint8_t buffer[1500]; uint32_t timestamp; int len, marker; av_register_all(); avcodec_register_all(); av_register_rtp_dynamic_payload_handlers(); AVRtpPayloadTypes *payload_types = av_malloc(sizeof(AVRtpPayloadTypes)); if (!payload_types) { return -1; } RTPDynamicProtocolHandler dynamic_handler = { 0 }; payload_types->pt = RTP_PAYLOAD_TYPE; payload_types->next = NULL; payload_types->handler = &dynamic_handler; codec_ctx = avcodec_alloc_context3(NULL); if (!codec_ctx) { av_freep(&payload_types); return -1; } codec_ctx->codec_type = AVMEDIA_TYPE_VIDEO; codec_ctx->codec_id = AV_CODEC_ID_H264; codec_ctx->pkt_timebase = (AVRational) { 1, RTP_CLOCK_RATE }; codec_ctx->time_base = codec_ctx->pkt_timebase; codec_ctx->bit_rate = BIT_RATE; codec_ctx->width = VIDEO_WIDTH; codec_ctx->height = VIDEO_HEIGHT; codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P; codec_ctx->flags |= AV_CODEC_FLAG_TRUNCATED | AV_CODEC_FLAG_GLOBAL_HEADER; while (1) { len = read_rtp_packet(buffer, sizeof(buffer), timestamp, &marker); if (len < 0) break; rtp_payload_size = len - 2; rtp_payload = (uint8_t *)buffer + 2; memset(&rtp_packet, 0, sizeof(AVPacket)); av_init_packet(&rtp_packet); rtp_ret = av_rtp_parse_packet(codec_ctx, payload_types, &rtp_payload, &rtp_payload_size, timestamp, marker); if (rtp_ret >= 0) { rtp_packet.data = rtp_payload; rtp_packet.size = rtp_payload_size; rtp_packet.pts = timestamp; rtp_packet.dts = timestamp; rtp_packet.duration = 0; rtp_packet.stream_index = 0; rtp_packet.flags |= AV_PKT_FLAG_KEY; // �������rtp_packet����� } } avcodec_free_context(&codec_ctx); av_freep(&payload_types); return 0; }