美文网首页
记录一次ffmpeg崩溃问题的查找

记录一次ffmpeg崩溃问题的查找

作者: 叶迎宪 | 来源:发表于2021-04-16 09:37 被阅读0次

一个利用ffmpeg编码推送rtmp流的库,如果没有发送音视频数据给它编码直接关闭,在delphi下被调用时发生了崩溃,而在vc下被调用是正常的。崩溃时的调用栈显示

未知函数
avcodec_close
avcodec_free_context

而崩溃的信息为 Invalid floating point operation。通过加日志,发现发生崩溃的avcodec是一个aac的编码器,在它之前运行的x264编码器avcodec_free_context调用是正常的。由于是浮点操作非法,第一感觉是发生在codec之中,而不是ffmpeg外围的其他函数,因为外围函数应该不需要用到浮点运算。

查看avcodec_close的实现
https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/utils.c
当中有一行

        if (avctx->codec && avctx->codec->close)
            avctx->codec->close(avctx);

这里调用了codec自己的close函数。再看aac编码器的close函数

static av_cold int aac_encode_end(AVCodecContext *avctx)
{
    AACEncContext *s = avctx->priv_data;

    av_log(avctx, AV_LOG_INFO, "Qavg: %.3f\n", s->lambda_sum / s->lambda_count);

    ff_mdct_end(&s->mdct1024);
    ff_mdct_end(&s->mdct128);
    ff_psy_end(&s->psy);
    ff_lpc_end(&s->lpc);
    if (s->psypp)
        ff_psy_preprocess_end(s->psypp);
    av_freep(&s->buffer.samples);
    av_freep(&s->cpe);
    av_freep(&s->fdsp);
    ff_af_queue_close(&s->afq);
    return 0;
}

很明显因为没有编码过,所以lambda_count为0,因此发生了除0出错。但是为什么vc下面不会报错呢?写一个最简单的vc程序,看一下除0问题

    float a = 2;
    float b = 0;
    float c = a / b;

这样的程序是可以正常运行的。但是把float类型换成int,就会报除0出错了。另一位同事在网上找到了参考信息
https://www.cnblogs.com/findumars/p/5345503.html

看来是delphi默认的浮点设置导致了不允许浮点除0。当然,通过更深入的查找,vc里面也是可以设置打开浮点异常的
https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/e9b52ceh(v=vs.100)
加一句 _control87(0, _MCW_EM); 就可以打开所有的浮点异常

https://stackoverflow.com/questions/39684161/why-an-application-starts-with-fpu-control-word-different-than-default8087cw

相关文章

  • 记录一次ffmpeg崩溃问题的查找

    一个利用ffmpeg编码推送rtmp流的库,如果没有发送音视频数据给它编码直接关闭,在delphi下被调用时发生了...

  • mycat异常崩溃问题查找

    问题: Java服务连接mycat,mycat拒绝连接 拒绝连接原因: Mycat进程异常中断 问题排查结果: 根...

  • 多线程调用问题2

    前言 最近遇到一个崩溃,都是一些基础问题没注意引起的。查找问题的时候还是花了一些时间,感觉还是有必要记录一下。 崩...

  • iOS崩溃分析查找

    描述崩溃 当应用发生崩溃时,会创建崩溃报告并存储在设备上,通过日志查找问题并解决 崩溃日志头部分析: Except...

  • WPF捕获全局未处理异常

    WPF中捕获全局异常并记录 应用有时候会异常崩溃,这时候如果有错误的堆栈信息,就很方便我们查找问题。捕获未处理异常...

  • 不用第三方bug统计该如何骚操作

    前言 每次线上都会有些崩溃记录在友盟,但是这些崩溃日志并不好查找崩溃的原因,我就在想有没有好一点的方法. 错误的异...

  • 记录一次拍照预览崩溃问题

    该bug目前只发现在小米11上复现 MIUI12发生异常流程: 使用camera2拍照==>存到file ==> ...

  • 汇总:记录线上崩溃的问题

    前言 记录线上崩溃问题,持续记录... DigitsKeyListener导致7.x.x以下手机崩溃 修复方式: ...

  • FFmpeg for iOS问题记录

    遇到类似如下编译错误: Undefined symbols for architecture arm64:"_VT...

  • 记录一次组播花屏问题的查找

    新开发的组播播放器,发现在视频源运动剧烈的时候会出现比较严重的花屏。开始以为是组播丢包导致的,但打印了丢包检测的日...

网友评论

      本文标题:记录一次ffmpeg崩溃问题的查找

      本文链接:https://www.haomeiwen.com/subject/ftlgtltx.html