1、查看FFMPEG的日志信息

在vc中使用ffmpeg静态库做二次开发的时候,如果不是控制台应用程序,又需要查看ffmpeg的日志信息,可使用

  1. av_log_set_callback

函数注册一个回调函数,如

  1. void ff_log_callback(void*avcl, int level, const char*fmt, va_list vl)
  2. {
  3. char log[1024];
  4. vsnprintf(log,sizeof(log),fmt,vl);
  5. OutputDebugStringA(log);
  6. }

这样就能在vc的调试输出窗口中看见所有的ffmpeg日志了。

2 使用多个线程同时播放多个视频源的时候,在调用avcodec_open/close的时候,可能导致失败,这个可以查阅ffmpeg的源码分析其中的原因,失败的主要原因是在调用此2函数时,ffmpeg为了确保该2函数为原子操作,在avcodec_open/close两函数的开头和结尾处使用了一个变量entangled_thread_counter来记录当前函数是否已经有其他线程进入,如果有其他线程正在此2函数内运行,则会调用失败

解决此问题可使用函数

  1. av_lockmgr_register

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

  1. int ff_lockmgr_callback(void **mutex, enum AVLockOp op)
  2. {
  3. switch(op)
  4. {
  5. case AV_LOCK_CREATE:///< Create a mutex
  6. {
  7. CRITICAL_SECTION * cs = (CRITICAL_SECTION*)av_malloc(sizeof(CRITICAL_SECTION));
  8. if(!cs)
  9. {
  10. return -1;
  11. }
  12. memset(cs,0,sizeof(CRITICAL_SECTION));
  13. InitializeCriticalSection(cs);
  14. *(CRITICAL_SECTION**)mutex = cs;
  15. }
  16. break;
  17. case AV_LOCK_OBTAIN:///< Lock the mutex
  18. {
  19. if(mutex && *(CRITICAL_SECTION**)mutex)
  20. {
  21. ::EnterCriticalSection(*(CRITICAL_SECTION**)mutex);
  22. }
  23. }
  24. break;
  25. case AV_LOCK_RELEASE:///< Unlock the mutex
  26. {
  27. if(mutex && *(CRITICAL_SECTION**)mutex)
  28. {
  29. ::LeaveCriticalSection(*(CRITICAL_SECTION**)mutex);
  30. }
  31. }
  32. break;
  33. case AV_LOCK_DESTROY:///< Free mutex resources
  34. {
  35. if(mutex && *(CRITICAL_SECTION**)mutex)
  36. {
  37. ::DeleteCriticalSection(*(CRITICAL_SECTION**)mutex);
  38. av_free(*(CRITICAL_SECTION**)mutex);
  39. *(CRITICAL_SECTION**)mutex = NULL;
  40. }
  41. }
  42. break;
  43. default:
  44. break;
  45. }
  46. return 0;
  47. }

3 ffmpeg内存泄漏检测

ffmpeg做二次开发的时候,最头疼的问题之一就是内存泄漏了,其实可以重写libavutil/mem.h和libavutil/mem.c两个文件中的以下几个函数:

av_malloc
av_realloc
av_free
av_mallocz
av_strdup
av_freep
通过重写上述函数(重写后,原上述函数需要注释掉),我们可以记录从堆上动态分配的内存块及其这些内存块的释放情况。

一般情况下,vc可以检测到哪个内存块已经发生泄露,只是定位不到该内存块是在什么地方分配的。

通过重写以上函数后,可以记录动态分配的内存块地址和释放掉的内存块地址,总的分配次数,总的释放次数等等。

下面是一个范本,具体实现可仿照mem.c中对应的函数实现部分。

  1. void *av_malloc_memory_leak_detect(unsigned int size,const char * file,int line) av_malloc_attrib av_alloc_size(1);
  2. void *av_realloc_memory_leak_detect(void *ptr, unsigned int NewSize,const char * file,int line) av_alloc_size(2);
  3. void av_free_memory_leak_detect(void *ptr,const char * file,int line);
  4. void av_freep_memory_leak_detect(void *arg,const char * file,int line);
  5. void *av_mallocz_memory_leak_detect(unsigned int size,const char * file,int line) av_malloc_attrib av_alloc_size(1);
  6. char *av_strdup_memory_leak_detect(const char *s,const char * file,int line);
  7. #define av_malloc(size) av_malloc_memory_leak_detect((size),__FILE__,__LINE__)
  8. #define av_realloc(ptr,size) av_realloc_memory_leak_detect((ptr),(size),__FILE__,__LINE__)
  9. #define av_free(ptr) av_free_memory_leak_detect((ptr),__FILE__,__LINE__)
  10. #define av_mallocz(size) av_mallocz_memory_leak_detect((size),__FILE__,__LINE__)
  11. #define av_strdup(s) av_strdup_memory_leak_detect((s),__FILE__,__LINE__)
  12. #define av_freep(ptr) av_freep_memory_leak_detect((ptr),__

