值得推荐的C/C++框架和库

2016年3月2日
Comments Off on 值得推荐的C/C++框架和库

【本文系外部转贴,原文地址:http://coolshell.info/c/c++/2014/12/13/c-open-project.htm】留作存档 值得学习的C语言开源项目 – 1. Webbench Webbench 是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以 模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。 下载链接:http://home.tiscali.cz/~cz210552/webbench.html – 2. Tinyhttpd tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Http Server 的本质。 下载链接:http://sourceforge.net/projects/tinyhttpd/ – 3. cJSON cJSON是C语言中的一个JSON编解码器,非常轻量级,C文件只有500多行,速度也非常理想。 cJSON也存在几个弱点,虽然功能不是非常强大,但cJSON的小身板和速度是最值得赞赏的。其代码被非常好地维护着,结构也简单易懂,可以作为一个非常好的C语言项目进行学习。 项目主页:http://sourceforge.net/projects/cjson/ – 4. CMockery cmockery是google发布的用于C单元测试的一个轻量级的框架。它很小巧,对其他开源包没有依赖,对被测试代码侵入性小。cmockery的源代码行数不到3K,你阅读一下will_return和mock的源代码就一目了然了。 主要特点: 免费且开源,google提供技术支持; 轻量级的框架,使测试更加快速简单; 避免使用复杂的编译器特性,对老版本的编译器来讲,兼容性好; 并不强制要求待测代码必须依赖C99标准,这一特性对许多嵌入式系统的开发很有用 下载链接:http://code.google.com/p/cmockery/downloads/list – 5. Libev libev 是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施。其以高效出名,它可以将IO事件,定时器,和信号统一起来,统一放在事件处 理这一套框架下处理。基于Reactor模式,效率较高,并且代码精简(4.15版本8000多行),是学习事件驱动编程的很好的资源。 下载链接:http://software.schmorp.de/pkg/libev.html – 6. Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态数据库 驱动网站的速度。Memcached 基于一个存储键/值对的 hashmap。Memcached-1.4.7的代码量还是可以接受的,只有10K行左右。 下载地址:http://memcached.org/ – 7. Lua Lua很棒,Lua是巴西人发明的,这些都令我不爽,但是还不至于脸红,最多眼红。 […]

Comments Off on 值得推荐的C/C++框架和库 | 阅读全文 »

IT技术

Windows下搭建SVN服务器,轻松搞定

2014年7月23日
Comments Off on Windows下搭建SVN服务器,轻松搞定

SVN客户端使用的时候,用的SVN服务器通常为外部,例如Google Code的服务器,不过,做为一个程序开发人员,就算自己一个人写程序,也应该有一个SVN版本控制系统,以便对开发代码进行有效的管理。这里我就介绍一个在Windows环境下简单快速搭建SVN服务器的方法。 通常的SVN服务器是搭建在Linux等系统下,例如用Apache+SVN配置,Linux下的SVN性能会非常好,但配置有些繁琐,如果SVN服务器只有自己使用,那么可以直接把SVN服务器搭建在个人Windows环境下使用。 目前较为简单的方案是VisualSVN Server。该SVN服务器是免费的,支持Windows NT, 2000, XP and 2003等环境,安装非常简单。 安装的时候可以选择SVN走http协议还是https协议,http协议速度快一些,而https协议安全性好。两者均可以从浏览器直接访问SVN项目。 安装完成后打开,可以看到一个微软的MMS管理界面,在里面可以轻松添加设置项目。用户权限可以使用Windows的用户,也可以单独新建用户。如果原先有一个SVN数据,则可以在界面上导入原有的SVN数据。 SVN客户端依旧推荐使用Windows下的TortoiseSVN,两者搭配起来,非常好用。

Comments Off on Windows下搭建SVN服务器,轻松搞定 | 阅读全文 »

使用工具 ,

实现自己的http server

2014年2月15日
Comments Off on 实现自己的http server

实现自己的http server Write your own http server author : Kevin Lynx Why write your own?     看这个问题的人证明你知道什么是http server,世界上有很多各种规模的http server,为什么要自己实现一个?其实没什么 理由。我自己问自己,感觉就是在自己娱乐自己,或者说只是练习下网络编程,或者是因为某日我看到某个库宣称自己附带一个小 型的http server时,我不知道是什么东西,于是就想自己去实现一个。 What’s httpd ?     httpd就是http daemon,这个是类unix系统上的名称,也就是http server。httpd遵循HTTP协议,响应HTTP客户端的request, 然后返回response。     那么,什么是HTTP协议?最简单的例子,就是你的浏览器与网页服务器之间使用的应用层协议。虽然官方文档说HTTP协议可以 建立在任何可靠传输的协议之上,但是就我们所见到的,HTTP还是建立在TCP之上的。     httpd最简单的response是返回静态的HTML页面。在这里我们的目标也只是一个响应静态网页的httpd而已(也许你愿意加入CGI 特性)。 More details about HTTP protocol     在这里有必要讲解HTTP协议的更多细节,因为我们的httpd就是要去解析这个协议。     关于HTTP协议的详细文档,可以参看rfc2616。但事实上对于实现一个简单的响应静态网页的httpd来说,完全没必要读这么一 分冗长的文档。在这里我推荐<HTTP Made Really Easy>,以下内容基本取自于本文档。 – HTTP协议结构   HTTP协议无论是请求报文(request message)还是回应报文(response message)都分为四部分: […]

Comments Off on 实现自己的http server | 阅读全文 »

互联网技术 , ,

构建嵌入式Linux + web+sqlite +php5.0 平台

2014年1月16日
Comments Off on 构建嵌入式Linux + web+sqlite +php5.0 平台

