前言:
2015年初的文章,屯了好久。。。。。起初是因为.NET平台用惯了,做C++相关开发时恋恋不舍啊,不过后面发现坑是越跳越大啊。如果没必要的话,这种混合.NET和NATIVE的开发还是不要去做,尤其是CPPCLR(这到底是个什么鬼,不仅解放不了程序员,还套牢了啊!),毕竟两个内存空间就是两个世界啊!要做好一个GM就已经不容易了,一下子要做两个GM啊!!!
开篇就是环境搭建相关
Q:error MSB8009: .NET Framework 2.0/3.0/3.5 以 v90 平台工具集为目标。请确保在计算机上安装了 Visual Studio 2008。
A:这个问题不能算是本文主要的问题,因为找了一个CLR的工程是VS2008开发的,所以在其基础上继续开发时会有一些平台的问题,具体解决参考:http://blog.chinaunix.net/uid-26727991-id-4685290.html,其实很多平台工具集error都可以这么解决的。
Q:如何快速添加lib文件(技巧)。
A:相信很多人都有遇到过,配置工程的时候,要添加一堆的lib!!!这里就放个技巧吧,命令行进入lib目录,敲dir *.lib,然后标记,然后粘贴,轻松搞定。
Q:支持C99的问题
A:这是个很蛋痛的问题,尝试了将extern c那一块放到最前,虽然不会提示找不到inttypes.h,但是很不幸的是这样子你连av_register_all()都无法成功。
博主是个追求完整的人,是不能随随便便修改.h文件的具体的包含内容。但最终还是屈服了,将网上下载的auto_inttypes.h等两个文件放到目录XXX,具体参考:http://blog.csdn.net/chenkent888/article/details/10712851
博主在下载频道传了一份:http://download.csdn.net/detail/xiaoy_h/9579639。
然后修改错误提示中common.h头文件的#include <inttypes.h>为#include <auto_inttypes.h>,搞定!
还有,对于C99兼容问题,http://blog.csdn.net/hmsiwtv/article/details/8120947该文章也提供了不错的解决方案
Q:丢失avformat-56.dll问题
A:将所有dll都拷贝到生成的可执行文件目录下就可以了,比如solution\x64\debug\目录下,由于x86等配置过多的项目请一定注意可执行文件的时间戳,别拷贝到另一个存在可执行文件的目录里了。调试运行的时候第一次运行可能会很慢,这时可能是在加载DLL
Q:Intellisence无法用于C++/CLR
A:官方给出的方案比较复杂,而且说辞含糊不清,很多地方无法下手,综合了一下,使用VAX,对于新手来说这个插件帮助还是很大的。
至此一些开发环境搭建的会碰到的问题基本上罗列了一些,具体步骤及其它问题可以参考文章:
http://www.it165.net/pro/html/201407/17353.html
http://www.cnblogs.com/slayercat/archive/2012/09/11/CPP-CLI_FFMPEG.html
http://blog.csdn.net/ymsdu2004/article/details/8451292
http://www.cnblogs.com/Jerry-Chou/archive/2011/03/31/2000761.html
关于FFMpeg的一些具体问题
接下来是FFMpeg编程中遇到的问题,博主使用的2015.1.24时下最新发布的库,网上很多教程都是在老版本下开发调试的,有的代码也尝试过使用,但是会出现很多问题,这才使得博主start from scratch....
Q:新老接口对照问题:
A:无独有偶,很多开源库经过大版本更新,都会发生接(wo)!口(le)!变(ge)!动(cao)!的问题!(将于2016.9进行完善)
Q:avformat_open_input函数返回错误码-2;
A:查看了下-2信息的错误原因是no file or directory,需要将视频文件放到与cpp文件同目录,而不是Debug目录下,当然,也可以通过修改调试目录的方法解决。。
参考:http://www.360doc.com/content/14/0515/15/2306903_377849306.shtml
Q:用什么函数输出媒体文件的一些信息
A:av_dump_format函数,能够验证你所读取到的帧率、码流、分辨率等信息是否准确。
Q:传指针的注意点AVFormatContext**
A:这应该属于一般性的指针问题,但是对于刚接触类似指针用法或者很少用这种用法(C#等高级语言里引用走遍天下)的人可能对这种传参方式有点陌生。
这种传参(注意两个*号)其实就一个目的,要在调用函数中对AVFormatContext*这个指针进行修改,同时影响父函数中该指针的值(或者说指向更贴切),这种用法在C中应该会比较多见,C++上基本就是引用了(引用和指针有什么区别?可以参考另一篇博客:http://blog.csdn.net/XiaoY_H/article/details/8585576)。这其实跟int a;add(&a);这样的传参是一个道理,但是由于*号比较多容易把人绕晕。
Q:avcodec_open2
A:(将于2016.9进行完善)
Q:BITMAPFILEHEADER所在头文件
A:(将于2016.9进行完善)
Q:解码写入BMP文件
A:戳->>>>>>> http://blog.csdn.net/husthlj/article/details/6640574
Q:内存泄露问题(A big problem)
A:第一点,为什么要讲这个问题,这很严肃!!!如JAVA,C#之流的高级语言是不会出现此类问题的,毕竟有GC(不是高潮),而且没有指针,没有动态内存,自然涉及不到内存泄露的问题,但是C/C++就不一样了啊,如果申请了不释放,在程序退出前系统是不会回收的,有人会说,那就退出的时候自动释放呗,但是!!!如果有后台线程没有退出呢!OMG~。
第二点,谈谈FFMpeg带的av_free:用malloc等系统库函数申请的内存千万别通过av_free函数释放,放不出来的!!其它通过FFMpeg库函数声明/定义的变量、申请的内存,是可以通过av_free或者更有针对性的av_free_packet(&packet)函数释放。
第三点:讲讲混编需要注意的!还有要注意的一点是,在托管与非托管的混合编程中,托管空间是无法释放非托管内存等资源的,只有通过调用非托管空间里函数(比如C++申请的要C++函数来释放)的方法释放,想通过GC各种收集函数之类的也是办不到的(亲测啊)。