使用ffmpeg打开RTMP文件时崩溃

使用ffmpeg打开RTMP文件时崩溃,ffmpeg,rtmp,Ffmpeg,Rtmp,我已经编写了使用ffmpeg播放视频的代码 当我打开AVI文件时,代码可以正常工作,但当我尝试打开RTMP提要时,会出现错误 在utils.c文件中,使用utils.c文件的以下函数 utils.c int avcodec_parameters_to_context(AVCodecContext *codec, const AVCodecParameters *par) { codec->codec_type = par->codec_type; // crash ha

我已经编写了使用ffmpeg播放视频的代码

当我打开AVI文件时,代码可以正常工作,但当我尝试打开RTMP提要时,会出现错误

在utils.c文件中,使用utils.c文件的以下函数

utils.c

int avcodec_parameters_to_context(AVCodecContext *codec,
 const AVCodecParameters *par)

{
    codec->codec_type = par->codec_type;  // crash happens at this line.


}
**par为空PTR

这是我的密码

 if (load_frame("rtmp://192.168.1.2/live/sumit", &file_width, &file_height, &myData)) {
        std::cout << "file Loaded";
    }
if(加载帧)rtmp://192.168.1.2/live/sumit“,&文件\宽度,&文件\高度,&我的数据)){
std::cout streams[i]->codepar;
av_编解码器=avcodec_查找_解码器(av_编解码器参数->编解码器id);
if(!av_编解码器){
std::cout codec_type==AVMEDIA_type_VIDEO)
{
视频流索引=i;

std::cout想想
avformat\u open\u input
就像
fopen
一样。它会打开一个流/文件,但您仍然没有关于流/文件内容的信息,只有一个句柄来做进一步的操作


如果您想查看流/文件中的数据,必须首先读取标题以确定其中的内容。
avformat\u find\u stream\u info
将实现这一点

想象一下
avformat\u open\u input
就像
fopen
一样。它将打开流/文件,但您仍然没有流/文件的信息帐篷里,只有一个把手可以做进一步的操作

如果您想实际查看流/文件中的数据,必须首先读取标题以确定其中的内容。
avformat\u find\u stream\u info
将完成此任务

AVFormatContext *av_format_ctx = avformat_alloc_context();
    if (!av_format_ctx) {
        std::cout << "could not create a format context\n";
        return false;
    }
    
    if (avformat_open_input(&av_format_ctx, filename, NULL, NULL) < 0) {
        std::cout << "Couldn't open video file\n";
        return false;
    }
    AVCodecParameters* av_codec_params = nullptr;
    AVCodec* av_codec = nullptr;
    int video_stream_index = -1;
    for (unsigned int i = 0; i < av_format_ctx->nb_streams; i++) {
        auto stream = av_format_ctx->streams[i];
        av_codec_params = av_format_ctx->streams[i]->codecpar;
        av_codec = avcodec_find_decoder(av_codec_params->codec_id);
        
        if (!av_codec) {
            std::cout << "Couldn't find the codec\n";
            continue;
        }

        if (av_codec_params->codec_type == AVMEDIA_TYPE_VIDEO)
        {
            video_stream_index = i;
            std::cout << "Video stream found" << std::endl;
            break;
        }

        if (video_stream_index < 0)
            return false;
    }

    // set up codec context for the decoder
    AVCodecContext* av_codec_ctx = avcodec_alloc_context3(av_codec);
    if (!av_codec_ctx) {
        std::cout << "Couldn't create AV context";
        return false;
    }
      
   // this function invokes the error
    if (avcodec_parameters_to_context(av_codec_ctx, av_codec_params) < 0) {
        std::cout << "Couldn't initialize AVCodecContext";
        return false;
    }