Web和数据库技术在嵌入式技术中得到越来越广泛的应用,本专题我们来研究如何构建一个嵌入式Linux +web +php+sqlite 平台。 一、 工作软件平台配置 桌面Linux版本: Ubuntu10.04 – LTS 交叉编译器版本: arm-linux-gcc 4.4.3 设置好系统移植编译相关的环境变量,后面编译时用的到,设置方法如下: #gedit /root/.bashrc  , 在.bashrc 增加如下内容: export CC=arm-linux-gcc export AR=arm-linux-ar export LD=arm-linux-ld export RANLIB=arm-linux-ranlib export STRIP=arm-linux-strip export CC_FOR_BUILD=gcc 保存关闭,gedit ,重新打开命令行终端。 二、移植PHP5 1. 移植zlib库和libxml2库 由于php5需要zlib库和libxml2库的支持,我们首先交叉编译编译zlib库和libxml2库。 1.1    移植zlib库 解压软件包 zlib-1.2.3.tar.bz2 到 zlib-1.2.3目录; 进入到zlib-1.2.3目录,执行 ./configure –shared –prefix=/home/zlibarm 配置 zlib 库; 执行make命令编译 zlib库 执行make install 安装编译好的库 […]

Comments Off on 构建嵌入式Linux + web+sqlite +php5.0 平台 | 阅读全文 »

IT技术, php , , ,

MOV及MP4文件格式中几个重要的Table

2013年12月17日
Comments Off on MOV及MP4文件格式中几个重要的Table

MP4,全称是MPEG4 Part 14,是一种使用MPEG-4的多媒体文件格式,扩展名为.mp4。 MOV,是QuickTime影片格式,它是Apple公司开发的一种音频、视频文件格式,用于存储常用数字媒体类型。其扩展名为.mov。 在MOV和MP4文件格式中包括几个重要的Table,对应的atoms分别为:stts、ctts、stss、stsc、stsz以及stco/co64。 1、Sample时间表stts stts:Time-To-Sample Atoms,存储了媒体sample的时常信息,提供了时间和相关sample之间的映射关系。该atom包含了一个表,关于time和sample号之间的索引关系。表的每个entry给出了具有相同时间间隔的连续的sample的个数和这些sample的时间间隔值。将这些时间间隔相加在一起,就可以得到一个完整的time与sample之间的映射。将所有的时间间隔相加在一起,就可以得到该track的时间总长。 每个sample的显示时间可以通过如下的公式得到: D(n+1) = D(n) + STTS(n) 其中,STTS(n)是sample n的时间间隔,包含在表格中;D(n)是sample n的显示时间。 Time-To-Sample的table entry布局如图1-1所示: 图1-1 Time-To-Sample的table entry布局 Table entries根据每个sample在媒体流中的顺序和时长对他们进行描述。如果连续的samples有相同的时长,他们会被放在同一个table entry中。特别的,如果所有的sample具有相同的时长,那么table中就只有一个entry。 一个简单的例子如图1-2所示。这个媒体流包括9个samples,通过3个entries来描述。需要说明的一点是,这里的entry和 chunk不是对应的。比如,sample 4、5和6在同一个chunk中,但是,由于他们的时长不一样,sample 4的时长为3,而sample 5和6的时长为1,因此,通过不同的entry来描述。 图1-2 关于Time-To-Sample的一个简单例子 2、时间合成偏移表ctts ctts:Composition Offset Atom。每一个视频sample都有一个解码顺序和一个显示顺序。对于一个sample来说,解码顺序和显示顺序可能不一致,比如H.264格式,因此,Composition Offset Atom就是在这种情况下被使用的。 (1)如果解码顺序和显示顺序是一致的,Composition Offset Atom就不会出现。Time-To-Sample Atoms既提供了解码顺序也提供了显示顺序,并能够计算出每个sample的开始时间和结束时间。 (2)如果解码顺序和显示顺序不一致,那么Time-To-Sample Atoms既提供解码顺序,Composition Offset Atom则通过差值的形式来提供显示时间。 Composition Offset Atom提供了一个从解码时间到显示时间的sample一对一的映射,具有如下的映射关系: CT(n) = DT(n) + CTTS(n) 其中,CTTS(n)是sample […]

Comments Off on MOV及MP4文件格式中几个重要的Table | 阅读全文 »

IT技术 , , , ,

mp4 格式 解析

2013年12月17日
Comments Off on mp4 格式 解析

感谢新浪播客可下人间! 转载地址:http://blog.sina.com.cn/s/blog_48f93b530100jz4b.html 目前MP4的概念被炒得很火,也很乱。最开始MP4指的是音频(MP3的升级版),即MPEG-2 AAC标准。随后MP4概念被转移到视频上,对应的是MPEG-4标准。而现在我们流行的叫法,多半是指能播放MPEG-4标准编码格式视频的播放器。但是这篇文章介绍的内容跟上面这些都无关,我们要讨论的是MP4文件封装格式,对应的标准为ISO/IEC 14496-12,即信息技术 视听对象编码的第12部分:ISO 基本媒体文件格式(Information technology Coding of audio-visual objects Part 12: ISO base media file format)。ISO/IEC组织指定的标准一般用数字表示,ISO/IEC 14496即MPEG-4标准。 MP4视频文件封装格式是基于QuickTime容器格式定义的,因此参考QuickTime的格式定义对理解MP4文件格式很有帮助。MP4文件格式是一个十分开放的容器,几乎可以用来描述所有的媒体结构,MP4文件中的媒体描述与媒体数据是分开的,并且媒体数据的组织也很自由,不一定要按照时间顺序排列,甚至媒体数据可以直接引用其他文件。同时,MP4也支持流媒体。MP4目前被广泛用于封装h.264视频和AAC音频,是高清视频的代表。 现在我们就来看看MP4文件格式到底是什么样的。 1、概述 MP4文件中的所有数据都装在box(QuickTime中为atom)中,也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将 box理解为一个数据对象块。box中可以包含另一个box,这种box称为container box。一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息;之后会有且只有一个“moov”类型的box(Movie Box),它是一种container box,子box包含了媒体的metadata信息;MP4文件的媒体数据包含在“mdat”类型的box(Midia Data Box)中,该类型的box也是container box,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述。 下面是一些概念: track  表示一些sample的集合,对于媒体数据来说,track表示一个视频或音频序列。 hint track  这个特殊的track并不包含媒体数据,而是包含了一些将其他数据track打包成流媒体的指示信息。 sample  对于非hint track来说,video sample即为一帧视频,或一组连续视频帧,audio sample即为一段连续的压缩音频,它们统称sample。对于hint track,sample定义一个或多个流媒体包的格式。 sample table  指明sampe时序和物理布局的表。 chunk 一个track的几个sample组成的单元。 在本文中,我们不讨论涉及hint的内容,只关注包含媒体数据的本地MP4文件。下图为一个典型的MP4文件的结构树。 2、Box 首先需要说明的是,box中的字节序为网络字节序,也就是大端字节序(Big-Endian),简单的说,就是一个32位的4字节整数存储方式为高位字节在内存的低端。Box由header和body组成,其中header统一指明box的大小和类型,body根据类型有不同的意义和格式。 标准的box开头的4个字节(32位)为box size,该大小包括box header和box body整个box的大小,这样我们就可以在文件中定位各个box。如果size为1,则表示这个box的大小为large […]

