ffmpeg

mac中编译并安装ffmpeg+x264

下载x264代码:http://www.videolan.org/developers/x264.html
x264 iOS build script:https://github.com/kewlbear/x264-ios
下载ffmpeg代码:svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg

sudo chmod 777 /usr/local/
cd x264
 ./configure --enable-static --disable-yasm
 make && make install

 cd ffmpeg
 ./configure --disable-yasm --enable-libx264 --enable-gpl --extra-ldflags="-L/usr/local/lib" --extra-cflags="-I/usr/local/include"
 make && make install

–extra-cflags用于指定头文件路径,–extrac-ldflags用于指定库文件路径。

测试h264编码:

ffmpeg -i mm.MOV -acodec libfaac -ab 96k -vcodec libx264 -vpre slow -crf 22 -threads 0 OUTPUT.mp4
ffmpeg -i mm.MOV -acodec copy -ab 96k -vcodec libx264 -vpre slow -crf 22 -threads 0 OUTPUT.mp4

ffmpeg中一些重要的概念:

planar 平面的,二维的
Demux 解复用,解封装

 

-(void)listFFMpegCodecInfos
 {
 av_register_all();
 AVCodec* codec=av_codec_next(NULL);
 while(codec)
 {
 codec=av_codec_next(codec);
 if(codec)
 {
 printf("AVCodec name: %s, %s\n",codec->name,codec->long_name);
 }
 }
 }

rake

Rake的意思是Ruby Make,一个用ruby开发的任务管理工具。Rake的英文意思是耙子。

Rake跟C/C++领域的make和Java世界的Ant有很多相似的地方。

Rake任务编写完全使用Ruby语句,例如puts是Ruby中进行输出的一般性方法。

用文本编辑器创建一个名叫makefile的文件,因为Rake会在当前路径下寻找名叫Rakefile、makefile、RakeFile.rb或rakefile.rb文件,

#default,指定默认的任务。
task :default => [:task1]

http://blog.csdn.net/smilewater/article/details/1683808

Ubuntu中安装FFmpeg 3.2.4 “Hypatia”

sudo add-apt-repository ppa:djcj/hybrid
sudo apt-get update
sudo apt-get install ffmpeg

卸载 ffmpeg 命令:
sudo apt-get remove ffmpeg

http://www.linuxidc.com/Linux/2017-03/141793.htm

ffmpeg的封装

fluent-ffmpeg:封装ffmpeg的api的node模块
http://blog.leanote.com/post/visgee/%E7%94%A8ffmpeg%E8%BF%9B%E8%A1%8C%E7%9B%B4%E6%92%AD%E6%8E%A8%E6%B5%81
xuggle是对ffmepg的封装,是一套基于ffmpeg的开发库

采集rtsp流摄像头到浏览器实时播放方案

Unicode

ASCII字符集

ASCII字符集表示了128个字符。编码从0到127,0x7f,0111111。例如字符A的表示法有:’A’,’\0101’,’\0x41’。
计算机使用一个字节存储表示字符的数字。可以用转义的八进制或十六进制的数字代码来表示单个字符。
常用的字符及其编码:
字符‘0’的十进制数字码是48,字符‘A’的十进制数字码是65,字符‘a’的十进制数字码是97,

Unicode字符集

Unicode 字符集是一种对字符编码的标准规范,它给地球上所有的每个字符一个唯一的编号,它只给字符作编号,指定了字符对应的数字,仅此而已,它并不负责这个字符在计算机里的编码方式。Unicode字符是怎样被编码成内存中的字节这是下一段话题,它是被UTF(Unicode Transformation Formats)定义的。

UTF

UTF :Unicode Transformation Formats,统一字符集传输编码
编码的核心是定义:字节是怎么分组来和每个Unicode对应的, 这也被称作编码单元。

UTF8编码

最流行的Unicode编码方案是UTF-8。但unicode编码这个称呼默认是指UTF-16编码。
UTF-8中,0-127号的字符用1个字节来表示,使用和US-ASCII相同的编码。128号及以上的字符用2个,3个或者4个字节来表示。因此,UTF-8被称作可变长度编码。

