﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Coding in Cocoa</title><link>http://www.cppblog.com/songhaifeng/</link><description>the way</description><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 22:55:45 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 22:55:45 GMT</pubDate><ttl>60</ttl><item><title>objc视频</title><link>http://www.cppblog.com/songhaifeng/archive/2012/12/03/195938.html</link><dc:creator>shf</dc:creator><author>shf</author><pubDate>Mon, 03 Dec 2012 13:37:00 GMT</pubDate><guid>http://www.cppblog.com/songhaifeng/archive/2012/12/03/195938.html</guid><wfw:comment>http://www.cppblog.com/songhaifeng/comments/195938.html</wfw:comment><comments>http://www.cppblog.com/songhaifeng/archive/2012/12/03/195938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/songhaifeng/comments/commentRss/195938.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/songhaifeng/services/trackbacks/195938.html</trackback:ping><description><![CDATA[http://v.youku.com/v_show/id_XMzM3NDczOTMy.html<img src ="http://www.cppblog.com/songhaifeng/aggbug/195938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/songhaifeng/" target="_blank">shf</a> 2012-12-03 21:37 <a href="http://www.cppblog.com/songhaifeng/archive/2012/12/03/195938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>curl 注意点</title><link>http://www.cppblog.com/songhaifeng/archive/2012/11/15/195212.html</link><dc:creator>shf</dc:creator><author>shf</author><pubDate>Wed, 14 Nov 2012 23:11:00 GMT</pubDate><guid>http://www.cppblog.com/songhaifeng/archive/2012/11/15/195212.html</guid><wfw:comment>http://www.cppblog.com/songhaifeng/comments/195212.html</wfw:comment><comments>http://www.cppblog.com/songhaifeng/archive/2012/11/15/195212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/songhaifeng/comments/commentRss/195212.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/songhaifeng/services/trackbacks/195212.html</trackback:ping><description><![CDATA[1.&nbsp; 在域名解析超时时崩溃，没有任何堆栈信息。原因是在多线程情况下，curl库遇到信号中断后，跳转到其他地址，丢失堆栈信息。<br />解决方法有两种： <br /><ul><li>在编译libcurl库时，增加--enable-threaded-resolver编译选项。</li></ul><ul><li>使用c-ares库来做域名解析，编译libcurl库时，通过--enable-ares[=PATH]选项来指定c-ares库的路径。</li></ul><p>c-ares库的网址：<a href="http://c-ares.haxx.se/">http://c-ares.haxx.se/</a><br /></p><img src ="http://www.cppblog.com/songhaifeng/aggbug/195212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/songhaifeng/" target="_blank">shf</a> 2012-11-15 07:11 <a href="http://www.cppblog.com/songhaifeng/archive/2012/11/15/195212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vlc介绍</title><link>http://www.cppblog.com/songhaifeng/archive/2012/05/19/175376.html</link><dc:creator>shf</dc:creator><author>shf</author><pubDate>Sat, 19 May 2012 04:11:00 GMT</pubDate><guid>http://www.cppblog.com/songhaifeng/archive/2012/05/19/175376.html</guid><wfw:comment>http://www.cppblog.com/songhaifeng/comments/175376.html</wfw:comment><comments>http://www.cppblog.com/songhaifeng/archive/2012/05/19/175376.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/songhaifeng/comments/commentRss/175376.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/songhaifeng/services/trackbacks/175376.html</trackback:ping><description><![CDATA[<div style="padding-bottom: 10px; line-height: 22px; padding-left: 20px; padding-right: 20px; font-size: 14px; padding-top: 10px;"> 一、简介<br /><a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>vlc</strong></a>的全名是Video Lan Client，是一个开源的、跨平台的<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>视频</strong></a>播放器。VLC支持大量的音视频传输、封装和编码格式，完整的功能特性列表可以在这里获得http://www.videolan.org/vlc/features.html，下面给出一个简要的不完整的列表：<br /> 操作系统：Windows、WinCE、Linux、MacOSX、BEOS、BSD<br /> 访问形式：文件、DVD/VCD/CD、http、ftp、mms、TCP、UDP、RTP、IP组播、IPv6、rtsp<br /> 编码格式：MPEG*、DIVX、WMV、MOV、3GP、FLV、H.263、H.264、FLAC<br /> 视频字幕：DVD、DVB、Text、Vobsub<br /> 视频输出：DirectX、X11、XVideo、SDL、FrameBuffer、ASCII<br /> 控制界面：WxWidgets、QT4、Web、Telnet、Command line<br /> 浏览器插件：ActiveX、Mozilla（firefox）<br /> 实际上为了更清晰一点，我们可以反过来说说VLC不支持哪些常见的。首先是RealVideo（Real的Audio部分支持），因为Real的 Video加码器存在版权的问题。实际上VLC  0.9.0已经加入了RealVideo的支持，但是需要额外的解码器（类似MPlayer）。另外，VLC不支持3GP的音频格式AMR。<br /><br /> VLC原先是几个法国的大学生做的项目，后来他们把VLC作为了一个开源的项目，吸引了来自世界各国的很多优秀程序员来共同编写和维护VLC，才逐渐变成了现在这个样子。<br /> 至于为什么叫VideoLan Client，是因为以前还有一个VideoLan  Server的项目（简称VLS），而目前VLS的功能已经合并到VLC中来，所以VLC不仅仅是一个视频播放器，它也可以作为小型的视频服务器，更可以 一边播放一边转码，把视频流发送到网络上。VLC最为突出的就是网络流的播放功能，例如MPEG2的UDP TS流的播放和转发，几乎是无可替代的。<br /> 对普通用户来说，VLC还有一个好处是不影响Windows中的解码器。VLC通常不影响也不依赖于系统中自带的解码器（除了realvideo和quicktime的类型），很绿色很环保；更不用担心流氓软件、广告插件之类的恶心的玩意儿。<br /> 从程序结构来看，VLC的可扩展性是相当优秀的。VLC绝大部分用高效的C代码来编写（少量的C++和汇编），但是实现了完全动态的模块化，所有功能包括 程序框架本身都是module，可以在运行时载入，这使得VLC可以轻易的扩展多种功能并且容易维护。它的架构有一点类似于DirectShow的技术。<br /> VLC也很注重版权方面的问题，你可以放心的自由的使用而不需要为版权的问题担心&#8212;&#8212;VLC只包括免费的、自由的库。VLC基于GPL，因此也可以用于商业应用，只需要保留GPL，以及公开源代码，如果你修改了VLC的话。<br /> 下面是VLC相关的一些链接<br /> VLC官方网站：http://www.videolan.org/<br /> VLC下载页面：http://www.videolan.org/vlc/<br /> VLC下载目录（源码和安装包）：http://download.videolan.org/pub/videolan/vlc/<br /> VLC Nightly Builds： http://nightlies.videolan.org/<br /> VLC<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>开发</strong></a>Wiki：http://wiki.videolan.org/Developers_Corner<br /> VLC Win32第三方库预编译包下载目录：http://download.videolan.org/pub/testing/win32/<br /> VLC 官方论坛：http://forum.videolan.org/<br /> VLC 邮件列表：http://www.videolan.org/developers/lists.html<br /><br /> 二、Windows平台编译<br /> 第一步，要创建编译VLC的环境。VLC在Windows下可以用Msys+MingW 或者Cygwin的方式来编译，二者大同小异，这里主要介绍Cygwin。<br /> Cygwin是一个在Windows下面模拟Linux环境的东西。它提供了很多库和应用程序，让你可以像在Linux上一样来使用Windows。你需 要在http://www.cygwin.com/  下载一个cygwin的安装程序setup.exe。然后选择一个cygwin的源来下载所需要的库，国内的话到  ftp://ftp.sjtu.edu.cn/cygwin/和 http://www.cygwin.cn/pub  相对来说会快一点。第一次安装，除了默认的库以外，我们还需要加入一些库来支持VLC的编译，包括<br /> Archive （目录）<br /> unzip<br /> zip<br /> Devel<br /> autoconf<br /> automake<br /> binutils<br /> cvs<br /> expat<br /> gcc<br /> gcc-core<br /> gcc-g++<br /> gcc-mingw<br /> gcc-mingw-core<br /> gcc-mingw-g++<br /> gdb （如果你需要调试的话）<br /> gettext<br /> gettext-devel<br /> git （不一定需要）<br /> libiconv<br /> libtool<br /> make<br /> mingw-runtime<br /> nasm<br /> patchutils<br /> pkg-config<br /> subversion<br /> Editor<br /> vim （有了它方便点）<br /> Libs<br /> libgcrypt<br /> Web //这两个可以不要，如果你不想编译第三方库<br /> curl (optional: for building extras/contrib)<br /> wget (optional: for building extras/contrib)<br /><br /> 然后是下载所需要版本的VLC的源代码。对于Release版本，可以从这里下载：http://download.videolan.org/pub /videolan/vlc/，如果你需要下载实时最新的库，就要从VLC的源码库上取下来了。现在VLC改用git了，使用命令： git clone  git://git.videolan.org/vlc.git<br /><br /> VLC还需要很多第三方的库，你可以取得源码来编译，这部分可以参考Linux上的VLC编译的文章。在Windows上VLC做了一个编译好的 win32第三方库的包，可以从http://download.videolan.org/pub/testing/win32/  下载。包需要解压到根目录 &#8216;/&#8217;，事实上这些库都位于&#8217;/usr/win32-branch&#8217;里边。</div> <div style="padding-bottom: 10px; line-height: 22px; padding-left: 20px; padding-right: 20px; font-size: 14px; padding-top: 10px;"> <span><span style="color: #333333; line-height: 22px; font-size: 14px;">在 cygwin中进入vlc的主目录，运行bootstrap，&#8217;./bootstrap&#8217;。在等待它结束之前，我们先来看一下如何配置VLC的编译。运行  &#8216;./configure -h &gt;cfg_opt.txt&#8217;就可以把配置的选项信息都输出到  cfg_opt.txt中，然后慢慢来研究。里面大多是启用、禁用某些特性和功能模块，或者配置某些模块需要的库的路径等信息。为了方便可以写一个简单的 脚本来做这件事，当然这个不是必需的。<br /> PATH=/usr/win32-branch/bin:$PATH /<br /> PKG_CONFIG_PATH=/usr/win32-branch/lib/pkgconfig /<br /> CPPFLAGS=&#8221;-I/usr/win32-branch/include -I/usr/win32-branch/include/ebml&#8221; /<br /> LDFLAGS=-L/usr/win32-branch/lib /<br /> CC=&#8221;gcc -mno-cygwin&#8221; CXX=&#8221;g++ -mno-cygwin&#8221; /<br /> ./configure /<br /> &#8211;host=i686-pc-mingw32 /<br /> &#8211;disable-gtk /<br /> &#8211;enable-nls &#8211;enable-sdl &#8211;with-sdl-config-path=/usr/win32-branch/bin /<br /> &#8211;enable-<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>ffmpeg</strong></a>&#8211;with-ffmpeg-mp3lame  &#8211;with-ffmpeg-faac /<br /> &#8211;with-ffmpeg-zlib &#8211;enable-faad &#8211;enable-flac &#8211;enable-theora /<br /> &#8211;with-wx-config-path=/usr/win32-branch/bin /<br /> &#8211;with-freetype-config-path=/usr/win32-branch/bin /<br /> &#8211;with-fribidi-config-path=/usr/win32-branch/bin /<br /> &#8211;enable-<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>live555</strong></a>&#8211;with-live555-tree=/usr/win32-branch/live.com  /<br /> &#8211;enable-caca &#8211;with-caca-config-path=/usr/win32-branch/bin /<br /> &#8211;with-xml2-config-path=/usr/win32-branch/bin /<br /> &#8211;with-dvdnav-config-path=/usr/win32-branch/bin /<br /> &#8211;disable-cddax &#8211;disable-vcdx &#8211;enable-goom /<br /> &#8211;enable-twolame &#8211;enable-dvdread /<br /> &#8211;enable-release &#8211;enable-dca /<br /> &#8211;enable-mkv /<br /> &#8211;enable-quicktime &#8211;enable-mozilla /<br /> &#8211;with-mozilla-sdk-path=/usr/win32-branch/gecko-sdk /<br /> &#8211;enable-mostly-builtin /<br /> &amp;&amp; make<br /><br /> 例如把这个文件保存为 &#8216;mybuild&#8217;，等bootstrp运行结束之后，我们只需要运行一下 mybuild就会开始配置和编译了。这通常需要挺长的时间，如果运气好，在漫长的等待之后make运行成功，<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>vlc</strong></a>就编译好了。直接双击主目录里边的vlc.exe应该就可以运行了。<br /> 为了方便可以把它打包，最简单的是 &#8216;make package-win32-base&#8217;，它将创建一个子目录来存放所有运行所需的东西，这个目录就是一个绿色版的VLC啦。<br /> 当然如果你运气没那么棒，可能会碰到各种各样的错误，例如在boottrap或者configure中出错，通常是因为没安装某个库或者库的版本不合适；也可能碰到编译的错误，尝试去google一下。<br /><br /> 本文参考 http://wiki.videolan.org/Win32CompileCygwinNew<br /><br /> 三、Linux平台编译<br /> 先下载源代码，把源代码解压之后也是先运行一下bootstrap，看看缺什么工具没有，例如gcc、make、libtool、automake、autoconfig等是否有合适的版本。如果不合适的话就用你喜欢的方式去升级或者安装。<br /> 下面最麻烦的一步来了。VLC在Linux上没有给出和Windows上类似的第三方库的预编译包，你必须去自己获得并编译这些库。这些库的数量取决于你 的配置选项。VLC给出了一个自动化的解决方案，关注一下主目录/extras/contrib，里边有一些工具来帮助你自动下载、patch和编译所有 可能用到的第三方库。先运行一下那个目录下的bootstrap，如果缺少***.mak的话可以到VLC的代码库中找一下，是一个系统相关的文件，然后 简单的一句make就可以了。如果你对这些库比较熟悉的话最好先手动筛选一下，有一些可能不是你所需要的，而下载他们可能需要很长的时间。<br /> 在漫长的等待之后，如果一切顺利（我几乎不相信会这样），这一步就算完成了。可能遇到的问题有：下载实在太慢，可以用其他下载工具把库的代码包下下来放到/extras/contrib/src里边；如果下载一半断掉，可以把那个不完整的文件删掉重新再运行make。<br /> 这一步做完之后和windows上的编译就几乎一样了。写一个配置脚本然后运行它。例如一个配置脚本：<br /> ./configure /<br /> &#8211;enable-release /<br /> &#8211;disable-skins2 /<br /> &#8211;disable-wxwidgets /<br /> &#8211;enable-mozilla /<br /> &#8211;with-mozilla-sdk-path=./gecko-sdk /<br /> &#8211;disable-sout /<br /> &#8211;disable-httpd /<br /> &#8211;enable-live555 /<br /> &#8211;disable-dvdnav /<br /> &#8211;disable-libcdio /<br /> &#8211;disable-libcddb /<br /> &#8211;disable-cdda /<br /> &#8211;disable-vcd /<br /> &#8211;disable-dvdread /<br /> &#8211;disable-smb /<br /> &#8211;disable-cmml /<br /> &#8211;disable-alsa /<br /> &#8211;disable-opengl /<br /> &#8211;disable-png /<br /> &#8211;disable-screen /<br /> &#8211;disable-mkv /<br /> &#8211;disable-mod /<br /> &#8211;disable-mpc /<br /> &#8211;disable-libtar /<br /> &#8211;disable-speex /<br /> &#8211;disable-visual /<br /> &#8211;disable-daap /<br /> &#8211;disable-bonjour /<br /> &#8211;disable-gnutls /<br /> &#8211;enable-faad /<br /> &#8211;enable-mostly-builtin<br /> 配置完之后再运行make就可以了。<br /> 参考：<a href="http://wiki.videolan.org/UnixCompile">http://wiki.videolan.org/UnixCompile</a></span></span> </div> <div style="padding-bottom: 10px; line-height: 22px; padding-left: 20px; padding-right: 20px; font-size: 14px; padding-top: 10px;"> <span><span style="color: #333333; line-height: 22px; font-size: 14px;"><span><span style="color: #333333; line-height: 22px; font-size: 14px;">四、使用<br /><a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>vlc</strong></a>的功能很强大，它不仅仅是一个<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>视频</strong></a>播放器，也可作为小型的视频服务器，更可以一边播放一边转码，把视频流发送到网络上。<br /> 最简单的，从界面打开一个文件播放，也可以在命令行下使用，如C:/Program Files/VideoLAN/VLC&gt;vlc.exe test.ts<br /> 获取内置的帮助，会写到vlc-help.txt：C:/Program Files/VideoLAN/VLC&gt;vlc.exe -h<br /> 获取更详细的帮助，有大量的选项介绍：C:/Program Files/VideoLAN/VLC&gt;vlc.exe -H<br /><br /> 在线使用帮助<br /> http://www.videolan.org/doc/play-howto/en/play-howto-en.html<br /> http://www.videolan.org/doc/streaming-howto/en/streaming-howto-en.html<br /><br /> 搜索并显示可用的模块列表：C:/Program Files/VideoLAN/VLC&gt;vlc.exe -l<br /><br /> Windows下，默认情况，VLC的配置文件在 %APPDATA%/vlc/vlcrc，%APPDATA%在XP下通常是 C:/Documents and Settings/用户名/Application Data<br /> Linux下，在用户home目录的/.vlc/中<br /><br /> vlc的选项完全可以通过修改vlcrc来设置，界面只是略微方便一点<br /> 重置所有选项到默认状态：C:/Program Files/VideoLAN/VLC&gt;vlc.exe &#8211;reset-config<br /> VLC从vlcrc中指定的plugin-path，以及当前目录的modules和plugins目录来递归查找plugin，VLC的大部分功能都是 通过plugin来实现的。VLC默认有大量的动态插件，为了加快启动速度，vlc会在%APPDATA%/vlc/cache中缓存plugin的列 表，选项plugins-cache=0可以禁止缓存plugin<br /><br /> 打开一个UDP组播流，组播组 239.255.1.1，端口 4567，默认端口1234，对于rtp协议，VLC会自动识别，写udp还是rtp都没问题<br /> C:/Program Files/VideoLAN/VLC&gt;vlc.exe udp://@239.255.1.1:4567<br /><br /> 在本地UDP端口 888 接收流, &#8220;@&#8221;表示绑定一个地址，而不是连接该地址<br /> C:/Program Files/VideoLAN/VLC&gt;vlc.exe udp://@888<br /><br /> 串流输出，就是在播放的时候，以某种方式向外传送视频，在打开界面的串流/保存 中设置会比较方便。<br /> 例如，循环播放test.ts， 以rtp方式传送到224.1.1.1端口1234, 同时显示视频<br /> vlc.exe test.ts &#8211;loop :sout=#duplicate{dst=std{access=rtp,mux=ts,dst=224.1.1.1:1234},dst=display}<br /><br /> 例如，接收UDP端口888，数据全部保存到C:/dump.ts<br /> vlc.exe udp://@888 :demux=dump :demuxdump-file=&#8221;C:/dump.ts&#8221;<br /><br /> 关于Windows下视频输出模块<br /> Direct3D ：效果比DirectX差一点，但是方便截图，也可以在图像上实现alpha<br /> DirectX：效果最好，利用DirectX的显示加速<br /> OpenGL：在不同的硬件上表现不太一样<br /> WinGDI：最慢的一种，不需要显卡加速<br /> caca：用彩色的Assic字符来显示<br /><br /> 临时启用某个视频输出，可以这样：C:/Program Files/VideoLAN/VLC-0.8.6e&gt;vlc test.ts &#8211;vout=caca<br /><br /> ActiveX控件<br /> 官方发布的VLC自带ActiveX控件 axvlc.dll，注册之后可以方便的在应用程序和网页中使用VLC，注册的办法是<br /> C:/Program Files/VideoLAN/VLC-0.8.6e&gt;regsvr32 axvlc.dll<br /> ActiveX VLC的使用方法可以参考源代码中ActiveX目录的README.TXT和test.html，ActiveX控件的接口有第一版和第二版，第一版简单，功能少，已经不再维护建议用第二版本，功能多一点<br /><br /> Mozilla Plugin<br /> 你还可以在Windows和Linux的Firefox中使用VLC。Windows下可以在安装VLC的时候选上Mozilla  plugin，事实上它做的就是在HKLM_Software_MozillaPlugin键下添加一个VLC的子键。Linux下可以把 libvlcplugin.so（或者叫npvlc.so）和插件目录放到Firefox的plugins目录，来使之生效。<br /> 同样这适用于基于Xulrunner的应用程序，事实上像 Miro、SongBird等xul应用都是用的这个插件。与ActiveX类似的，VLC的Mozilla Plugin也有两套接口，建议用新的第二版。<br /><br /> 注册表<br /> 在Windows下VLC只使用很少量的注册表的信息，最重要的一条是HKLM_Software_VLC键下的InstallDir项，VLC的 Mozilla  Plugin和ActiveX控件通过这一项来定位其插件的目录。Telnet、Http控制对VLC来说，控制界面都是Interface类的模块，你 可以使用各种控制模块。Windows下默认使用的是wxwidgets图形界面，还可以使用http、telnet等界面，来远程控制VLC，如果用 VLC在服务器上专门作视频流转发一类的事情，这种远程界面可以帮上大忙。</span></span></span></span> </div> <div style="padding-bottom: 10px; line-height: 22px; padding-left: 20px; padding-right: 20px; font-size: 14px; padding-top: 10px;"> <span><span style="line-height: 22px; color: #333333; font-size: 14px;"><span><span style="line-height: 22px; color: #333333; font-size: 14px;"><span><span style="color: #333333; line-height: 22px; font-size: 14px;"><a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>视频</strong></a>过滤器<br /> 0.8系列中有多达13种视频过滤器，为视频添加各种效果和特殊处理。<br /><br /> Skin2界面<br /> 一个漂亮一点的，可以换肤的界面。<br /><br /> 其他的<br /> 播放DVD、VCD光盘，打开DirectShow设备，播放当前屏幕&#8230;<br /><br /> 一些问题<br /> 目前的<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>vlc</strong></a>无法播放Real视频，如rm、rmvb。其实从0.9版本的VLC开始可以依赖其他解码器播放。但就目前测试的情况来看，顺序播放没问题，但是拖动则效果很差。RTSP的播放，拖动有问题，在获取播放位置时有缺陷。例如和达尔文服务器的配合。<br /><br /> 五、视频播放的基本原理<br /> 几乎所有的视频播放器，如VLC、MPlayer、Xine，包括DirectShow，在播放视频的原理和架构上都是非常相似的，理解这个对理解VLC的源码会有事半功倍的效果。<br /> 大致的来说，播放一个视频分为4个步骤：<br /> 1. acess 访问，或者理解为接收、获取、得到<br /> 2. demux 解复用，就是把通常合在一起的音频和视频分离(还有可能的字幕)<br /> 3. decode 解码，包括音频和视频的解码<br /> 4. output 输出，也分为音频和视频的输出（aout和vout）<br /> 拿播放一个UDP组播的MPEG  TS流来说吧，access部分负责从网络接收组播流，放到VLC的内存缓冲区中，access模块关注IP协议，如是否IPv6、组播地址、组播协议、 端口等信息；如果检测出来是RTP协议（RTP协议在UDP头部简单得加上了固定12个字节的信息），还要分析RTP头部信息。这部分可以参看VLC源码   /modules/access/udp.c。在同目录下还可以看到大量的access模块，如file、http、dvd、ftp、smb、tcp、 dshow、mms、v4l&#8230;等等<br /> 而demux部分首先要解析TS流的信息。TS格式是MPEG2协议的一部分，概括地说，TS通常是固定188字节的一个packet，一个TS流可以包 含多个program（节目），一个program又可以包含多个视频、音频、和文字信息的ES流；每个ES流会有不同的PID标示。而又为了可以分析这 些ES流，TS有一些固定的PID用来间隔发送program和es流信息的表格：PAT和PMT表。关于TS格式的详细信息可以去google一下。 VLC专门做了一个独立的库libdvbpsi来解析和编码TS流，而调用它的代码可以参见VLC源码  /modules/demux/ts.c。<br /> 其实之所以需要demux，是因为音视频在制作的时候实际上都是独立编码的，得到的是分开的数据，为了传输方便必须要用某种方式合起来，这就有了各种封装 格式也就有了demux。demux分解出来的音频和视频流分别送往音频解码器和视频解码器。因为原始的音视频都是占用大量空间，而且冗余度较高的数据， 通常在制作的时候就会进行某种压缩。这就是我们熟知的音视频编码格式，包括MPEG1（VCD）、MPEG2（DVD）、MPEG4、H.264、 rmvb等等。音视频解码器的作用就是把这些压缩了的数据还原成原始的音视频数据。VLC解码MPEG2使用了一个独立的库libmpeg2，调用它的源 文件是  /modules/codec/libmpeg2.c。VLC关于编解码的模块都放在/modules/codec目录下，其中包括著名的庞大的<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>ffmpeg</strong></a>。<br /> 解码器，例如视频解码器输出的是一张一张的类似位图格式的图像，但是要让人从屏幕看得到，还需要一个视频输出的模块。当然可以像一个Win32窗口程序那 样直接把图像画到窗口DC上&#8212;&#8212;VLC的一个输出模块WinGDI就是这么干的，但是通常这太慢了，而且消耗大量的CPU。在Windows下比较好的办 法是用DirectX的接口，会自动调用显卡的加速功能。<br /> 这样的功能分解使得模块化更容易一点，每个模块住需要专注于自己的事；从整体来说功能强大而且灵活。<br /> 但是事情总是不会那么简单。就拿access来说，媒体的访问是分层的，如RTSP就涉及到IPv4、TCP、UDP、RTCP、RTSP等多个层次的协 议。有些视频格式包括了传输、封装格式和编辑码格式如MPEG系列，有些封装格式是独立的容器，但是很多人会误解它是编解码格式，如mkv、avi这些。<br /> 音频和视频在demux之后就是独立的，但是需要有一套机制把它们同步起来。同时我们需要有一套机制来控制速度、暂停、停止、跳进，获取各种媒体信息，这些都是很复杂而又很重要的事情。<br /> 另外也许需要在某个地方插入一些修改，来实现某种效果。如音频的EQ，视频的亮度调整之类的，VLC专门设计了access_filter、audio_filter和video_filter类型的模块来做这一类事情。<br /> VLC比较独特的地方是集成了原来的VLS的功能，这依赖于VLC中stream_output类型的模块，它们可以把正在播放的视频以某种方式重新转码和发送出去，如http、UDP、文件等等。<br /> MPlayer的结构与此是类似的，如/stream目录对应的是access的功能，/mpdemux对应的demux功能，/libmpcodecs是解码器，/libvo和/libao2分别是视频和音频的输出。<br /> DirectShow也是类似的，不过分类更多一些更复杂一点。DirectShow里面的模块叫做&#8220;filter&#8221;，filter之间通过&#8221;pin&#8221;来 连接。access的模块对应于DirectShow中的SourceFIlter，这一类Filter只有输出pin没有输入pin。demux模块对 应于splitter filter，这种filter有一个输入pin，多个输出pin。解码模块是一类transform  filter，有一个输入pin、一个输出pin，输出模块对应于readering  filter，有一个输入pin，没有输出pin。当然transform  filter不一定是解码器，也可能是某种其他的处理。<br /> 另外给出一个VLC的API Document，参见：<a href="http://rogerfd.cn/doc/vlcapi.htm">http://rogerfd.cn/doc/vlcapi.htm</a></span></span></span></span></span></span> </div> <div style="padding-bottom: 10px; line-height: 22px; padding-left: 20px; padding-right: 20px; font-size: 14px; padding-top: 10px;"> <span><span style="line-height: 22px; color: #333333; font-size: 14px;"><span><span style="line-height: 22px; color: #333333; font-size: 14px;"><span><span style="line-height: 22px; color: #333333; font-size: 14px;"><span><span style="color: #333333; line-height: 22px; font-size: 14px;">六、精简<br /><a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>vlc</strong></a>默认包含了大量的功能，超过2百个插件；Windows下安装包大小接近10MB，安装之后超过35MB。有时候如果我们只需要部分的功能，应该如何精简它呢？<br /> 精简VLC的第一步是重新配置编译选项，将不需要的功能去掉。一个精简配置脚本如下：<br /> PATH=/usr/win32-branch/bin:$PATH /<br /> PKG_CONFIG_PATH=/usr/win32-branch/lib/pkgconfig /<br /> CPPFLAGS=&#8221;-I/usr/win32-branch/include -I/usr/win32-branch/include/ebml&#8221; /<br /> LDFLAGS=-L/usr/win32-branch/lib /<br /> CC=&#8221;gcc -mno-cygwin&#8221; CXX=&#8221;g++ -mno-cygwin&#8221; /<br /> ./configure /<br /> &#8211;with-freetype-config-path=/usr/win32-branch/bin /<br /> &#8211;with-fribidi-config-path=/usr/win32-branch/bin /<br /> &#8211;disable-<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>ffmpeg</strong></a>/<br /> &#8211;disable-<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>live555</strong></a>/<br /> &#8211;disable-cddax /<br /> &#8211;disable-vcdx /<br /> &#8211;disable-skins2 /<br /> &#8211;disable-wxwidgets /<br /> &#8211;disable-mozilla /<br /> &#8211;disable-httpd /<br /> &#8211;disable-dvdnav /<br /> &#8211;disable-libcdio /<br /> &#8211;disable-libcddb /<br /> &#8211;disable-cdda /<br /> &#8211;disable-sdl /<br /> &#8211;disable-sdl-image /<br /> &#8211;disable-vcd /<br /> &#8211;disable-dvdread /<br /> &#8211;disable-smb /<br /> &#8211;disable-cmml /<br /> &#8211;disable-alsa /<br /> &#8211;disable-opengl /<br /> &#8211;disable-png /<br /> &#8211;disable-screen /<br /> &#8211;disable-mkv /<br /> &#8211;disable-mod /<br /> &#8211;disable-mpc /<br /> &#8211;disable-libtar /<br /> &#8211;disable-speex /<br /> &#8211;disable-visual /<br /> &#8211;disable-daap /<br /> &#8211;disable-bonjour /<br /> &#8211;disable-gnutls /<br /> &#8211;disable-vorbis /<br /> &#8211;disable-real /<br /> &#8211;disable-xml /<br /> &#8211;disable-x264 /<br /> &#8211;enable-sout /<br /> &#8211;enable-activex /<br /> &#8211;enable-release</span></span></span></span></span></span></span></span> </div> <div style="padding-bottom: 10px; line-height: 22px; padding-left: 20px; padding-right: 20px; font-size: 14px; padding-top: 10px;"> <span><span style="line-height: 22px; color: #333333; font-size: 14px;"><span><span style="line-height: 22px; color: #333333; font-size: 14px;"><span><span style="line-height: 22px; color: #333333; font-size: 14px;"><span><span style="line-height: 22px; color: #333333; font-size: 14px;"><span><span style="color: #333333; line-height: 22px; font-size: 14px;">从这个脚本可见，主要是禁用了大量的功能。运行  ./configure -h 可以显示每一个配置项的意义；如果还不清楚可以再去搜一下选项对应的库的位置。<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>ffmpeg</strong></a>是一个庞大的编解码库，但是MPEG2的解码可以利用另一个库libmpeg2，所以在这里不需要它。<br /> 注意make完之后要用make package-win32-base来打一下包，打包时会用strip工具来压缩每一个可执行文件。<br /> 但是这样还没有结束。配置项并不是很全面的，而且还会有一些小问题，例如xml禁用了还会有。。。于是还需要手动的清理一下plugins目录里面的插件，挑出没有用处的，这也需要对<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>vlc</strong></a>模块的熟悉。或者使用Roger的笨方法，一个一个试，对功能没有影响的就拿掉。SImpleTV0.4所使用的plugin如以下所示：<br /> liba52sys_plugin.dll liba52 用于AC3格式的音频解码，CCTV高清频道需要<br /> liba52tofloat32_plugin.dll<br /> liba52tospdif_plugin.dll<br /> liba52_plugin.dll<br /> libaccess_file_plugin.dll 文件访问，播放文件需要<br /> libaccess_http_plugin.dll HTTP访问模块<br /> libaccess_output_file_plugin.dll sout的文件模块，用于录制<br /> libaccess_udp_plugin.dll UDP访问模块<br /> libaout_directx_plugin.dll DirectX的声音输出，默认的声音输出模块<br /> libdeinterlace_plugin.dll 解交错的vout-filter模块<br /> libdirect3d_plugin.dll Direct3D<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>视频</strong></a>输出模块，在上面可以半透明。。。<br /> libfixed32tofloat32_plugin.dll 一些数据转换模块<br /> libfixed32tos16_plugin.dll<br /> libfloat32tos16_plugin.dll<br /> libfloat32tos8_plugin.dll<br /> libfloat32tou16_plugin.dll<br /> libfloat32tou8_plugin.dll<br /> libfloat32_mixer_plugin.dll<br /> libglwin32_plugin.dll OpenGL视频输出模块<br /> libi420_ymga_plugin.dll<br /> libi422_yuy2_plugin.dll<br /> libipv4_plugin.dll IPv4网络模块<br /> libipv6_plugin.dll IPv6网络模块<br /> liblibmpeg2_plugin.dll libmpeg2，解码全靠它<br /> liblogger_plugin.dll 日志模块，调试必备<br /> libmemcpy_plugin.dll 好像是利用各种CPU指令加速内存拷贝的<br /> libmpeg_audio_plugin.dll MPEG音频的解码模块<br /> libmpgatofixed32_plugin.dll<br /> libmpga_plugin.dll<br /> libmux_dummy_plugin.dll<br /> libpacketizer_mpegvideo_plugin.dll<br /> libs16tofixed32_plugin.dll<br /> libs16tofloat32swab_plugin.dll<br /> libs16tofloat32_plugin.dll<br /> libs8tofloat32_plugin.dll<br /> libsimple_channel_mixer_plugin.dll<br /> libstream_out_display_plugin.dll sout的模块 。。。<br /> libstream_out_duplicate_plugin.dll<br /> libstream_out_standard_plugin.dll<br /> libtrivial_channel_mixer_plugin.dll<br /> libtrivial_mixer_plugin.dll<br /> libtrivial_resampler_plugin.dll<br /> libts_plugin.dll TS流的解复用模块<br /> libu8tofixed32_plugin.dll<br /> libu8tofloat32_plugin.dll<br /> libugly_resampler_plugin.dll<br /> libvout_directx_plugin.dll DirectX视频输出模块<br /> libwingdi_plugin.dll GDI视频输出模块<br /> 作为ActiveX控件的VLC，只需要这些模块和axvlc.dll就足够了。当然如果使用了libvlc.dll还要带上。<br /><br /> VLC 0.9.2 正式发布 &amp;&amp; VLC播放Rm Rmvb的插件<br /> 新的VLC加入了RealVideo的demux和codec module，已经可以播放rm、rmvb格式的real视频，但是需要下载以下两个附件：<br /> pncrt.dll 拷贝到 C:/Program Files/VideoLAN/VLC/<br /> drv43260.dll 拷贝到 C:/Program Files/VideoLAN/VLC/plugins/<br /> 这两个文件也可以从MPlayer的win32 codec中拷贝出来。从测试的情况来看，顺序播放没有什么问题，但是跳转的时候比较慢，图像不太稳定<br /> 这里有对VLC新特性的介绍 http://wiki.videolan.org/What_is_cool_in_0.9<br /> Release Note：http://www.videolan.org/developers/vlc/NEWS<br /> 下载目录：http://download.videolan.org/pub/vlc/0.9.2/win32/<br /> 下载链接（exe）：<a href="http://download.videolan.org/pub/vlc/0.9.2/win32/vlc-0.9.2-win32.exe">http://download.videolan.org/pub/vlc/0.9.2/win32/vlc-0.9.2-win32.exe</a></span></span></span></span></span></span></span></span></span></span> </div> <div> <span><span style="color: #333333; line-height: 22px; font-size: 14px;">七、将<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>vlc</strong></a>嵌入自己的应用<br /> 总的来说把VLC内嵌入自己的应用有4种途径：<br /> &#8226;直接调用VLC进程<br /> &#8226;VLC的plugin for Mozilla<br /> &#8226;VLC的ActiveX插件<br /> &#8226;调用libvlc<br /> 当然，理论上也可以把VLC的源码直接扣出一部分来放到自己的程序中，不过这种方法难度太大没多大意义。<br /> 先说第一种办法，别怀疑，这是非常有用的一种解决方案，特别是对于转码、流转发等应用，通常直接调用VLC就可以了。VLC有HTTP和Telnet的 Interface模块（就是和用户交互的界面），也很方便和远程交互。而且跨平台应用也非常方便，只需要安装不同平台的VLC就行了。直接调用VLC的 话最重要的就是参数，可以从 vlc.exe -H  中获取比较详细的命令行参数介绍。对于转码、转发的，命令行参数会比较复杂，可以用GUI先试一下，然后把界面上的Generated stream  output string拷下来。<br /> VLC的Mozilla  plugin除了用于Firefox的web页之外，还可以用于任何XUL-base的应用，这种应用通常使用xulrunner来启动。XUL是一种用 XML来写界面的语言，有点像HTML而且也兼容大部分HTML标记，Firefox就是用XUL来写的。VLC的Mozilla插件通常用 Javascript来控制，详细的接口文档可以参考这里：  http://www.videolan.org/doc/play-howto/en/ch04.html#id310965  这个接口有比较老的第一版和比较新的第二版，建议用新的，功能多一些。用VLC的Mozilla插件的应用并不少，例如比较出名的Miro、 Songbird。因为这个好处是显而易见的：跨平台、可控性强、使用简单；限制也很明显：专为Mozilla设计，应用的范围很窄。<br /> VLC的ActiveX插件只能用于Windows平台，当然这是因为ActiveX只是微软的东西。但是不得不说这个还是很好用的。无论是C++、 C#、VB还是网页，都可以轻松地将这个ActiveX利用起来。关于这个的VLC官方文档在这里http://wiki.videolan.org /ActiveX_Controls<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>开发</strong></a>、使用之前别忘了先要注册ActiveX控件，方法是运行  regsvr32 axvlc.dll。Roger 之前写的 SimpleTV 就是调用了VLC的ActiveX控件，所以这也可以作为一个示例的代码，可以主要看看怎么调用这个控件来做串流的代码：<br /> //Create Option for the plugin<br /> bool bIPv6 = false;<br /> if (strstr (szMRL, &#8220;::&#8221;))<br /> {<br /> bIPv6 = true;<br /> }<br /><br /> tagVARIANT opt,var,ip6;<br /> CString sout, ipv6 = &#8220;ipv6=1&#8243;;<br /> SAFEARRAY *psa;<br /> long index;<br /> SAFEARRAYBOUND bound[1] = {0};<br /> bound[0].cElements = bIPv6 ? 2 : 1;<br /><br /> if (m_cfg.bDisplayWhenRecording)<br /> {<br /> sout.Format(&#8221;sout=#duplicate{dst=display,dst=std{access=file,mux=ts,dst=/&#8221;%s/&#8221;}}&#8221;,<br /> strName);<br /> }<br /> else<br /> {<br /> sout.Format(&#8221;sout=#duplicate{dst=std{access=file,mux=ts,dst=/&#8221;%s/&#8221;}}&#8221;, strName);<br /> }<br /><br /> var.vt = VT_BSTR;<br /> var.bstrVal = sout.AllocSysString();<br /> psa = SafeArrayCreate (VT_VARIANT, 1, bound);<br /> index = 0;<br /> SafeArrayPutElement (psa, &amp;index, &amp;var);<br /> if (bIPv6)<br /> {<br /> ip6.vt = VT_BSTR;<br /> ip6.bstrVal = ipv6.AllocSysString();<br /> index = 1;<br /> SafeArrayPutElement (psa, &amp;index, &amp;ip6);<br /> }<br /> opt.vt = VT_ARRAY | VT_BSTR;<br /> opt.parray = psa;<br /><br /> tagVARIANT nul;<br /> nul.vt = VT_NULL;<br /> m_vlc.GetPlaylist ().add (szMRL, nul, opt);<br /> m_vlc.GetPlaylist ().next ();<br /> m_vlc.GetPlaylist ().play ();<br /><br /> 很多人调用VLC的ActiveX控件都会遇到一个问提就是，播放没有反应。大部分的原因都是因为plugins的问题。VLC作为exe运行时会递归搜 索当前目录下的modules和plugins目录来寻找plugin，但是当以ActiveX控件运行时，默认只会检查注册表的 HKLM_Software_VideoLan_VLC_InstallDir，并添上plugins作为模块搜索路径，如果这个路径没有设置或者设置不 对，VLC将找不到大部分的模块，导致大部分功能缺失而无法运行。如果需要修改这一特性可以修改 /activex/plugin.cpp  （0.8.6i）中的 VLCPlugin::getVLC函数。在SimpleTV中，Roger修改的一个片段是<br /><br /> char p_pluginpath[MAX_PATH+1];<br /> int iTmp = 0;<br /> /* 得到SimpleTV.exe的全路径 */<br /> DWORD dwLen = GetModuleFileNameA (NULL, p_pluginpath, MAX_PATH);<br /> for (iTmp = strlen(p_pluginpath) &#8211; 1; iTmp &gt;= 0; &#8212; iTmp)<br /> {<br /> if (p_pluginpath[iTmp] == &#8216;//&#8217;)<br /> {<br /> p_pluginpath[iTmp] = 0;<br /> break;<br /> }<br /> }<br /> /* 将模块路径设为SimpleTV下的 player/modules */<br /> strcat (p_pluginpath, &#8220;//player//modules&#8220;);<br /> ppsz_argv[ppsz_argc++] = &#8220;&#8211;plugin-path&#8221;;<br /> ppsz_argv[ppsz_argc++] = p_pluginpath;</span></span> </div> <div><span><span style="color: #333333; line-height: 22px; font-size: 14px;">还有一点是配置文件<a href="http://www.yanfaw.com/b2b" target="_blank" style="color: #003278; text-decoration: none;"><strong>vlc</strong></a>rc的路径，如果需要修改的话，可以修改  src/misc/configuration.c 中的 GetDir 函数， 在Windows下这个目录默认返回 %APPDATA% ，以上两步做好的话其实就可以做出一个Portable的绿色版VLC了。<br /> 和其他ActiveX的播放器，例如WMP、QuickTime、RealPlayer相比，VLC的优点也很明显：自带所需解码器、开源、功能强大。<br /> 当然ActiveX方式和Mozilla 插件的方式也是有局限性的，这样的方式功能还不够强大，例如没有截屏的接口&#8230;如果需要更多完整的功能，可以考虑直接调用libvlc的接口，<br /><br /> VLC官方提供了一些文档和例子 http://wiki.videolan.org/Libvlc。这里还有一个用C#调用libvlc的例子http://jeremiah.blog.51cto.com/539865/116981<br /> 在Windows下libvlc可能默认是不编译的（0.8.6i），可以在configure中开启这一选项 &#8211;enable-shared-libvlc<br /> 完整的VLC体积还是不小的，如果只需要VLC一部分功能的话，可以最后做一下精简。</span></span></div><img src ="http://www.cppblog.com/songhaifeng/aggbug/175376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/songhaifeng/" target="_blank">shf</a> 2012-05-19 12:11 <a href="http://www.cppblog.com/songhaifeng/archive/2012/05/19/175376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置方便管理vim插件的的vimrc</title><link>http://www.cppblog.com/songhaifeng/archive/2011/03/20/142284.html</link><dc:creator>shf</dc:creator><author>shf</author><pubDate>Sun, 20 Mar 2011 09:39:00 GMT</pubDate><guid>http://www.cppblog.com/songhaifeng/archive/2011/03/20/142284.html</guid><wfw:comment>http://www.cppblog.com/songhaifeng/comments/142284.html</wfw:comment><comments>http://www.cppblog.com/songhaifeng/archive/2011/03/20/142284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/songhaifeng/comments/commentRss/142284.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/songhaifeng/services/trackbacks/142284.html</trackback:ping><description><![CDATA[<br>配置方便管理vim插件的的vimrc<br>使用vundle来管理vim的插件。vundle把每个插件作为单独一个目录放在~/.vim/bundle下面，每个插件所有的配置都在这一个目录，这样就方便vim管理每个插件，很容易的对插件增加、修改、删除。<br><br>使用vundle配置vim插件的方法：<br><br>1.先安装vundle插件到vim中。<br>vundle的作者把代码放到了http://github.com网站，可以使用git把vundle插件从代码仓库中取下来。<br><br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">git&nbsp;clone&nbsp;http</span><span style="color: #000000;">://</span><span style="color: #000000;">github</span><span style="color: #000000;">.</span><span style="color: #000000;">com</span><span style="color: #000000;">/</span><span style="color: #000000;">gmarik</span><span style="color: #000000;">/</span><span style="color: #000000;">vundle</span><span style="color: #000000;">.</span><span style="color: #000000;">git&nbsp;</span><span style="color: #000000;">~/.</span><span style="color: #000000;">vim</span><span style="color: #000000;">/</span><span style="color: #000000;">vundle</span><span style="color: #000000;">.</span><span style="color: #000000;">git</span></div>
<br><br>2.配置要安装的插件到vim<br>在.vimrc中放入下面的代码<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;rtp</span><span style="color: #000000;">+=</span><span style="color: #000000;">~</span><span style="color: #000000;">/</span><span style="color: #000000;">.vim</span><span style="color: #000000;">/</span><span style="color: #000000;">vundle.git</span><span style="color: #000000;">/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">call</span><span style="color: #000000;">&nbsp;vundle#rc()<br><br></span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;Bundles:</span><span style="color: #000000;"><br></span><span style="color: #000000;">Bundle&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">L9</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>Bundle&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">git://git.wincent.com/command-t.git</span><span style="color: #000000;">"</span><span style="color: #000000;"><br></span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;<img  src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #000000;"><br></span><span style="color: #000000;"><br></span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;NOTE:&nbsp;if&nbsp;some&nbsp;plugins&nbsp;fail&nbsp;to&nbsp;work,&nbsp;put&nbsp;the&nbsp;config&nbsp;*between*&nbsp;lines:</span><span style="color: #000000;"><br>"</span><span style="color: #000000;">&nbsp;filetype&nbsp;off</span><span style="color: #000000;"><br>"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Bundles&nbsp;here<br></span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;filetype&nbsp;plugin&nbsp;indent&nbsp;on&nbsp;</span></div>
<br><br>3.安装插件<br>启动vim，执行 :BundleInstall<br>这样vundle会从网上下载响应的插件到bundle目录，安装完插件后返回vim。<br><br>完毕。<br><br><br> <img src ="http://www.cppblog.com/songhaifeng/aggbug/142284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/songhaifeng/" target="_blank">shf</a> 2011-03-20 17:39 <a href="http://www.cppblog.com/songhaifeng/archive/2011/03/20/142284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为何 Emacs 和 Vim 被称为两大神器</title><link>http://www.cppblog.com/songhaifeng/archive/2011/01/22/139104.html</link><dc:creator>shf</dc:creator><author>shf</author><pubDate>Fri, 21 Jan 2011 18:00:00 GMT</pubDate><guid>http://www.cppblog.com/songhaifeng/archive/2011/01/22/139104.html</guid><wfw:comment>http://www.cppblog.com/songhaifeng/comments/139104.html</wfw:comment><comments>http://www.cppblog.com/songhaifeng/archive/2011/01/22/139104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/songhaifeng/comments/commentRss/139104.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/songhaifeng/services/trackbacks/139104.html</trackback:ping><description><![CDATA[<div class="bct fc05 fc11 nbw-blog ztag js-fs2">
<p>Emacs 是神的编辑器，而 Vim 是编辑器之神。二者为何会有如此美誉，且听本文向你一一道来。</p>
<table rules="none" frame="void">
    <col>
    <col>
    <tbody valign="top">
        <tr>
            <th>Author:</th>
            <td>Jiqing Wu</td>
        </tr>
        <tr>
            <th>email:</th>
            <td><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#105;&#113;&#105;&#110;&#103;&#119;&#117;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">jiqingwu@gmail.com</a></td>
        </tr>
        <tr>
            <th>homepage:</th>
            <td><a href="http://linuxtoy.org/archives/http:://hi.baidu.com/jiqing0925">http:://hi.baidu.com/jiqing0925</a></td>
        </tr>
        <tr>
            <th>create:</th>
            <td>2011-01-09</td>
        </tr>
        <tr>
            <th>update:</th>
            <td>2011-01-09</td>
        </tr>
        <tr>
            <th>面向的读者:</th>
            <td>经常用电脑处理文本和编程的同学</td>
        </tr>
    </tbody>