Comments Off on mp4 格式 解析 | 阅读全文 »

IT技术 , ,

使用mp4v2将H264+AAC合成mp4文件

2013年8月14日
Comments Off on 使用mp4v2将H264+AAC合成mp4文件

摘自:http://www.cnblogs.com/chutianyao/archive/2012/04/13/2446140.html 录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流; (2)将H264视频和AAC音频以某种格式封装,最后存成文件,供用户查看。 第一步已经有部分代码可供参考,因此很快就完成了。 第二步,我们决定封装成mp4,查找了一些资料后,决定使用开源库mp4v2来合成mp4文件。 技术路线已确定,就开工干活。 (一)mp4格式的基础知识。 关于mp4格式,网上介绍的不少,有以下内容可供参考: (1)两个ISO标准: [ISO/IEC 14496-12]:ISO base media file format –”is a general format forming the basis for a number of other more specific file formats. This format contains the timing, structure, and media information for timed sequences of media data, such as audio-visual presentations ” [ISO/IEC 14496-14]:MP4 file […]

Comments Off on 使用mp4v2将H264+AAC合成mp4文件 | 阅读全文 »

IT技术 , , ,

AAC ADTS格式分析

2013年8月14日
Comments Off on AAC ADTS格式分析

摘自http://blog.csdn.net/bsplover/article/details/7426476 1.ADTS是个啥 ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式。 记得第一次做demux的时候,把AAC音频的ES流从FLV封装格式中抽出来送给硬件解码器时,不能播;保存到本地用pc的播放器播时,我靠也不能播。当时崩溃了,后来通过查找资料才知道。一般的AAC解码器都需要把AAC的ES流打包成ADTS的格式,一般是在AAC ES流前添加7个字节的ADTS header。也就是说你可以吧ADTS这个头看作是AAC的frameheader。 ADTS AAC ADTS_header AAC ES ADTS_header AAC ES … ADTS_header AAC ES 2.ADTS内容及结构 ADTS 头中相对有用的信息 采样率、声道数、帧长度。想想也是,我要是解码器的话,你给我一堆得AAC音频ES流我也解不出来。每一个带ADTS头信息的AAC流会清晰的告送解码器他需要的这些信息。 一般情况下ADTS的头信息都是7个字节,分为2部分: adts_fixed_header(); adts_variable_header(); syncword :同步头 总是0xFFF, all bits must be 1,代表着一个ADTS帧的开始 ID:MPEG Version: 0 for MPEG-4, 1 for MPEG-2 Layer:always: ’00’ profile:表示使用哪个级别的AAC,有些芯片只支持AAC LC 。在MPEG-2 AAC中定义了3种: sampling_frequency_index:表示使用的采样率下标,通过这个下标在 Sampling Frequencies[ ]数组中查找得知采样率的值。 There […]

Comments Off on AAC ADTS格式分析 | 阅读全文 »

IT技术 , ,

基于liveMedia的RTSP/RTP编程

2012年4月23日
Comments Off on 基于liveMedia的RTSP/RTP编程

  liveMedia项目的源代码包括四个基本的库,各种测试代码以及IVE555 Media Server。 四个基本的库分别是UsageEnvironment&TaskScheduler,groupsock,liveMedia,BasicUsageEnvironment。 UsageEnvironment 和TaskScheduler类用于事件的调度,实现异步读取事件的句柄的设置以及错误信息的输出。另外,还有一个HashTable类定义了一个通用的 hash表,其它代码要用到这个表。这些都是抽象类,在应用程序中基于这些类实现自己的子类。 groupsock类是对网络接口的封装,用于收发数据包。正如名字本身,Groupsock主要是面向多播数据的收发的,它也同时支持单播数据的收发。Groupsock定义了两个构造函数     Groupsock(UsageEnvironment& env, struct in_addr const& groupAddr,               Port port, u_int8_t ttl);     Groupsock(UsageEnvironment& env, struct in_addr const& groupAddr,               struct in_addr const& sourceFilterAddr,               Port port); 前 者是用于SIM(source-independent multicast)组,后者用于SSM(source-specific multicast)组。groupsock库中的Helper例程提供了读写socket等函数,并且屏蔽了不同的操作系统之间的区别,这是在 GroupsockHelper.cpp文件中实现的。 liveMedia库中有一系列类,基类是Medium,这些类针对不同的流媒体类型和编码。 各种测试代码在testProgram目录下,比如openRTSP等,这些代码有助于理解liveMedia的应用。 LIVE555 Media Server是一个纯粹的RTSP服务器。支持多种格式的媒体文件:       * TS流文件,扩展名ts。       * PS流文件,扩展名mpg。       * MPEG-4视频基本流文件,扩展名m4e。 […]

Comments Off on 基于liveMedia的RTSP/RTP编程 | 阅读全文 »

IT技术 , , , ,

cc、gcc、g++、CC的区别概括

