修改FFMpeg的日志函数av_log,使其在记录日志时能显示调用该函数的位置(文件名和行号)

需要注释掉原有的 av_log 声明和实现,然后将新代码添加到 log.h 中。以下是完整、优化的实现方案:

在log.h中添加一下代码,已定义新的av_log函数。

c 复制代码
// log.h

#include <stdio.h>

// 修改函数签名,增加 file 和 line 参数
static void av_log_impl(void* avcl, int level, const char *file, int line, const char *fmt, ...) {
    va_list vl;
    va_start(vl, fmt);

    // 动态拼接调用位置信息(避免缓冲区溢出)
    char new_fmt[1024];
    snprintf(new_fmt, sizeof(new_fmt), "[%s:%d] %s", file, line, fmt);

    av_vlog(avcl, level, new_fmt, vl); // 调用底层日志函数
    va_end(vl);
}

// 定义包装宏:在调用点展开 __FILE__ 和 __LINE__
#define av_log(avcl, level, fmt, ...) \
    av_log_impl(avcl, level, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

需要同时进行的修改:

  1. 在实现文件中注释掉原有函数定义

    在你的实现文件(如 log.c)中找到原函数并注释掉:

    c 复制代码
    // void av_log(void* avcl, int level, const char *fmt, ...)
    // {
    //     ... 原有实现 ...
    // }
  2. 注释掉原来的av_log声明

    在 log.h 中,注释掉原来的av_log声明:

    c 复制代码
     // 注释掉原来的av_log声明
     // void av_log(void* avcl, int level, const char *fmt, ...);
  3. 确保 av_vlog 可用

    确保在 log.h 中声明了 av_vlog 函数:

    c 复制代码
    void av_vlog(void* avcl, int level, const char *fmt, va_list vl);

关键优化说明:

  1. 安全缓冲区

    • 使用固定大小缓冲区避免动态内存分配
    • 安全截断确保不会越界 (snprintf 的自动截断特性)
  2. 性能考虑

    • static 函数定义避免符号冲突
    • 内联调用位置信息仅在启用日志时才处理
  3. 编译器兼容性

    • ##__VA_ARGS__ 处理 GNU C/C++ 的空参数情况
    • 使用标准 C99 特性保证可移植性
  4. 日志格式灵活性

    如果想添加更多上下文(如函数名),可扩展为:

    c 复制代码
    #define av_log(avcl, level, fmt, ...) \
        av_log_impl(avcl, level, __FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__)

    然后在函数中修改格式字符串为 "[%s:%d] %s: %s"

这样修改后,所有调用 av_log 的地方都会自动添加准确的位置信息,例如:

c 复制代码
av_log(NULL, 1, "Starting playback");
// 输出格式: [player.c:42] Starting playback
相关推荐
行者-全栈开发1 小时前
Spring Boot + FFmpeg 视频批量处理实战:压缩、HLS切片与异步任务引擎
spring boot·ffmpeg·异步处理·视频压缩·hls切片·批量任务·redis队列
可乐鸡翅yeah_5 小时前
M3U8测试流使用指南,流媒体开发自测与环境校验标准化方案
网络·ffmpeg·音视频·m3u8·m3u8在线·音视频在线播放
heqingchun166 小时前
Ubuntu 22.04 交叉编译 RK3568 MPP + FFmpeg 完整指南
linux·ubuntu·ffmpeg
刘广睿6 小时前
音频降噪实战:ffmpeg 滤镜、RNNoise 与人声分离方案对比
ffmpeg·音视频·效率工具·剪辑
IvorySQL1 天前
代价比较的变革——PostgreSQL执行计划干预增强深度解析
数据库·postgresql·ffmpeg
≮傷£≯√3 天前
Qt 面试(一)
qt·ffmpeg·音视频
刘广睿4 天前
视频字幕从提取到烧录:SRT/ASS 格式与 ffmpeg 字幕滤镜全流程
ffmpeg·音视频·效率工具·剪辑·字幕
可乐鸡翅yeah_4 天前
FFmpeg 与浏览器 HLS 播放表现差异,定位跨客户端兼容问题
ffmpeg·音视频·m3u8·m3u8在线·音视频在线播放
刘广睿6 天前
断点续传与分片下载是怎么实现的?Range 请求在视频下载中的工程实践
okhttp·ffmpeg·音视频·下载·python3.11
IvanCodes7 天前
FFmpeg安装与使用教程
ffmpeg