</table>
<div>
<p><a id="id1" name="id1">目录</a></p>
<ul>
    <li><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id2" id="id10" name="id10">0. 序章：神器的传说</a></li>
    <li><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id3" id="id11" name="id11">1. 无敌的可扩展性</a>
    <ul>
        <li><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id4" id="id12" name="id12">1.1 可扩展性给了软件强大的生命</a></li>
        <li><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#emacs" id="id13" name="id13">1.2 Emacs是伪装成编辑器的操作系统</a></li>
        <li><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#vim-vi" id="id14" name="id14">1.3 Vim不只是Vi</a></li>
    </ul>
    </li>
    <li><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id5" id="id15" name="id15">2. 特立独行的魅力</a>
    <ul>
        <li><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id6" id="id16" name="id16">2.1 可扩展性让你倾注了灵魂</a></li>
        <li><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id7" id="id17" name="id17">2.2 独特的操作方式让你中了毒</a></li>
    </ul>
    </li>
    <li><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id8" id="id18" name="id18">3. 黑客的编辑器</a></li>
    <li><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id9" id="id19" name="id19">4. 神器引发的圣战</a></li>
</ul>
</div>
<div>
<h2><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id10" id="id2" name="id2">0. 序章：神器的传说</a></h2>
<p>在这个蔚蓝色的星球上，流传着两大神器的传说：
据说Emacs是神的编辑器，而Vim是编辑器之神。</p>
<p>追求独步天下的高手和低手们争着一睹它们的风采，
可看到它们朴素单薄的界面后，不禁心下怀疑：
这就是神器吗？甚至有人生了轻视之心。</p>
<p>肤浅的人嗤之以鼻，说：什么年代了，还抱着这么老土的玩意不放，
真他妈Geek！同学，请冷静下来，听我说：它们的确够老了，
都几十年的寿命了，但你想想为什么，为什么这么古老的编辑器，
却有越来越多的人皈依它们。</p>
<p>Windows下用UltraEdit和Editplus的人质问：
它们到底比UltraEdit和Editplus好在哪里？我说：
不可同日而语。</p>
<p>连UltraEdit和EditPlus都没用过的同学问：它们就相当于Linux上的
Notepad吧？我说：请你从我的眼前消失。</p>
<p>一些人勇敢地拾起了Vim或Emacs，却发现学习曲线陡峭而漫长，
于是在没发现它们的强大之前就放弃了，说：
太难用了，把键盘当鼠标用的烂玩意，有什么好的？</p>
<p>还是有一些人留下来了，坚定地守护着这两大神器。
一些说葡萄太酸的人想离开又不甘心，总是问：
它们到底神在哪里啊？
我不禁想起了李宗盛的几句歌词：:</p>
<pre>有人问我你究竟是哪里好，<br>这么多年我还忘不掉？<br>春风再美也比不上你的笑，<br>没见过你的人不会明了。<br></pre>
<p>也许你不会明了，我还是要努力讲一讲。</p>
</div>
<div>
<h2><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id11" id="id3" name="id3">1. 无敌的可扩展性</a></h2>
<div>
<h3><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id12" id="id4" name="id4">1.1 可扩展性给了软件强大的生命</a></h3>
<p>曾几何时，Windows用户对软件的可扩展性没有概念，
他们只能对他们使用的软件进行非常有限的定制。
扩展软件的权利保留在软件开发者手中。软件的使用者
如果想要新的功能和特性，只能等待软件的升级。
有能力的用户等不及了，为了添加自己想要的功能，
从0开始写了一款新的软件。
就这样，新的功能意味着新的软件，Windows下的软件
前赴后继，迅速地更新换代着。因此，
Windows下的软件都很短命。</p>
<p>Linux和开源软件渐渐流行起来，人们才发现：
可扩展性才能给软件强大的生命。
在MS的VS横行的今天，Eclipse为什么被评为最好的IDE？
就是因为它在IDE中最具可扩展性。
在IE几乎一统天下的时候，为什么Firefox能夺走越来越多的用户，
也是因为它的可扩展性。
提供了良好的扩展接口，用户自然会写出各种各样的插件，
来满足用户自己形形色色的要求。
这样，软件在用户的推动下自然变得强大了。</p>
<p>Emacs和Vim没有被时代淘汰，反而越发强大，
也正是因为在数不清的编辑器中，他们具有无可匹敌的可扩展性。</p>
</div>
<div>
<h3><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id13" id="emacs" name="emacs">1.2 Emacs是伪装成编辑器的操作系统</a></h3>
<p>有句夸张的话说：Emacs是伪装成编辑器的操作系统。
细细想来，这句话并不夸张。</p>
<p>Emacs其实是个Lisp的解释器，因此可以用Lisp灵活地扩展。
Lisp是什么东西，这同样是种很有生命力的编程语言。
在C语言还没有发明的年代，MIT的人工智能实验室写ITS操作系统时，
一部分用的是汇编语言，还有一部分就是用的Lisp。
现在，Lisp仍在人工智能研究领域广泛使用着。</p>
<p>有这么牛逼的扩展语言，注定Emacs向着无所不能的方向发展。
渐渐地，人们用Emacs不再限于写程序，写文档，
而且在Emacs里管理文件系统，运行终端，收邮件，上网，
听音乐&#8230;&#8230;，真是一发不可收拾。甚至，有人用Emacs控制咖啡机煮咖啡。</p>
<p>这种大而全的扩展，背离了&#8220;一个程序只做一件事并做好它&#8221;的
Unix哲学，被Unix的忠诚用户所诟病。可是真的背离了吗？
Emacs说过自己是一个编辑器吗？</p>
<p>正是因为Emacs的无敌的可扩展性，人们才分不清Emacs到底是不是一个编
辑器了。但，就是有人喜欢这种All-in-One的哲学，喜欢在Emacs中完成每
件事。所以才会有人写《生活在Emacs中》，所以，
Emacs才会成为一种信仰。</p>
</div>
<div>
<h3><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id14" id="vim-vi" name="vim-vi">1.3 Vim不只是Vi</a></h3>
<p>Vim是Vi最受欢迎的变种之一，除了继承了Vi迅捷的编辑方式，
Vim的功能已经比原始的Vi强大得多。
这也得益于它可以用Vim脚本无限地扩展。
<a href="http://www.vim.org/">Vim.org</a> 上已经有数千个脚本了，给Vim增加各种各样的特性和功能。</p>
<p>为了证明Vim的可扩展性不输于Emacs，也有用户写了
在Vim中玩游戏、运行Shell、和集成GDB在Vim内部调试的插件。
客观地讲，Vim的脚本语言与Emacs的ELisp相比，略显逊色，
但这丝毫不妨碍它把Vim扩展成非常优秀的编辑器。</p>
<p>说到底，Vim的前身Vi和Emacs的设计采用了不同的哲学，
Vi更符合Unix传统，它通过管道机制和系统内各种积木工具打交道，
它讲究的是和系统内的工具程序协作来完成用户的任务。
和Emacs相比，它的定位很明确，就是要做一个强大的编辑器。
因此Vim的绝大部分扩展，都是为了更好地完成编辑文本的任务。</p>
<p>海纳百川，有容乃大。Emacs和Vim通过别的编辑器无法比肩的可扩展性，
不断吸收广大用户的智慧，是它们能成为&#8220;神器&#8221;的原因之一。</p>
</div>
</div>
<div>
<h2><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id15" id="id5" name="id5">2. 特立独行的魅力</a></h2>
<div>
<h3><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id16" id="id6" name="id6">2.1 可扩展性让你倾注了灵魂</a></h3>
<p>一旦你意识到Vim或Emacs的强大，你就踏上了不停发掘它们潜力的漫漫长
路。你不停地改进自己的配置文件，你不停地搜索更好的插件，甚至有一
天你开始动手写自己的插件。就像剑客保养自己的剑一样，你也甘心花时
间提升你的Vim或Emacs。经年累月，不知不觉，你已经在那把剑上倾注了
你的灵魂。</p>
</div>
<div>
<h3><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id17" id="id7" name="id7">2.2 独特的操作方式让你中了毒</a></h3>
<p>Emacs和Vim有着迥异的操作方式，却成了Unix/Linux世界中两种代表性的
操作方式，有些软件的操作方式类似Vi，而有些软件的方式类似Emacs，
甚至有些软件提供了Vi的键绑定和Emacs的键绑定让你选择。
而无论哪种操作方式，对Windows用户来说都是古怪的。
虽说古怪，多少代人也验证了这两种操作方式的高效。</p>
<p>Emacs号称Ctrl到死的编辑器。其实它几乎用了所有的辅助键，
听说过没有，Emacs = Esc + Meta + Alt + Ctrl + Shift。
所以高德纳大师说操作Emacs，就像弹奏管风琴。
Emacs使用非常多的组合按键，这大概也是它高效于其它无模式编辑器的原
因之一。你也可以定义自己的组合键序列，调用自己写的lisp函数，
完成自己想要的功能。</p>
<p>Vi一向是以快速的文本编辑闻名于世的。它的按键更简洁，通常是单个字
符按键，就实现某种操作。但这是以有模式为代价的。你要不停地按Esc在
从它的插入模式返回Normal模式。客观得讲，在文本编辑方面，
Vim比Emacs高效，因为它提供了一些Emacs没有对应功能的操作来辅助高效
的文本编辑。但它的模式切换也让一些人受不了，于是那些人选择了
Emacs。</p>
<p>不管你选择了Vim还是Emacs，你都要为习惯它们独特的操作方式而努力，
这是一个技艺积累的过程。当你习惯了Vim或Emacs，你会有欲罢不能的感
觉，你希望用它们完成尽可能多的任务，
因为你再用别的编辑器也已经不习惯。</p>
<p>用Vim或Emacs就像吸食毒品，慢慢地就会上瘾。
它们会带给你渐渐强烈的快感，但你也向它们献出了自己的灵魂。
这时，你只能称它们为神器。</p>
</div>
</div>
<div>
<h2><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id18" id="id8" name="id8">3. 黑客的编辑器</a></h2>
<p>Vim的前身Vi的作者Bill Joy和Emacs的作者Richard Stallman
都是那个时代著名的黑客，所以这两款编辑器一开始面向的主要用户
就是写程序的人，现在仍然是。
它们对编程加入了越来越多的支持，如语法高亮、智能缩进、关键字补全
甚至集成调试。也有越来越多的程序员从IDE转向了Vim和Emacs。</p>
<p>用Vim和Emacs编程到底有什么好处？
我想首先是它们高效的编辑操作会提高你的编程效率。
其次你可以用它们完成各种语言的编程，所谓一剑在手，夫复何求。
你不用再因为编程语言不同去学习不同的IDE的使用，
那些庞大的IDE的升级换代也与你再不相关，
你把精力用于学习编程语言本身就好了。
听说Google和微软内部开发也都不用IDE的，
他们也会用Emacs或Vim。</p>
<p>因为我写的程序不多，还不能深入体会用Vim或Emacs开发程序的乐趣。
我只是觉得这很酷，你看，Linux之父Linus多年来用的是一款
MicroEmacs，它比GNU Emacs或XEmacs少许多功能，但Linus就是用它在维
护Linux。 微软的大牛Don Box，Com之父，一直用Emacs，
他说谁也不能夺走他的编辑器。他还在网上放了一段他用Emacs写C#程序的
视频。</p>
<p>编程大师们的选择，也是Emacs和Vim被追捧为神器的原因之一。</p>
</div>
<h2><a href="http://linuxtoy.org/archives/why-emacs-vim-good.html#id19" id="id9" name="id9">4. 神器引发的圣战</a></h2>
<p>Vim用户和Emacs用户有着旗鼓相当的品位，应该互相欣赏才对。
现实却是，忠诚于Vim的用户和忠诚于Emacs的用户互不相容，
常常没完没了地打口水仗。Emacs用户说Vim的操作方式单一而古怪，
Vim用户说Emacs体积庞大，启动缓慢。</p>
<p>很有点一山不容二虎的意思，大概因为二者都处于神器的高度，才会斗争
不断吧。也可能是因为二者截然不同的设计哲学吸引的用户在价值观上也
互不认同。</p>
<p>正因为两者难分高下，新人总是在Vim和Emacs之间犹豫不定，
很难决定到底要皈依哪一个神。</p>
</div>
<br> <img src ="http://www.cppblog.com/songhaifeng/aggbug/139104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/songhaifeng/" target="_blank">shf</a> 2011-01-22 02:00 <a href="http://www.cppblog.com/songhaifeng/archive/2011/01/22/139104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Vista下提升应用程序的执行权限</title><link>http://www.cppblog.com/songhaifeng/archive/2010/05/24/116202.html</link><dc:creator>shf</dc:creator><author>shf</author><pubDate>Mon, 24 May 2010 01:20:00 GMT</pubDate><guid>http://www.cppblog.com/songhaifeng/archive/2010/05/24/116202.html</guid><wfw:comment>http://www.cppblog.com/songhaifeng/comments/116202.html</wfw:comment><comments>http://www.cppblog.com/songhaifeng/archive/2010/05/24/116202.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/songhaifeng/comments/commentRss/116202.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/songhaifeng/services/trackbacks/116202.html</trackback:ping><description><![CDATA[<font size="4">在Vista下提升应用程序的执行权限</font><br><br><br>在
vista系统应用程序执行时默认不会使用超级用户权限,这会使一些创建文件和目录的IO操作失败,出现访问错误.这种现象是因为Vista的UAC特性
引起的.<br><br>要避免这种情况,可以强制用户在运行应用程序时以超级用户权限执行程序.具体做法:<br><br>1.编辑manifest文
件. 在manifest文件中配置好应用程序执行时需要的参数和执行环境.下面是一个实际例子:<br><br>
<table style="border-collapse: collapse; width: 558px; height: 411px;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="vertical-align: top;"><br></td>
            <td>
            <p style="margin: 5px; line-height: 150%;"><code>&lt;?xml
            version="1.0" encoding="UTF-8" standalone="yes"?&gt;<br>
            &lt;assembly xmlns="urn:schemas-microsoft-com:asm.v1"
            manifestVersion="1.0"&gt; <br>
            &nbsp;&nbsp;&lt;assemblyIdentity version="1.0.0.0"<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processorArchitecture="X86"<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name="IsUserAdmin"<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type="win32"/&gt;
            <br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
            &nbsp;&nbsp;&lt;description&gt;Description of your
            application&lt;/description&gt; <br>
            &nbsp;&nbsp;&lt;!-- Identify the
            application security requirements.
            --&gt;<br>
            &nbsp;&nbsp;&lt;trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"&gt;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&lt;security&gt;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;requestedPrivileges&gt;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;requestedExecutionLevel<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level="requireAdministrator"<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uiAccess="false"/&gt;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/requestedPrivileges&gt;<br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/security&gt;<br>
            &nbsp;&nbsp;&lt;/trustInfo&gt;</code></p>
            <p style="margin: 5px; line-height: 150%;"><code>&nbsp;&lt;/assembly&gt;<br></code></p>
            </td>
        </tr>
    </tbody>