2012年4月10日
Comments Off on cc、gcc、g++、CC的区别概括

      gcc是C编译器;g++是C++编译器;linux下cc一般是一个符号连接,指向gcc;gcc和g++都是GUN(组织)的编译器。而CC则一般是makefile里面的一个名字,即宏定义,嘿,因为Linux/Unix都是大小写敏感的系统,这点一定要注意。 cc是Unix系统的C Compiler,而gcc则是GNU Compiler Collection,GNU编译器套装。gcc原名为Gun C语言编译器,因为它原本只能处理C语言,但gcc很快地扩展,包含很多编译器(C、C++、Objective-C、Ada、Fortran、Java)。因此,它们是不一样的,一个是古老的C编译器,一个是GNU编译器集合,gcc里面的C编译器比cc强大多了,因此没必要用cc。 下载不到cc的原因在于:cc来自于昂贵的Unix系统,cc是商业软件。 Linux下的cc是gcc符号连接,可以通过$ls –l /usr/bin/cc来简单察看,该变量是make程序的内建变量,默认指向gcc。cc符号链接和变量存在的意义在于源码的移植性,可以方便的用gcc来编译老的用cc编译的Unix软件,甚至连makefile都不用改在,而且也便于Linux程序在Unix下编译。   误区一:gcc只能编译C代码,g++只能编译C++代码。 两者都可以,但请注意: (1)后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是C++程序,注意,虽然C++是C的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。 (2)编译阶段,g++会调用gcc,对于C++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。   误区二:gcc不会定义__cplusplus宏,而g++会 实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。   误区三:编译只能用gcc,链接只能用g++ 严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。   C++的编译器肯定可以编译C的代码,注意除了C++对C的语法扩充之外,编译和链接C和C++的标准库通常也不一样呢,用gcc而非g++也编译了C++的程序就证明了这一点。   注:符号链接是一种特殊类型的文件,它的内容只是一个字符串。它可能指向一个存在的文件也可能什么都不指向。当您在命令行或程序里提到符号链接的时候,您实际上进入了它指向的文件,前提是这个文件是存在的。

Comments Off on cc、gcc、g++、CC的区别概括 | 阅读全文 »

IT技术 , , ,

IP实时传输协议RTP/RTCP详解

2012年3月20日
Comments Off on IP实时传输协议RTP/RTCP详解

IP实时传输协议RTP/RTCP详解 1、简介 目前,在IP网络中实现实时语音、视频通信和应用已经成为网络应用的一个主流技术和发展方向,本文详细介绍IP协议族中用于实时语音、视频数据传输的标准协议RTP( Real-time Transport Protocol)和RTCP(RTP Control Ptotocol)的主要功能。 2、RTP/RTCP协议简介       RTP 由 IETF(www.ietf.org)定义在 RFC 3550和3551中。       RTP被定义为传输音频、视频、模拟数据等实时数据的传输协议,与传统的注重的高可靠的数据传输的运输层协议相比,它更加侧重的数据传输的实时性,此协议提供的服务包括数据顺序号、时间标记、传输控制等。       RTP通常与辅助控制协议RTCP一起工作,RTP只负责实时数据的传输,RTCP负责对RTP的通信和会话进行带外管理(如流量控制、拥塞控制、会话源管理等)。 3、RTP/RTCP协议层次和封装       RTP位于传输层(通常是UDP)之上,应用程序之下,实时语音、视频数据经过模数转换和压缩编码处理后,先送给RTP封装成为RTP数据单元,RTP数据单元被封装为UDP数据报,然后再向下递交给IP封装为IP数据包。       RTP分组只包含RTP数据,而控制是由另一个配套协议RTCP提供。RTP在端口号1025到65535之间选择一个未使用的偶数UDP端口号,而在同一次会话中的RTCP则使用下一个奇数UDP端口号。       RTP通常和RTCP一起工作,在RTP会话期间,各参与者周期的发送RTCP消息。RTCP消息含有已发送数据的丢包统计和网络拥塞等信息,服务器可以利用这些信息动态的改变传输速率,甚至改变净荷的类型。RTCP消息也被封装为UDP数据报进行传输。 4、RTP/RTCP协议头信息       version (V): 2 bits     标明RTP版本号。协议初始版本为0,RFC3550中规定的版本号为2。        padding (P): 1 bit     如果该位被设置,则在该packet末尾包含了额外的附加信息,附加信息的最后一个字节表示额外附加信息的长度(包含该字节本身)。该字段之所以存在是因为一些加密机制需要固定长度的数据块,或者为了在一个底层协议数据单元中传输多个RTP packets。       extension (X): 1 bit 如果该位被设置,则在固定的头部后存在一个扩展头部,格式定义在RFC3550 5.3.1节。       CSRC count (CC): 4 bits 在固定头部后存在多少个CSRC标记。       […]

Comments Off on IP实时传输协议RTP/RTCP详解 | 阅读全文 »

IT技术 , , , ,

RTMP 协议研究(转载)

2012年2月22日
Comments Off on RTMP 协议研究(转载)

