使用 libavformat 解复用和解码原始 RTP

Demuxing and decoding raw RTP with libavformat

我正在实施一个管道,我在内存中接收入站 RTP 数据包,但我无法弄清楚如何为 handle/unwrap RTP 数据包设置 libavformat。

我有必要的底层编解码器的所有相关信息,但由于它是 h264,我不能简单地剥离 RTP header。我创建输入上下文 goInputFunction 每次调用写入一个数据包。

void *readbuf = av_malloc(1500);
AVIOContext *avioreadctx = avio_alloc_context(readbuf, 1500, 0, transcoder, &goInputFunction, NULL, NULL);
AVFormatContext *inputctx = avformat_alloc_context();
inputctx->pb = avioreadctx;
inputctx->flags |= AVFMT_FLAG_CUSTOM_IO;

当我用avformat_open_input(&inputctx, NULL, NULL, NULL)打开它时,它反复调用读取函数,但实际上并没有进行。我怀疑是因为 RTP 流本身没有足够的信息来完整描述编解码器?如果我将其打开,那么 av_read_frame(inputctx, input_packet) 会出现段错误,我猜是因为输入上下文未初始化。

那么对于我的问题,是否可以设置 SDP 通常会手动设置的编解码器详细信息?

我正在寻找有关如何手动配置 AVFormatContext 以在没有 SDP 的情况下使用 RTP 数据包并设置 UDP 端口侦听器的示例。

事实证明,这可以通过使用未记录的标志 FLAG_RTSP_CUSTOM_IO 来实现。我在这里详细说明了如何做到这一点:https://blog.kevmo314.com/custom-rtp-io-with-ffmpeg.html