Unicode 的平面空间

Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF。每个平面有 65536 个码点。
平面0(「Basic Multilingual Plane」,即「BMP」)有 65536 个码点,即 0x0000 至 0xFFFF。

  • BMP 的字符是 Unicode 中最基础和最常用的一部分,以 UTF-16 编码时使用2字节,以 UTF-8 编码时使用1至3字节。
  • 超出 BMP 的字符以 UTF-16 或 UTF-8 编码都需要4字节。
  • 另外还有一个比较少用的编码形式,UTF-32,它编码任何 Unicode 字符都需要4个字节。

Unicode编码是其它一些编码之间转换的桥接编码

GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换。
如果UNICODE字符由2个字节表示,则编码成UTF-8可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能很少会遇到的。Unicode字符集现在有超过10万个字符,其BMP部分也有六万多个字符;而GBK字符集只有两万以前多个字符。这样的话,从 支持unicode字符集或者unicode字符集BMP的编码方式,转化到GBK编码的时候,就会有编码落到GBK字符集以外,不能转化成GBK编码。 在java中,转换之后的字符串,这部分字符都变成了’?’。处理方法,就是在字符串以GBK编码写出之前,把这些字符替换掉:str = str.replace(‘/u00A0’, ‘ ‘);彻底而保险的方法是过滤所有GBK不能表示的字符:str = str.replaceAll(“[^/u4E00-/u9FA5/u3000-/u303F/uFF00-/uFFEF/u0000-/u007F/u201c-/u201d]”, ” “);

UTF8

UTF8中文编码,每个字符可能对应2个字节或3个字节的,每一个字节的最高位都是 1。利用这个特点可以简单快速的判断UTF8字符串里是否有中文。ASCII的UTF8编码和ASCII一样只占用一个字节,最高位是0(这里不包括扩展ASCII)。

BOM

BOM:Byte Order Mark。

BOM的本意是在utf16中用来表示高低字节序列的,在UTF-16里是FF FE,UTF-16以两个字节为编码单元在字节流之前有BOM表示采用低字节序列(低字节在前面)。UTF-8以字节为编码单元,没有字节序的问题,所以有无BOM都可以。

在utf-8文件中常用BOM来表明这个文件是UTF-8文件,在UTF-8里是BOM是EF BB BF。这个标记是可选的,它被用来检测一个字节流是不是UTF-8编码的。微软做这种检测,但有些软件不做这种检测,而把它当作正常字符处理。
微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记。

一个UTF-8文件可能有BOM,也可能没有BOM,有三种方法区分:

  • 用UltraEdit-32打开文件,切换到十六进制编辑模式,察看文件头部是否有EF BB BF。
  • 用Dreamweaver打开,察看页面属性,看“包括Unicode签名BOM”前面是否有个勾。
  • 用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。

 

快速判断UTF8字符串中是否有中文(C编程实现)
http://snailwarrior.blog.51cto.com/680306/153860
对UTF8编码方式字数做统计的函数
http://blog.csdn.net/chrisniu1984/article/details/7359908
http://msdn.microsoft.com/zh-cn/goglobal/bb688113.aspx
汉字和其gbk,unicode编码互查,查汉字时输入gbk编码的10进制数。
http://www.mytju.com/classcode/tools/encode_gb2312.asp
查询汉字的uncode,utf-8,gb2312的编码,但不能查询空格
http://www.2fz1.com/so/
3753个常用汉字的UTF-8编码大全
http://www.cr173.com/html/11686_all.html
也可以尝试用这个站查询,也不能查空格
http://www.fileformat.info/info/unicode/char/3000/index.htm

C++11

C++11简介

C++11标准,原名C++0x。为目前C++编程语言的最新正式标准(ISO/IEC 14882:2011)。它将取代第二版标准ISO/IEC 14882:2003(第一版ISO/IEC 14882:1998公开于1998年,第二版于2003年更新,分别通称C++98以及C++03,两者差异很小)。