原文地址:http://blog.csdn.net/chenyanxu/archive/2009/09/02/4511087.aspx 正文开始: RTMP 协议研究 1 协议研究概述    协议设计和分析一直都是在工作遇到,正好在这里总结一下,说到协议,在这个网络的时代,没有人可以离开它了。他存在我们生活中的任何角落,只不过我们平时,并没有注意到它的存在,可以这么说如果没有协议,我们生活和日常的工作生产都不能进行。如果仔细想想你生活中用到的所有东西,协议已经包含其中。那到底什么是协议呢?说的简单一点就是双方达成的共识,以便更好的交流,理论上协议是什么呢?如果学过《信号与系统》的人都知道有个简单的道理,就是信息在经过一个管道的符号集,到另一个符号集时信息不会丢失。     任何复杂的事物都有个最简单的本质,网络上的协议也是这样,有个最基本的本质。除去上下层的概念,协议就只剩下通信双方实体的规则。    一般的协议都包含最基本的协议头,不管是物理层、链路层、还是网络层,这个头就构成了协议的本质东西。通常协议头要包含以下最基本的三项信息: 双方实体的唯一标示,用来标示通信双方的实体。 类型描述或者是净核描述,标志净核的内容。 协议净核的长度,用来在萃取净核的内容应用。    其中,前两项是必须要有的,没有他们,通信双方的交互根本得不到保证,第三项在不太灵活的通信中可以去掉,而有第二项的类型推出。     协议的丰富性,有净核的多样性体现。    协议头除了以上的三项,还可以增加更多的信息(比如控制信息、时间信息等),取决于具体的应用。找到这些基本的东西,再去看协议的时候,能够更好的抓住协议的主体进行分析和设计了。 2 RTMP 协议概述    RTMP 协议是被 Flash 用于对象、视频、音频的传输。该协议建立在 TCP 协议或者轮询 HTTP 协议之上, RTMP 协议就像一个用来装数据包的容器,这些数据可以是 AMF 格式的数据,也可以是 FLV 中的视 / 音频数据。一个单一的连接可以通过不同的通道传输多路网络流,这些通道中的包都是按照固定大小的包传输的 . 3 RTMP 协议部分 3.1 协议头 struct RTMP_HEAD {       char cChannelid : 6;// […]

Comments Off on RTMP 协议研究(转载) | 阅读全文 »

IT技术 ,

windows下编译librtmp、rtmpdump(转载)

2012年2月22日
Comments Off on windows下编译librtmp、rtmpdump(转载)

原文网站:http://zhaostudy2.blog.163.com/blog/static/1353502052011182538414/     这段时间做实时视频的网页直播遇到了很多困难。     开始时,迫于项目时间的压力,觉得没有足够的时间学习和分析如何将实时视频发送到RTMP流媒体服务器作为实时流,只好使用最粗糙的做法是:先把获取到的实时视频以RTP包的形式 发送给本机,然后本机程序中调用ffmpeg将接收到的RTP包 以RTMP的形式转发到Red5,最后,从网页上获取播放列表,播放实时视频。     这种做法中存在很多问题:(1)多了一层rtp包到rtmp服务器的转发,浪费很多处理器的时间。(2)多了一层转发,系统稳定性很有问题。在视频流转发了一定时间后,ffmpeg会奇怪地停止转发,原因不明。(3)ffmpeg的视频流播放控制难以实现。在网页上停止播放和继续播放视频时,既要控制发送 RTP包,又要控制RTMP包,很麻烦。     后来,分析了一下ffmpeg的源代码,发现FFmpeg中对RTMP的支持部分就是使用了RTMPDump中的librtmp。于是,我就打算直接使用librtmp与Red5建立rtmp连接,将实时视频直接发到Red5。     最近过年,在家里闲着,就认真研究一下如何使用librtmp直接将实时视频发送到Red5。我们首先要做的就是编译出librtmp的动态库和静态库。     RTMPDump项目官方网站在:http://rtmpdump.mplayerhq.hu/ 。对RTMP协议的实现在其中librtmp中。这是一个匈牙利人在2009年,Adobe公司还没有公开RTMP协议的情况下对RTMP协议的实现得。 官方网站中只提供了程序源代码和动态链接库(dll),要在开发中方便地使用RTMPDump,还需要自己编译它的静态库(lib)。 ==> 编译librtmp静态库     从官方网站http://rtmpdump.mplayerhq.hu/ 下载RTMPDump源代码。     要编译librtmp,还需要另外3个库:zlib、OpenSSL、PolarSSL。     zlib是用于数据压缩的函数库,数据压缩效果比较好,早在1995年就发布了第一版,目前仅支持LZ77变种算法、DEFLATE算法。(http://www.zlib.net/)。     OpenSSL和PolarSSL 是对SSL(Security Socket Layer,加密套接字协议层)的实现。(http://www.openssl.org/ http://polarssl.org/)。     (1)使用VC++6.0新建一个静态库工程,命名为librtmp,如下图所示:      (2)把RTMPDump源代码目录下的librtmp目录下的所有文件 复制到工程目录librtmp\下,并在VC++6.0中的Source Files和Header Files文件夹中添加librtmp相应的文件,如下图所示:      (3)下载zlib开发包 http://download.csdn.net/source/3013660。把其中的zdll.lib、zlib.def、zlib.h、zconf.h放到新建的工程目录librtmp\下。      (4)下载openssl开发包 http://download.csdn.net/source/3013684。把其中的libeay32.lib、ssleay32.lib 及openssl文件夹 复制到工程目录librtmp\下,并在VC++6.0的“工具”->“选项”->“目录”-> “ Include files ”中添加当前的工程目录librtmp\。如下图所示:     (5) 下载PolarSSL源代码 […]

Comments Off on windows下编译librtmp、rtmpdump(转载) | 阅读全文 »

IT技术 , ,

RTMP协议详解(转)

2012年2月22日
Comments Off on RTMP协议详解(转)

