使用libavformat对原始RTP进行解复用和解码



我正在实现一个管道,在那里我在内存中接收入站RTP数据包,但我很难弄清楚如何设置libavformat来处理/打开RTP数据。

我有关于底层编解码器的所有必要的相关信息,但由于它是h264,我不能简单地剥离RTP标头。我使用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)打开它时,它会反复调用read函数,但实际上并没有进展。我怀疑是因为RTP流本身没有足够的信息来完全描述编解码器?如果我不考虑这个问题,那么av_read_frame(inputctx, input_packet)会出现segfault,我猜是因为输入上下文未初始化。

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

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

通过使用未记录的标志FLAG_RTSP_CUSTOM_IO,这是可能的。我在这里详细介绍了如何做到这一点:https://blog.kevmo314.com/custom-rtp-io-with-ffmpeg.html

相关内容

最新更新