一、 背景介绍
webrtc使用的是ffmpeg的H264解码器,遇到一些问题,需要获取ffmpeg的过程打印。这个本身不是很复杂,只要在InitDecode函数里面调用ffmpeg的钩子函数av_log_set_callback,就可以实现。但是实际操作的时候,发现编译一直失败,找不到av_log_set_callback符号表。
二、问题分析
1、首先查询ffmpeg.dll.lib符号表,看av_log_set_callback函数的符号,是否存在。
命令行:C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\Llvm\x64\bin>llvm-nm D:\code\webrtc\out\Release\ffmpeg.dll.lib
发现确实只有少数几个函数符号存在,大部分的函数都不在。
2、ffmpeg的编译配置文件大多都在third_party\ffmpeg\chromium目录下,去这下面找找思路。
发现codec、parser、demuxer钩子都是在third_party\ffmpeg\chromium\config\Chrome\win\x64下libavcodec/libavformat/libavutil文件配置的
ffmpeg编译模块的开关是在third_party\ffmpeg\chromium\config\Chrome\win\x64下的config.asm、config.h配置的。
再深入找,发现对外公开的函数时在third_party\ffmpeg\chromium\ffmpeg.sigs配置的。
三、解决办法
在ffmpeg.sigs文件中,添加我们需要的函数名。编译问题解决。
四、附录
日志钩子函数:
void ffmpeg_log_default( void *p_unused, int i_level, const char *psz_fmt, va_list arg )
{
char buf[4096];
int length = vsnprintf(buf, sizeof(buf), psz_fmt, arg);
if (length)
RTC_LOG(LS_ERROR) << buf;
}