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. 【教程】ubuntu中配置tftp

    1. 安装 tftpd ( tftp 服务器). tftp ( tftp 客户端)以及 xinetd (超级服务器) 1. 安装 tftpd ( tftp 服务器). tftp ( tftp 客户端) ...

  2. 【Socket】linux套接字技术之tcp

      1.mystery引入      1)UDP也可以编写出C/S程序 ,另外TCP也可以编写点对点通信.    2)网络的本质就是资源共享,当前流行的P2P应用正好暗合了这种精神.    3)当前流 ...

  3. 多媒体文件格式之ASF

    [时间:2016-06] [状态:Open] ASF,全称Advanced Systems Format,是由微软提出的开放封装格式标准.ASF是微软公司Windows Media的核心.这是一种包含 ...

  4. Python3之pymysql导入mysql

    $cat insert.py #!/usr/bin/python # -*- coding: UTF-8 -*- import os import sys import datetime import ...

  5. RelativeLayout 相对父级元素布局

    相对布局,用来设置相对父级视图的位置 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android ...

  6. 自定义NSOperation下载图片

    自定义NSOperation的话,只是需要将要下载图片的操作下载它的main方法里面,考虑到,图片下载完毕,需要回传到控制器里,这里可以采用block,也可以采用代理的方式实现,我采用的是代理的方式实 ...

  7. Spark Streaming 执行流程

    Spark Streaming 是基于spark的流式批处理引擎,其基本原理是把输入数据以某一时间间隔批量的处理,当批处理间隔缩短到秒级时,便可以用于处理实时数据流. 本节描述了Spark Strea ...

  8. composer安装与应用

    操作环境:centos 6.5+32bit 1. 建立项目目录 mkdir test cd test 2. 在当前目录下安装: $ curl -sS https://getcomposer.org/i ...

  9. 【.Net】Thread.Start()与ThreadPool.QueueUserWorkItem()的区别

    百度搜到的靠前的几篇文章,都是写了两种API的使用实例,但并没有说清两者的具体差别. 直接上stackoverflow搜才是正确的姿势.(想上谷歌,然而十/九_大|期间VPN各种被墙,就很气) 参考: ...

  10. 手动安装 MyEclipse6.5 FindBugs

    手动安装步骤: 官方网址:http://findbugs.sourceforge.net/; 下载地址:http://sourceforge.net/projects/findbugs/files/f ...