Real Time Messaging Protocol(实时消息传送协议协议)是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议。 具体使用RTMP的AS代码大概如下: var videoInstance:Video = your_video_instance; var nc:NetConnection = new NetConnection(); var connected:Boolean = nc.connect("rtmp://localhost/myapp"); var ns:NetStream = new NetStream(nc); videoInstance.attachVideo(ns); ns.play("flvName"); Adobe也在官方网站已经提供了RTMP协议的官方文档说明,为什么要写这个系列文章最大的原因只是对前一段工作的一个总结和回顾,最近两个月,实现了一个RTMP Server的c++版本,把公司的流媒体服务和flash无缝对接起来。希望我的文字能给后来研究这个协议的同学有一定的帮助。 RTMP协议是一个基于TCP的高层协议族,当然这个玩意据说还有UDP协议版本的,不过现在还没有出来,好像Adobe下一版本的FMS会提供支持。下文将要描述的是TCP协议版本的协议。 RTMP协议的概要理解: RTMP协议是为了和flash之间交换信令以及媒体数据。为了提高使用效率信令和媒体数据都是使用相同的机制。因为是相同的机制Adobe就整出来了一些比较搞人的概念,当然每个协议第一次接触都是比较难理解的。 在RTMP协议中信令和媒体数据都称之为Message,在网络中传输这些Message,为了区分它们肯定是要加一个Message head的,所以RTMP协议也有一个Message head,还有一个问题因为RTMP协议是基于TCP的,由于TCP的包长度是有限制的(一般来说不超过1500个字节),而RTMP的Message长度是有可能很大的,像一个视频帧的包可能会有几十甚至几千K,这个问题就必然有一个分片的问题,在RTMP协议中对应的说法就是chunk,每一个Message + head都是由一个和多个chunk组成的。到这里对RTMP协议的概要理解就算完了。 RTMP的字节序:        RTMP的字节序和大多数网络协议一样是大端序,也有一些字段是小端序的,不过都有特殊的说明。 RTMP的head组成          RTMP的head在协议中的表现形式是chunk head,前面已经说到一个Message + head可以分成一个和多个chunk,为了区分这些chunk,肯定是需要一个chunk head的,具体的实现就把Message head的信息和chunk head的信息合并在一起以chunk head的形式表现。 一个完整的chunk的组成如下图所示 Chunk basic header: 该字段包含chunk的stream ID和 […]

Comments Off on RTMP协议详解(转) | 阅读全文 »

IT技术 , , ,

差分与单端(转载)

2012年2月21日
Comments Off on 差分与单端(转载)

一、基本区别 不说理论上的定义,说实际的 单端信号指的是用一个线传输的信号,一根线没参考点怎么会有信号呢? easy,参考点就是地啊。也就是说,单端信号是在一跟导线上传输的与地之间的电平差 那么当你把信号从A点传递到B点的时候,有一个前提就是A点和B点的地电势应该 差不多是一样的,为啥说差不多呢,后面再详细说。 差分信号指的是用两根线传输的信号,传输的是两根信号之间的电平差。 当你把信号从A点传递到B点的时候,A点和B点的地电势可以一样也可以不一样 但是A点和B点的地电势差有一个范围,超过这个范围就会出问题了。 二、传输上的差别 单端信号的优点是,省钱~方便~ 大部分的低频电平信号都是使用单端信号进行传输的。一个信号一根线,最后 把两边的地用一根线一连,完事。 缺点在不同应用领域暴露的不一样 归结起来,最主要的一个方面就是,抗干扰能力差。 首先说最大的一个问题,地电势差以及地一致性。 大家都认为地是0V,实际上,真正的应用中地是千奇百怪变化莫测的一个东西 我想我会专门写一些地方面的趣事。 比如A点到B点之间,有那么一根线,用来连接两个系统之间的地 那么如果这根线上的电流很大时,两点间的地电势可能就不可忽略了,这样一个信号 从A的角度看起来是1V,从B的角度看起来可能只有0.8V了,这可不是一个什么好事情 这就是地电势差对单端信号的影响。 接着说地一致性。实际上很多时候这个地上由于电流忽大忽小,布局结构远远近近 地上会产生一定的电压波动,这也会影响单端信号的质量。 差分信号在这一点有优势,由于两个信号都是相对于地的 当地电势发生变化时,两个信号同时上下浮动(当然是理想状态下) 差分两根线之间的电压差却很少发生变化,这样信号质量不久高了吗? 其次就是传输过程中的干扰,当一根导线穿过某个线圈时,且这根线圈上通着交流电 时,这根导线上会产生感应电动势~~好简单的道理,实际上工业现场遇到的大部分 问题就是这么简单,可是你无法抗拒~ 如果是单端信号,产生多少,就是多少,这就是噪声你毫无办法。 但是如果是差分信号,你就可以考虑拉,为啥呢,两根导线是平行传输的 每根导线上产生的感应电动势不是一样吗,两个一减,他不久没了吗~ 确实,同样的情况下,传输距离较长时,差分信号具有更强的驱动能力、更强的 抗干扰能力,同样的,当你传输的信号会对其他设备有干扰时,差分信号也比 单端信号产生的信号相对小,也就是常说的EMI特性(存疑,是这么说把?) 三、使用时需要注意di 由于差分比单端有不少好处,在模拟信号传输中很多人愿意使用差分信号 比如桥式应变片式力传感器,其输出信号满量程时有的也只有2mV 如果使用单端信号传输,那么这个信号只要电源的纹波就能把他吃光。 所以实际上,都是用仪表运方进行放大后,再进行处理。 而仪表运方正是处理差分信号最有力的几个工具之一。 但是,使用差分信号时,一定要注意一个问题,共模电压范围。 也就是说,这两根线上的电压,相对于系统的地,还是不能太大。 你传输0.1V的信号没问题,但是如果一根是 1000.0 另外一根是 1000.1,那就不好玩了 问题在于,在很多场合下使用差分信号都是为了不让两个系统的地简单的共在一起 更不能把差分信号中的一根直接接在本地系统的地上,那不白费尽吗–又成单端了 那么如何抑制共模电压呢? 其实也挺简单的,将两根线都通过一个足够大的电阻,连接到系统的地上。 这就像一根拴在风筝上的线,我在地上跑跑跳跳,不会影响风筝的高度 但是你永远逃不出我的视线,而我的视线,在电子行业,叫共模电压范围~~嘿嘿 最后,回答板上一个网友的问题 […]

Comments Off on 差分与单端(转载) | 阅读全文 »

IT技术 , ,

数字逻辑标准及接口技术

2012年2月21日
Comments Off on 数字逻辑标准及接口技术

