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流摄像头到浏览器实时播放方案

ubuntu 安装 FFmpeg

sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next
sudo apt-get update
sudo apt-get install ffmpeg

vector

查找

vector::iterator findit = find(v1_.begin(),v1_.end(),point);
if(findit!=v1_.end())
{
}

erase

std::vector vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
vec.erase(vec.begin() + 1);
 或
vec.erase(vec.begin() + 1, vec.begin() + 3);

C/C++获取时间戳

时间戳

秒级时间戳

time_t timestamp;
time(&timestamp);

毫秒级时间戳

clock_t timestamp=clock()*1000/CLOCKS_PER_SEC;

C/C++生成随机数

#include <stdlib.h>

srand((unsigned)time(0));
unsigned int index = rand();

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主要有两种用途:自动类型推断和返回值占位。
自动类型推断用于从初始化表达式中推断出变量的数据类型。

 

gcc/g++ 和 clang/clang++

gcc/g++ 和 clang/clang++ 都是 Linux 下常用的 C/C++ 编译器。gcc 是 GNU 亲儿子,Ubuntu 等常用发行版标配。clang 是后起之秀,配合 llvm,以优秀的前端闻名于世,现在是 Mac(XCode) 的默认编译器,微软等大公司都在往上靠,前景一片光明。
GCC:GNU Compiler Collection(GUN 编译器集合),可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。
gcc是GCC中的GUN C Compiler(C 编译器)
g++是GCC中的GUN C++ Compiler(C++编译器)

就本质而言,gcc和g++并不是编译器,也不是编译器的集合,它们只是一种驱动器,根据参数中要编译的文件的类型,调用对应的GUN编译器而已。更准确的说法是:gcc调用了C compiler,而g++调用了C++ compiler。

gcc和g++的主要区别:
1. 对于 *.c和*.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
2. 对于 *.c和*.cpp文件,g++则统一当做cpp文件编译
3. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL,在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++。
4. gcc在编译C文件时,可使用的预定义宏是比较少的
5. gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏。

空格

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];