</table>
<br>2.
编辑应用程序的资源文件(rc后缀的文件),在其中加入下面两行代码:<br><br>
<table style="border-collapse: collapse; width: 554px; height: 52px;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td>
            <p style="margin: 5px; line-height: 150%;"><code>#define
            MANIFEST_RESOURCE_ID 1<br>
            MANIFEST_RESOURCE_ID RT_MANIFEST
            "{Application.exe}.manifest"</code></p>
            </td>
        </tr>
    </tbody>
</table>
<br>其
中Application.exe替换成要编译生成的可执行文件名.<br><br>3.编译链接程序,生成可执行应用程序.<br><br>4.运行
mt.exe命令,把manifest文件和生成的可执行程序链接起来.把manifest内容写入可执行文件.<br>命令行为:<br><br>
<table style="border-collapse: collapse;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%">
    <tbody>
        <tr>
            <td>
            <p style="margin: 5px; line-height: 150%;"> mt.exe
            &#8211;manifest temp.manifest &#8211;outputresource:YourApp.exe;#1</p>
            </td>
        </tr>
    </tbody>
</table>
<br>到
这一步,生成的可执行文件就可以在vista下运行时弹出UAC确认框,让用户确认以超级用户权限执行应用程序.<br><br>参考:<br>1.http://msdn.microsoft.com/en-us/library/bb756973.aspx<br>Designing
UAC
Applications for Windows Vista<br><br>2.http://msdn.microsoft.com/en-us/library/bb756996.aspx<br>AC:
User
Account Control
<br><img src ="http://www.cppblog.com/songhaifeng/aggbug/116202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/songhaifeng/" target="_blank">shf</a> 2010-05-24 09:20 <a href="http://www.cppblog.com/songhaifeng/archive/2010/05/24/116202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>