您的位置:首页 > 其它

(转)FFMPEG的一些使用技巧

2015-07-09 13:40 686 查看

1、查看FFMPEG的日志信息

在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

注册一个运行时锁,当一个线程进入此2函数内时,ffmpeg会调用回调函数锁定该段代码,不让其他函数进入。下面是一个回调函数:

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;

}

3 ffmpeg内存泄漏检测
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),__

转自:http://blog.csdn.net/sloan6/article/details/9500491
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: