m0_61770108 2024-06-05 11:40 采纳率: 13.5%
浏览 30
已结题

FFmpeg中使用avio_open打开MP4文件没有问题,avformat_write_header写入头文件导致程序崩溃

FFmpeg中使用avio_open打开MP4文件没有问题,avformat_write_header写入头文件导致程序崩溃

img

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-05 11:40
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的代码片段和描述,您在使用 FFmpeg 的 avio_open 函数成功打开 MP4 文件后,遇到程序在调用 avformat_write_header 函数写入文件头信息时崩溃的问题。这个问题可能由几个原因引起,以下是一些可能的原因和相应的解决方案:

    可能的原因及解决方案:

    1. 内存分配失败

      • avformat_alloc_context() 可能没有正确分配内存。
      • 解决方案:确保 pFormatCtx 被正确分配并初始化。
    2. 文件路径或权限问题

      • 确保文件路径正确,并且程序具有写入该文件的权限。
      • 解决方案:检查文件路径和权限。
    3. 不兼容的容器或编码格式

      • 确保您尝试写入的 MP4 文件与 FFmpeg 支持的格式兼容。
      • 解决方案:检查文件格式和编码设置。
    4. 错误的参数传递

      • avformat_write_header 函数的参数可能不正确。
      • 解决方案:检查传递给 avformat_write_header 的参数是否正确。
    5. FFmpeg 版本问题

      • 确保您使用的 FFmpeg 版本与您的代码兼容。
      • 解决方案:更新或降级 FFmpeg 到一个兼容的版本。
    6. Qt 和 FFmpeg 的集成问题

      • 如果您在 Qt 环境中使用 FFmpeg,可能存在一些集成问题。
      • 解决方案:确保 FFmpeg 正确集成到 Qt 项目中。

    代码实现:

    您提供的代码片段中,avio_openavformat_write_header 的调用看起来是正确的。但是,为了确保程序的健壮性,您可以添加一些额外的错误检查和日志记录,以便更好地诊断问题。

    // 打开输出文件
    if (avio_open(&pFormatCtx->pb, m_filename.toStdString().c_str(), AVIO_FLAG_WRITE) < 0) {
        qDebug() << "Open File Failed";
        return false;
    }
    
    // 写入文件头
    if (avformat_write_header(pFormatCtx, NULL) < 0) {
        qDebug() << "Write Header Failed";
        // 清理资源
        avio_closep(&pFormatCtx->pb);
        return false;
    }
    

    参考资料:

    附加建议:

    • 使用调试工具(如 gdb 或 Visual Studio 的调试器)来确定崩溃的确切位置和原因。
    • 检查 FFmpeg 的日志输出,以获取更多关于错误的信息。
    • 确保您的 FFmpeg 库是最新的,并且与您的代码兼容。

    希望这些信息能帮助您解决问题。如果问题仍然存在,请提供更多的错误信息或日志,以便进一步分析。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月6日
  • 创建了问题 6月5日

悬赏问题

  • ¥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报错