2,542
社区成员
发帖
与我相关
我的任务
分享
//输入相关的
AVInputFormat *inputFormat = nullptr;
AVFormatContext *inputFormatContext = nullptr;
AVIOContext *inputIoContext;
AVCodecContext *inputCodecContext;
AVCodec *codec;
//输入相关的
AVFormatContext* outputFormatContext;
AVOutputFormat* outputFormat;
AVStream* outputStream;
AVCodecContext* outCodecContext;
//探测输入码流 (略)
//构造输出
outputFormatContext = avformat_alloc_context();
outputFormatContext->oformat = av_guess_format("rtp", nullptr, nullptr);
#if 0
sprintf_s(outputFormatContext->filename, sizeof(outputFormatContext->filename), "rtp://%s:%d", "10.78.4.111", 12121);
#else
sprintf_s(outputFormatContext->filename, sizeof(outputFormatContext->filename), "rtp://%s:%d", "127.0.0.1", 12121);
#endif
avio_open(&outputFormatContext->pb, outputFormatContext->filename, AVIO_FLAG_WRITE);
outputStream = avformat_new_stream(outputFormatContext, codec);
outCodecContext = outputStream->codec;
avcodec_get_context_defaults3(outCodecContext, codec);
outCodecContext->codec_id = inputCodecContext->codec_id;
outCodecContext->width = inputCodecContext->width;
outCodecContext->height = inputCodecContext->height;
outCodecContext->time_base.den = inputCodecContext->time_base.den;
outCodecContext->pix_fmt = inputCodecContext->pix_fmt;
if (outputFormatContext->oformat->flags & AVFMT_GLOBALHEADER)
outCodecContext->flags |= CODEC_FLAG_GLOBAL_HEADER;
//av_opt_set(outCodecContext->priv_data, "preset", "ultrafast", 0);
//av_opt_set(outCodecContext->priv_data, "tune", "stillimage,fastdecode,zerolatency", 0);
//av_opt_set(outCodecContext->priv_data, "x264opts", "crf=26:vbv-maxrate=728:vbv-bufsize=364:keyint=25", 0);
//复制outCodecContext->extradata 据说里面包含了sps pps的东西
outCodecContext->extradata = (unsigned char*)av_malloc(inputCodecContext->extradata_size);
memcpy(outCodecContext->extradata, inputCodecContext->extradata, inputCodecContext->extradata_size);
outCodecContext->extradata_size = inputCodecContext->extradata_size;
avcodec_open2(outCodecContext, codec, nullptr);
avformat_write_header(outputFormatContext, nullptr);
char sdp[2048];
av_sdp_create(&outputFormatContext, 1, sdp, sizeof(sdp));
//发数据
for (;;)
{
if (av_read_frame(inputFormatContext, &pkt) >= 0)
{
if (pkt.stream_index == videoindex)
{
//static int b = 0;
//printf("读到数据 %d\n",b++);
av_write_frame(outputFormatContext, &pkt);
//fwrite(pkt.data, pkt.size, 1, a);
//fflush(a);
}
}
else
{
break;
}
}