m0_61770108 2024-07-10 17:01 采纳率: 13.5%
浏览 54
已结题

FFmpeg7中使用swr_alloc_set_opts2()一直显示参数不正确

FFmpeg7中使用swr_alloc_set_opts2()一直显示参数不正确
源码:

pCodec = avcodec_find_decoder(pFormatCtx->streams[audioStream]->codecpar->codec_id);
    if(pCodec == NULL){
        qDebug()<<"未找到解码器AVCodec";
    }
    //查找解码器AVCodecContext
    pCodecCtx = avcodec_alloc_context3(NULL);
    AVCodecParameters *codecpar = pFormatCtx->streams[audioStream]->codecpar;
    if(avcodec_parameters_to_context(pCodecCtx,codecpar)<0){
        qDebug()<<"初始化AVCodecContext失败";
        return;
    }

    //打开解码器
    if(avcodec_open2(pCodecCtx,pCodec,NULL)<0){
        qDebug()<<"打开解码器失败";
        return;
    }

    out_codec = avcodec_find_encoder(AV_CODEC_ID_PCM_S16LE);
    out_codec_ctx = avcodec_alloc_context3(out_codec);
    out_codec_ctx->sample_fmt = AV_SAMPLE_FMT_S16;
    out_codec_ctx->sample_rate = pCodecCtx->sample_rate;
    out_codec_ctx->ch_layout = pCodecCtx->ch_layout;
    if (avcodec_open2(out_codec_ctx, out_codec, NULL) < 0) {
        qDebug()<<"打开PCM解码器失败";
        return;
    }


    //初始化AVFrame
    pFrame = av_frame_alloc();
    pFramePCM = av_frame_alloc();

   
    swr_ctx = swr_alloc_set_opts2(NULL,
                                  &out_codec_ctx->ch_layout,AV_SAMPLE_FMT_S16,out_codec_ctx->sample_rate,
                                  &pCodecCtx->ch_layout,pCodecCtx->sample_fmt,pCodecCtx->sample_rate,
                                  0, NULL);
    swr_init(swr_ctx);

img

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-10 17:01
    关注

    引自免费微信小程序:皆我百晓生

    你的问题在于在使用 swr_alloc_set_opts2() 函数时遇到了参数不匹配的问题。这个错误可能是由于你传递的参数类型或数量不正确导致的。下面我将根据你所提供的代码进行解释并给出可能的解决方案。

    问题点主要在于这一行:

    swr_ctx = swr_alloc_set_opts2(NULL, ...);
    

    这里你试图将一个空指针(NULL)作为第一个参数传递给 swr_alloc_set_opts2() 函数,这是不正确的。根据FFmpeg的文档,第一个参数应该是指向一个已经分配的 SwsContext 结构体的指针。你的代码中没有看到这样的分配过程。你需要先创建一个 SwsContext 对象并将其指针传递给这个函数。修改代码如下:

    SwsContext *swr_ctx = sws_getContext(vectorWidth, vectorHeight, sourcePixelFormat, destinationPixelFormat, flags, ...); //这里的vectorWidth、vectorHeight、sourcePixelFormat、destinationPixelFormat等需要根据你的实际情况填写,flags是一个无符号整型值。例如可以使用默认值SWS_DEFAULT_FLAGS。具体请参考FFmpeg的文档。
    

    然后你可以使用 swr_init() 函数初始化这个上下文:

    if (swr_init(swr_ctx) < 0) { // 错误处理 }
    

    注意:在使用这些函数之前,你需要确保你已经正确地包含了相关的头文件并链接了相关的库文件。你可能需要链接到 FFmpeg 库和 Sws 库才能正确地使用这些函数。否则可能会出现链接错误或者编译错误。这可能会导致函数无法找到或者找不到符号等问题。你可以在你的编译命令中添加 -lswscale 选项来链接到 Sws 库,对于 FFmpeg 库也需要进行相应的链接设置。请确保你使用的库版本是最新的且与你的代码兼容。这些函数的调用可能依赖于库的特定版本或编译配置,所以在升级或修改编译配置时需要注意。在错误提示为 'Incompatible integer to pointer conversion assigning to 'struct SwsContext *' from 'int',这可能意味着你在使用该函数时传递的参数类型不正确或者函数调用的方式有误,请仔细检查你的代码和函数调用是否正确匹配FFmpeg的API文档中的描述。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月17日
  • 创建了问题 7月10日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错