我们知道,0和1是数字世界的两个基本元素,在数字电路中它们由特定范围的高低电平来表示。数字电路发展的早期,绝大多数数字器件都采用TTL和CMOS数字逻辑标准。近几年,产生了许多针对不同应用的低压、高速的数字逻辑标准,例如LVTTL、LVCMOS、LVDS、HSTL、SSTL、LVPECL等。 实际应用中共有二三十种数字逻辑信号标准,根据其物理连接特性不同,可以划分为单端逻辑信号、单端差分逻辑信号和差分逻辑信号三大类。在对它们详细介绍之前,我们首先了解一下数字逻辑信号的几个重要专业术语。      a. 门限电压(VTH )  –      -顾名思义,VTH为逻辑状态高或低转换的门限电压,在逻辑器件中,当信号电压高于VTH 为逻辑高,反之则为逻辑低,通常VTH为电源电压的1/2。  —  b. 输出高电平(VOH)和输出低电平(VOL)  —     确切地说VOH应该为逻辑器件输出高电平的下限,VOL为输出低电平的上限。通常在VOH和VOL之间有一个电压缓冲区,这样在实际电路中输出逻辑信号迭加噪声后,就不会导致对逻辑状态的错误判断。  —  c. 输入高电平(VIH)和输入低电平(VIL)  —     VIH为输入高电平的下限,VIL为输入低电平的上限。 在许多数字系统中,前一个逻辑器件的输出就是后一个逻辑器件的输入,所以必须满足VOH>VIH、VOL< VIL,否则就会出现逻辑状态判断错误。另外,它们之间的差值称为噪声容限,外部叠加的噪声应小于噪声容限,否则也会出现逻辑状态判断错误。 单端数字逻辑信号 —单端信号是两个逻辑器件互连最基本的方法,它只需要一条连线来实现逻辑信号传输。另外,它也可以实现单端发送、差分接收的连接方式,这时差分接收器的另外一个输入端提供参考接地电平,即图4中的VREF接地。-单端信号连接的数字逻辑标准主要有TTL、CMOS、LVTTL、LVCMOS、PCI等,它们的主要性能参数如表1所示。  —(1) 注意:信号的传输带宽是一个粗略的估算值,因为器件工艺、连线长度、PCB走线方式和应用环境都会对实际传输带宽造成影响。 单端差分逻辑信号 —单端差分信号指的是信号单端发送、差分接收的一种信号传输方式。差分接收器的两个输入端,一个接收信号,另一个提供参考电平VREF。VREF是用来设置接收器的门限电压,其大小通常为单端驱动器输出电压VDDO的1/2。相对单端信号,单端差分信号是通过降低传输信号的电平幅度,来加快晶体管的转换速度,从而提高传输带宽。  —图6为HSTL-I单端差分信号的实际参数和信号波形图,其中单端驱动器输出电压VDDO=1.5V;门限电压VTH = VREF=1/2 VDDO=0.75V;VIL= VREF – 0.1V 、VIH= VREF + 0.1V。  —除了HSTL-I单端差分逻辑标准外,另外一个常见的标准是美国Cypress的1.8V HSTL,也称eHSTL,其性能参数如表2所示。 差分逻辑信号 —如图7所示,差分信号是通过一对单端信号线进行传输,两条线上的信号相同,但相位相差为180°。  —从信号传输原理看,差分信号的电平幅度比单端差分信号更低;此外,如图8,差分信号接收端VDIFF=VOH-VOL,这样可以抵消实际传输过程中迭加在两个单端信号上的共模噪声,更好地保持了信号的完整性,降低了信号整体噪声, 从而实现更高的带宽。  —常见的差分逻辑信号标准有LVDS、SSTL、ECL、PECL等,它们的具体性能参数如表3所示。 应用 —可以说,任何一种新的数字逻辑信号标准的产生,都是实际应用需要驱动的结果,每一种标准都有各自的特点及应用环境。  —a. TTL、CMOS系列是应用最广泛的数字逻辑标准,被数字逻辑器件厂商普遍采用;  —b. 时钟驱动器件、SRAM、DDR SRAM 等存储器件基本都采用HSTL标准;  —d. SSTL系列是由IBM、Hitachi等公司发起的,主要用于PC内存模快上;  […]

Comments Off on 数字逻辑标准及接口技术 | 阅读全文 »

IT技术 , , , , , , , ,

Cadence Allegro PCB Design 16.3破解安装

2012年2月14日
Comments Off on Cadence Allegro PCB Design 16.3破解安装

