FFMPEG打印日志及线程技巧
来源:互联网 发布:jquery popup加载数据 编辑:程序博客网 时间:2024/04/27 19:25
原文地址没找到:找个转载出处吧:http://blog.csdn.net/liuhongxiangm/article/details/11198625
1: 在vc中使用ffmpeg静态库做二次开发的时候,如果不是控制台应用程序,又需要查看ffmpeg的日志信息,可使用
- av_log_set_callback
函数注册一个回调函数,如
- void ff_log_callback(void*avcl, int level, const char*fmt, va_list vl)
- {
- char log[1024];
- vsnprintf(log,sizeof(log),fmt,vl);
- OutputDebugStringA(log);
- }
这样就能在vc的调试输出窗口中看见所有的ffmpeg日志了。
2:使用多个线程同时播放多个视频源的时候,在调用avcodec_open/close的时候,可能导致失败,这个可以查阅ffmpeg的源码分析其中的原因,失败的主要原因是在调用此2函数时,ffmpeg为了确保该2函数为原子操作,在avcodec_open/close两函数的开头和结尾处使用了一个变量entangled_thread_counter来记录当前函数是否已经有其他线程进入,如果有其他线程正在此2函数内运行,则会调用失败。
解决此问题可使用函数
- av_lockmgr_register
- int ff_lockmgr_callback(void **mutex, enum AVLockOp op)
- {
- switch(op)
- {
- case AV_LOCK_CREATE:///< Create a mutex
- {
- CRITICAL_SECTION * cs = (CRITICAL_SECTION*)av_malloc(sizeof(CRITICAL_SECTION));
- if(!cs)
- {
- return -1;
- }
- memset(cs,0,sizeof(CRITICAL_SECTION));
- InitializeCriticalSection(cs);
- *(CRITICAL_SECTION**)mutex = cs;
- }
- break;
- case AV_LOCK_OBTAIN:///< Lock the mutex
- {
- if(mutex && *(CRITICAL_SECTION**)mutex)
- {
- ::EnterCriticalSection(*(CRITICAL_SECTION**)mutex);
- }
- }
- break;
- case AV_LOCK_RELEASE:///< Unlock the mutex
- {
- if(mutex && *(CRITICAL_SECTION**)mutex)
- {
- ::LeaveCriticalSection(*(CRITICAL_SECTION**)mutex);
- }
- }
- break;
- case AV_LOCK_DESTROY:///< Free mutex resources
- {
- if(mutex && *(CRITICAL_SECTION**)mutex)
- {
- ::DeleteCriticalSection(*(CRITICAL_SECTION**)mutex);
- av_free(*(CRITICAL_SECTION**)mutex);
- *(CRITICAL_SECTION**)mutex = NULL;
- }
- }
- break;
- default:
- break;
- }
- return 0;
- }
ffmpeg做二次开发的时候,最头疼的问题之一就是内存泄漏了,其实可以重写libavutil/mem.h和libavutil/mem.c两个文件中的以下几个函数:
av_malloc
av_realloc
av_free
av_mallocz
av_strdup
av_freep
通过重写上述函数(重写后,原上述函数需要注释掉),我们可以记录从堆上动态分配的内存块及其这些内存块的释放情况。
一般情况下,vc可以检测到哪个内存块已经发生泄露,只是定位不到该内存块是在什么地方分配的。
通过重写以上函数后,可以记录动态分配的内存块地址和释放掉的内存块地址,总的分配次数,总的释放次数等等。
下面是一个范本,具体实现可仿照mem.c中对应的函数实现部分。
- void *av_malloc_memory_leak_detect(unsigned int size,const char * file,int line) av_malloc_attrib av_alloc_size(1);
- void *av_realloc_memory_leak_detect(void *ptr, unsigned int NewSize,const char * file,int line) av_alloc_size(2);
- void av_free_memory_leak_detect(void *ptr,const char * file,int line);
- void av_freep_memory_leak_detect(void *arg,const char * file,int line);
- void *av_mallocz_memory_leak_detect(unsigned int size,const char * file,int line) av_malloc_attrib av_alloc_size(1);
- char *av_strdup_memory_leak_detect(const char *s,const char * file,int line);
- #define av_malloc(size) av_malloc_memory_leak_detect((size),__FILE__,__LINE__)
- #define av_realloc(ptr,size) av_realloc_memory_leak_detect((ptr),(size),__FILE__,__LINE__)
- #define av_free(ptr) av_free_memory_leak_detect((ptr),__FILE__,__LINE__)
- #define av_mallocz(size) av_mallocz_memory_leak_detect((size),__FILE__,__LINE__)
- #define av_strdup(s) av_strdup_memory_leak_detect((s),__FILE__,__LINE__)
- #define av_freep(ptr) av_freep_memory_leak_detect((ptr),__FILE__,__LINE__)
- FFMPEG打印日志及线程技巧
- NSLog打印日志技巧
- FFMPEG 日志 锁 内存技巧
- FFMPEG Tips (1) 如何打印日志
- Tomcat调试及日志打印
- nginx日志打印及分割
- 日志打印及配置更新
- iOS中打印日志显示系统详细时间,类名,行号,函数名,线程,及打印值
- 调试中日志打印printf技巧
- Log4j打印日志添加线程ID
- 常用的NSLog日志打印 以 打印技巧
- ffmpeg 播放流程及线程管理
- WebLogic不能打印日志问题及解决办法
- Android 日志打印功能及项目
- HTTP接口设计及日志打印
- ffmpeg--日志
- IOS Xcode8 日志打印不全及屏蔽系统日志解决方法
- 安卓-打印日志及日志工具类使用
- UISearchBar背景透明,去掉背景,自定义背景
- 完全二叉树叶子结点的算法
- png加jpg扣图lua版
- Qt 之 QFrame
- EBS 可拓展的外部信用风险导入
- FFMPEG打印日志及线程技巧
- TC608——Java中的Servlet编程问答
- 传授价值百万的经验
- cocos2dx3.2新手实战教程-----飞机大战之路
- window调试学习3——内存调试
- Visual glBlendFunc + glBlendEquation Tool
- 分布式集群的Session问题
- EBS 外部信用风险检查
- 父窗口与物主窗口