(转)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编译之路
为了编译这个东西,快折腾了一个星期了.期间经历了很多痛苦的过程,今天我把整个过程,以及在这个过程的感悟写下来,以备日后查看,也希望能帮到一些像我一样的兄弟姐妹. 在这一个星期里前前后后加起来总共使用了 ...
随机推荐
- Android.mk简介
http://www.cnblogs.com/hnrainll/archive/2012/12/18/2822711.html Android.mk文件是GNU Makefile的一小部分,它用来对A ...
- 【AD】实用组策略/脚本集合 (重大更新20160627)
文章原始出处 http://blog.51cto.com/xifanliang/1793576 http://bbs.51cto.com/thread-1170777-1.html 作者:xifaln ...
- jetty 6.1 笔记
download: http://dist.codehaus.org/jetty/jetty-6.1.22/ jetty 6.2 代码启动 必要jar包 lib --->> lib---& ...
- 如何在linux下查看目录的剩余空间大小
df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,命令格式: df -hl 显示格式为: 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Siz ...
- 4. 支持向量机(SVM)原理
1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...
- linux中注册系统服务—service命令的原理通俗
能够使用service命令进行操作的,就是已经注册成为linux的系统服务了.window中也可以注册成为系统服务的办法. service命令用的次数真不少,就是比较多的关联点,用了很多次了,还是有些 ...
- C语言 · 猜灯谜
标题:猜灯谜 A 村的元宵节灯会上有一迷题: 请猜谜 * 请猜谜 = 请边赏灯边猜 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字. 请你用计算机按小明的思路算一下,然后提交“请猜谜”三 ...
- Linux系统中的以太网连接
1.在Linux中,以太网连接接口被命令为:eth0,eth1等,其中0,1表示网卡编号. 2.lspci来查看网卡硬件信息(USB则是lsusb) 3.ifconfig来查看接口信息 ifconfi ...
- Rsync命令参数详解
在对rsync服务器配置结束以后,下一步就需要在客户端发出rsync命令来实现将服务器端的文件备份到客户端来.rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进 ...
- SpringBoot 开启 Actuator
在生产环境中,需要实时或定期监控服务的可用性.spring-boot 的actuator(监控)功能提供了很多监控所需的接口.简单的配置和使用如下: 1.引入依赖: <dependency> ...