(转)FFMPEG的一些使用技巧
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
(转)FFMPEG的一些使用技巧的更多相关文章
- 黄聪:FFmpeg视频转码技巧之-crf参数(H.264篇)
昨天,有个朋友给我出了个难题:他手上有一个视频,1080P的,49秒,200多兆:要求在确保质量的情况下把文件压缩到10M以内. 这是什么概念呢?按照文件大小10M来计算,码率是:10 x 8 / 4 ...
- 玩转FFmpeg的7个小技巧
FFmpeg堪称音频和视频应用程序的瑞士军刀,提供了丰富的选项和灵活性.很多时候用户为了看视频和听音乐都安装了ffmeg.更多关于ffmeg的详细介绍:here,可以通过ffmpeg -formats ...
- ffmpeg 使用 gdb 调试相关技巧
本文说明了,在ffmpeg二次开发或调用库的过程,如何借助于ffmpeg源码进行调试. 注:ffmpeg版本是4.0. 1. 编写代码 编写将pcm数据转换为mp2的代码 pcm_to_mp2.c # ...
- 多媒体音视频处理及FFmpeg使用技巧总结
截图 ffmpeg -ss 00:02:06 -i input.mp4 -f image2 -y poster.jpg 连续截图 ffmpeg -y -i input.mp4 -vf "fp ...
- 解密FFmpeg播放track mode控制
上一篇文章(http://www.cnblogs.com/yangdanny/p/4421130.html)我们解决了在FFmpeg下如何处理H264和AAC的扩展数据,根据解出的NALU长度恢复了H ...
- 解密FFmpeg播放状态控制内幕
上一篇文章(http://my.oschina.net/u/2336532/blog/400790)我们解决了在FFmpeg下如何处理H264和AAC的扩展数据,根据解出的NALU长度恢复了H264的 ...
- ffmpeg, libav学习记录
转载自:http://hi.baidu.com/y11022053/item/81f12035182257332e0f8196 一个偶然遇到了ffmpeg,看起来不多,而且通用性很强,算是一个扎实的技 ...
- CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用
作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...
- FFMpeg编译之路
为了编译这个东西,快折腾了一个星期了.期间经历了很多痛苦的过程,今天我把整个过程,以及在这个过程的感悟写下来,以备日后查看,也希望能帮到一些像我一样的兄弟姐妹. 在这一个星期里前前后后加起来总共使用了 ...
随机推荐
- django rest_framework入门二-序列化
在前一节中,我们已经粗略地介绍了rest_framework的作用之一序列化,下面我们将详细探究序列化的使用. 1.新建一个app snippets python manage.py startapp ...
- Python爬取新浪微博评论数据,写入csv文件中
因为新浪微博网页版爬虫比较困难,故采取用手机网页端爬取的方式 操作步骤如下: 1. 网页版登陆新浪微博 2.打开m.weibo.cn 3.查找自己感兴趣的话题,获取对应的数据接口链接 4.获取cook ...
- 关于RAID_1+0和RAID_0+1的比较
RAID的概念就不多说了,说说 RAID 0 和 RAID 1 . RAID 0 是条带存储,叠加所有硬盘容量,因此不具有容错性,原理如下图所示: RAID 1 使用非常原始的方式(复制一份.镜像)进 ...
- Oracle 项目中 SQL 脚本更新方式
DECLARE hasVersion ); dbVersion ); BEGIN ) INTO hasVersion FROM ELB_SETTINGS E WHERE E.KEY='dbVersio ...
- 2. 集成学习(Ensemble Learning)Bagging
1. 集成学习(Ensemble Learning)原理 2. 集成学习(Ensemble Learning)Bagging 3. 集成学习(Ensemble Learning)随机森林(Random ...
- iOS友盟社会化分享U-Share分享面板不显示的问题(基本配置没有错误)
//要先是window可视化 [self.window makeKeyAndVisible]; //添加友盟分享[[UMSocialManager defaultManager] openLog:YE ...
- 爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,loads,dump,load方法介绍
爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,load ...
- nginx servername配置域名网站可以正常登录,servername配置IP+Port却无法正常登录
由于业务的原因,需要将网站从通过域名访问变换为通过IP+PORT的访问方式: 以前的配置: server { listen ; server_name wx.xxxx.com; } 以前的登录页面: ...
- Centos6.5生成环境配置--nginx1.9 + PHP+可多个tomcat(多个端口)+多域名+java web 负载均衡
安装n p 参考: CentOS6.5搭建LNMP http://www.cnblogs.com/xiaoit/p/3991037.html http://blog.csdn.net/keyunq/a ...
- 【Unity】协程Coroutine及Yield常见用法
最近学习协程Coroutine,参考了别人的文章和视频教程,感觉协程用法还是相当灵活巧妙的,在此简单总结,方便自己以后回顾.Yield关键字的语意可以理解为“暂停”. 首先是yield return的 ...