转自:http://blog.csdn.net/sloan6/article/details/9500491

(转)FFMPEG的一些使用技巧的更多相关文章

  1. 黄聪:FFmpeg视频转码技巧之-crf参数(H.264篇)

    昨天,有个朋友给我出了个难题:他手上有一个视频,1080P的,49秒,200多兆:要求在确保质量的情况下把文件压缩到10M以内. 这是什么概念呢?按照文件大小10M来计算,码率是:10 x 8 / 4 ...

  2. 玩转FFmpeg的7个小技巧

    FFmpeg堪称音频和视频应用程序的瑞士军刀,提供了丰富的选项和灵活性.很多时候用户为了看视频和听音乐都安装了ffmeg.更多关于ffmeg的详细介绍:here,可以通过ffmpeg -formats ...

  3. ffmpeg 使用 gdb 调试相关技巧

    本文说明了,在ffmpeg二次开发或调用库的过程,如何借助于ffmpeg源码进行调试. 注:ffmpeg版本是4.0. 1. 编写代码 编写将pcm数据转换为mp2的代码 pcm_to_mp2.c # ...

  4. 多媒体音视频处理及FFmpeg使用技巧总结

    截图 ffmpeg -ss 00:02:06 -i input.mp4 -f image2 -y poster.jpg 连续截图 ffmpeg -y -i input.mp4 -vf "fp ...

  5. 解密FFmpeg播放track mode控制

    上一篇文章(http://www.cnblogs.com/yangdanny/p/4421130.html)我们解决了在FFmpeg下如何处理H264和AAC的扩展数据,根据解出的NALU长度恢复了H ...

  6. 解密FFmpeg播放状态控制内幕

    上一篇文章(http://my.oschina.net/u/2336532/blog/400790)我们解决了在FFmpeg下如何处理H264和AAC的扩展数据,根据解出的NALU长度恢复了H264的 ...

  7. ffmpeg, libav学习记录

    转载自:http://hi.baidu.com/y11022053/item/81f12035182257332e0f8196 一个偶然遇到了ffmpeg,看起来不多,而且通用性很强,算是一个扎实的技 ...

  8. CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...

  9. FFMpeg编译之路

    为了编译这个东西,快折腾了一个星期了.期间经历了很多痛苦的过程,今天我把整个过程,以及在这个过程的感悟写下来,以备日后查看,也希望能帮到一些像我一样的兄弟姐妹. 在这一个星期里前前后后加起来总共使用了 ...

随机推荐

  1. [Windows Azure] Load Testing in Windows Azure

    The primary goal of a load test is to simulate many users accessing a web application at the same ti ...

  2. (原创)sqlite封装库SmartDB1.3发布

    最近终于稍微有点空对SmartDB进行升级了,SmartDB1.3比之前的版本做了简化,增强了易用性和灵活性. SmartDB对sqlite做了一层封装,屏蔽了诸多细节,使得我们使用起来很方便.在注重 ...

  3. Vue.js使用-组件(上篇)

    1.什么是组件 组件可以理解为定义的一个view模块,可重复使用. 2.组件使用 1)创建组件 var myComponent = Vue.extend({ template: ' this is a ...

  4. 前端建立一个本地服务器:browser-sync

    1.安装browser-sync: npm i browser-sync --save-dev 2.在package.json中添加启动代码: "start": "./n ...

  5. SAP NetWeaver BW 7.3介绍

    (摘自SAP 官方 EIM300 SAP NetWeaver BW 7.3 特色功能.前景展望与路线图)

  6. c++ primer读书笔记之c++11(四)

    1  带有作用域的枚举 scoped-enumeration 相信大家都用过枚举量,都是不带有作用域的,在头文件中定义需要特别注意不要出现重名的情况.为了解决这种问题,c++11提供了带作用于的枚举. ...

  7. 06-老马jQuery教程-jQuery高级

    1.jQuery原型对象解密 jQuery里面的大部分API都是在jQuery的原型对象上定义的.jQuery源码中对原型对象做了简写的处理.也就是说:jQuery.fn === jQuery.pro ...

  8. Docker考前突击

    dockerfile 介绍 镜像(Image)     容器(Container)     仓库(Repository)

  9. iOS 开发_..和self...的区别以及使用

    相信很多初学者对_和self.之间的区别并没有一个大致的认识,那么下面对两者的区别做一个简单的介绍: 至于重写set和get方法,简要说明一下,当我们使用@property这用法之后,系统便会自动给我 ...

  10. [转]PowerDesigner中name和code取消自动关联

    PowerDesigner中,但修改了某个字段的name,其code也跟着修改,这个问题很讨厌,因为一般来说,name是中文的,code是字段名. 解决方法如下: 1.选择Tools->Gene ...