在高速数字电路设计中,Cadence Allegro无疑是最常用的工具之一,但是如果要买正版,费用不是你我等能够承受得起的。作为个人或者学校学习用,安装一个破解版也是可行的。 一、下载安装包。 从网上搜做关键字“Cadence OrCad v16.3 SHooTERS”找到下载的网站并下载,文件大小为1.7GB左右,比如我是从这里http://www.verycd.com/topics/2795352/下载的,我的带宽是6兆,下载了4个小时,下载后的文件名是: [PCB设计].Cadence.OrCad.v16.3-SHooTERS.iso 二、破解安装。 主意:安装前先关闭防火墙和杀毒软件 1、安装虚拟光驱工具 把下载的ISO文件刻录到DVD光碟上,如果没有刻录机怎么办,那就从网上下载一个虚拟光驱软件Daemon Tools 3.47.0,比如我是从这里http://www.newhua.com/soft/3617.htm下载这个工具的,下载后的文件名daemon_tools_347cn.zip,双击它解压并安装,安装完后需要重启电脑。然后: 这样就在我的电脑里多了一个名叫Cadence的虚拟光盘。 2、开始安装。 进入我的电脑,双击Cadence光驱(我的虚拟光驱盘符是P)进入,再双击里面的setup.exe启动安装程序: 在上图中点击“License Manager”安装许可证管理工具,每一步都选择默认值即可,直到出现下面的画面: 这是点击取消(Cancel)按钮,然后出现下面的画面: 接下来点击Finish,完成License Manager的安装。 把安装光盘中的目录\SHooTERS\license_manager下的两个文件cdslmd.exe和orcad_163.lic拷贝到 License Manager的安装目录下(默认安装目录是C:\Cadence\LicenseManager)。拷贝时如果提示目标文件名已经存在,直接点击“是” (即覆盖)即可。 用记事本打开刚刚复制到LicenseManager目录中的orcad_163.lic文件,将第一行的“this_host”修改成自己的计算机名称(比如我的计算机名称是moodisk-home): 修改完后保存退出,然后把文件orcad_163.lic改名为license.lic。 主意:如果不知道自己电脑的计算机名称,那么进入命令窗口,输入命令hostname即可查看,如下图所示: 回到Cadence Allegro 安装界面,点击Product Installation,开始安装各种产品: 接下来的安装画面选择默认值即可,直到出现如下的安装画面,直接点击“Next”进入下一步: 本破解方法成功破解了所有的产品,所以到了选择安装什么产品的时候建议安装全部产品: 需要消耗磁盘空间3.47GB。什么?报磁盘空间不够,那我也救不了您了,反正我的电脑有两块500GB的硬盘,做成RAID 1,绰绰有余。 接下来的安装步骤没有什么特别的,一直Next下去,最后点击“Finish”按钮完成安装。 ……等等。 下面开始破解了。不过先别急,尽管您在上面的安装结尾点击了“Finsh”,但是实际上安装程序还要花很长的时间在后台做设置,直到安装程序退出了,才可开始破解。 复制安装光盘上的目录\SHooTERS下的文件orcad_163.exe到Cadence Allegro产品的安装根目录下(默认安装根目录是c:\Candence),如果您改变了安装目录,那么久拷贝到那个目录(安装根目录下一定存在子目录SPB_16.3)。拷贝完了双击orcad_163.exe文件运行它: 主意:最后出现的那个黑白窗口会停留数秒钟,如果机器速度慢,可能要几十秒钟,如果一出现马上就消失了,很可能不是您的机器速度太快,而且破解失败!! 完成上一步后,按照下图启动许可证服务器配置程序: 弹出如下画面: 点击“Browse…”按钮定位许可证文件license.lic(位于LicenseManager安装目录下,我们在前面的步骤中已经拷贝到那里,默认目录是C:\Cadence\LicenseManager): 此后一路“Next”,最后点击“Finish”完成破解。 主意:在后续步骤中可能会出现错误: Unable to start Cadence License Server with […]

Comments Off on Cadence Allegro PCB Design 16.3破解安装 | 阅读全文 »

IT技术 , , ,

纽扣电池型号对照表

2012年2月13日
Comments Off on 纽扣电池型号对照表

纽扣电池的型号通常是在纽扣电池的背面由字母和阿拉伯数字组成。瑞士的氧化银纽扣电池型号为3##,日本的型号通常是SR###SW,或 SR###W(#代表一个阿拉伯数字)。纽扣锂电池的型号通常为CR####。不同材料的纽扣电池,其型号规格也就不同。 各地的标准型号列举如下: 香港 国际 瑞士 日本 其他 电压 直径Ф*厚度(mm) 用途 AG0 LR69 379 SR521   1.5V 5.8*2.1   AG1 LR621 364 SR621 164 1.5V 6.8*2.1   AG2 LR726 396 SR726 196 1.5V 7.9*2.6   AG3 LR41 392 SR41 192 1.5V 7.9*3.6 迷你手电、体温计 AG4 LR626 377 SR626 177 1.5V 6.8*2.6   AG5 LR754 393 SR754 […]

Comments Off on 纽扣电池型号对照表 | 阅读全文 »

IT技术 ,

USB 2.0 A型、B型、Mini和Micro接口定义及封装

2012年2月3日
Comments Off on USB 2.0 A型、B型、Mini和Micro接口定义及封装

USB全称Universal Serial Bus(通用串行总线),目前USB 2.0接口分为四种类型A型、B型、Mini型还有后来补充的Micro型接口,每种接口都分插头和插座两个部分,Micro还有比较特殊的AB兼容型,本文简要介绍这四类插头和插座的实物及结构尺寸图,如果是做设计用途,还需要参考官方最新补充或修正说明,尽管USB 3.0性能非常卓越,但由于USB 3.0规范变化较大,真正应用起来还需假以时日,不管怎样,都已经把火线逼到末路,苹果公司极其郁闷但也爱莫能助。 注意: 1、本文封装尺寸来源,USB 2.0 Specification Engineering Change Notice(Date:10/20/2000) 2、本文图片来源USB官方协议文档,由于USB 3.0在接口和线缆规范上变化较大,后面专门介绍。 3、本文未带插头封装尺寸,插头尺寸请参加官方文档ecn1-usb20-miniB-revd.pdf,下个版本USB 3.0在接口和封装上都有很大变化,本文属于USB 2.0协议内容,如果是USB 3.0设备,似乎只有A型头才能插到2.0插座中Receptacle。 1、A型USB插头(plug)和A型USB插座(receptacle) 引脚顺序(左侧为Plug,右侧为Receptacle): 引脚定义: 编号 定义 颜色识别 1 VBUS Red(红色) 2 D- White(白色) 3 D+ Green(绿色) 4 GND Black(黑色) 封装尺寸(单PIN Receptacle): 2、B型USB插头(plug)和B型USB插座(receptacle) 引脚顺序(左侧为Plug,右侧为Receptacle,注意箭头所指斜口向上,USB端口朝向自己): 引脚定义、封装尺寸均与A型USB引脚说明相同。 封装尺寸(单PIN Receptacle): 3、Mini B型USB插头(plug)和Mini B型USB插座(receptacle) 引脚顺序(左侧为Plug,右侧为Receptacle,注意宽边在上,USB端口朝向自己): 引脚定义: 编号 定义 颜色识别 1 VBUS Red(红色) […]

Comments Off on USB 2.0 A型、B型、Mini和Micro接口定义及封装 | 阅读全文 »

IT技术 , , , , , ,

HDMI之CEC

2012年1月10日
Comments Off on HDMI之CEC

The bus, known as the consumer electronics control (CEC) bus, is the basis for a new level of automatic control in HDMI-interfaced systems. With the recent release of a CEC compliance test specification and commercial CEC test equipment, consumer electronic companies are now poised to implement CEC in their products. In fact, new CECenabled products […]

Comments Off on HDMI之CEC | 阅读全文 »

IT技术 ,