C++11包含了核心语言的新机 能,并且拓展C++标准程序库,并且加入了大部分的C++ Technical Report 1程序库(数学上的特殊函数除外)。C++ 标准委员会计划在2010年8月之前完成对最终委员会草案的投票,以及于2011年3月3召开的标准会议完成国际标准的最终草案。最终于2011年8月 12日公布,并于2011年9月出版。2012年2月28日的国际标准草案(N3376)是最接近于现行标准的草案(编辑上的修正)。此次标准为13年第 一次重大修正。

ISO将在2014、2017年发布C++的后续版本。

auto

auto在C++ 98中的标识自动变量,由于使用极少,C++11中已废弃这个语义。
C++11中的auto主要有两种用途:自动类型推断和返回值占位。
自动类型推断用于从初始化表达式中推断出变量的数据类型。

空格

no-break space
不换行空格是一个空格字符,用途是禁止自动换行,禁止合并空白字符。
HTML页面显示时会自动合并多个连续的空白字符(whitespace character),但该字符是禁止合并的,因此该字符也称作“硬空格”(hard space、fixed space)。
Unicode编码为:U+00A0,utf8编码为 0xC2 0xA0

全角空格
utf-8编码是0xe38080,gbk编码是0xa1a1。

一些编码查询链接
汉字和其gbk,unicode编码互查,查汉字时输入gbk编码的10进制数。
http://www.mytju.com/classcode/tools/encode_gb2312.asp

查询汉字的uncode,utf-8,gb2312的编码,但不能查询空格
http://www.2fz1.com/so/
3753个常用汉字的UTF-8编码大全
http://www.cr173.com/html/11686_all.html

也可以尝试用这个站查询,也不能查空格
http://www.fileformat.info/info/unicode/char/3000/index.htm
http://www.fileformat.info/info/unicode/char/A0/index.htm
http://www.fileformat.info/info/unicode/char/20/index.htm

虚函数

1.虚拟析构函数
虚析构函数的目的是,当删除基类指针时,能够不仅调用基类的析构函数,也要调用派生类的析构函数。
如果析构函数不是虚拟的,将只调用对应指针的类型的析构函数。
如果析构函数是虚拟的,将调用相应对象类型的析构函数,然后会自动调用基类的析构函数。
这和其它虚函数的基于动态联编的道理是一样的。

2.在隐式类型转换下,c++不允许将一种类型的地址赋给另一种类型的指针,也不允许将一种类型的引用指向另一种类型。
指向基类的引用或指针可以隐式引用派生类对象,这称为向上强制转换,upcasting。这需要动态联编,c++使用virtual函数来标识这种动态联编需求。编译器会对虚方法使用动态联编。

3.指导原则
c++设置静态联编为默认选择,即不要为不使用的特性付出代价。
在基类中的非虚函数也表明不要重新定义该函数。
只把需要在派生类中重新定义的方法设置为虚函数。
使用虚函数时有内存和执行速度的开销。
构造函数不能是虚函数。
只有成员函数才能是虚拟的,友元函数不能是虚函数,友元不是类成员,

4.编译器处理虚函数的方法
给每个对象添加了一个隐藏的虚函数表的指针,函数表是一个数组,它保存了对象中的虚函数的地址。
调用虚函数时,由虚函数表来决定调用基类还是派生类中的函数版本。

5.纯虚函数
c++甚至允许纯虚函数有定义。对这句话的理解是纯虚函数只表明所属的类是抽象类,不能实例化,但并不影响纯虚函数有定义。

数组

变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。

用指针p指向new动态分配的长度为len*sizeof(int)的内存空间

int *p=new int[len]; 
delete[] p;

不能这样做,C++编译器会报len的大小不能确定,因为用这种形式声明数组,数组的大小需要在编译时确定

 int p[len];

这样也不行,编译器不能把int*型转化为int[]型,因为用new开辟了一段内存空间后会返回这段内存的首地址,所以要把这个地址赋给一个指针

 int p[]=new int[len];