2008年12月27日星期六

setCentralWidget使用嵌入SDL的Qt Widget?

以前讨论了SDL嵌入Qt Widget, 比较规范的方法是,我在以前的文章里已经提过了:  

char variable[64]; 
_snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId()); 
SDL_putenv(variable); 

这里只使用了三行程序,很简单,唯一要注意的一点:不要使用effectiveWinId (),而是要使用winId ()。
现在我们要使用这个已经嵌入SDL的Qt Widget, 我做了两个测试:


测试1:在MainWindow中使用setCentralWidget

SDLVideo *sdlvideo = new SDLVideo; 
setCentralWidget(sdlvideo); 


结果:无法成为MainWindow的CentralWidget,程序执行一下就立刻结束。测试2:在MainWindow中使用QDockWidget 

SDLVideo *SDLVideo_dock = new SDLVideo; 
QDockWidget *dock_a = new QDockWidget(tr("Media Player of ... ..."), this); 
dock_a->setWidget(SDLVideo_dock); 
//addDockWidget(Qt::LeftDockWidgetArea, dock_a); 
viewMenu->addAction(dock_a->toggleViewAction()); 

结果:和预料的一样,也无法成为MainWindow的QDockWidget,程序执行一下就立刻结束。
结论:经过两个测试证明,SDL嵌入Qt Widget,在一定程度上不能和一般的Qt Widget一样工作,虽然现在它也是Widget但是它只是一个“类Qt Widget”,一定程度上也是一个SDL app,它只是嵌入一个Qt Widget。原因是winid的返回值的问题,在windows下会有点问题,在linux下以上的程序应该就没有问题。

2008年12月26日星期五

用Qprocess调用外部mplayer.exe

最简单的使用Qprocess调用外部mplayer.exe的方法,以下是一个简单的例子:

void MainWindow::showMplayer() { 
    const QString mplayerPath("D:/Download/MPlayer-1.0rc2/MPlayer-1.0rc2/mplayer.exe"); 
    QStringList args; 
    args << "D:/Documents and Settings/Project/release/test.avi"; 
    QProcess *myProcess = new QProcess; 
    myProcess->start(mplayerPath, args);
}

接下来,比较复杂,我不仅调用外部mplayer.exe的方法,而且还要将播放窗口放到Qt Widget。这时必须使用mplayer 的-wid参数,这可以将mplayer输出流重定向的指定的窗体(这里就是我们所要的Qt Widget)。同时我们也可以设定一些mplayer的参数。注意:QWidget::winId() returns an HWND not an int.所以要使用类似QString::number(reinterpret_cast<qlonglong>(wd->winId()))的语句。还有一点,mplayer的configure里的GUI必须disable,不然也无法将mplayer输出流定向到Qt Widget上。以下是一个简化的例子:

void MainWindow::showMplayer() { 
    QWidget *wd = new QWidget(this);
    const QString mplayerPath("D:/Download/MPlayer-1.0rc2/MPlayer-1.0rc2/mplayer.exe"); 
    QStringList args; 
    args << " -wid" << QString::number(reinterpret_cast<qlonglong>(wd->winId())); 
    args <<" D:/Documents and Settings/Project/release/test.avi"; 
    QProcess *myProcess = new QProcess(this); 
    myProcess->start(mplayerPath,args); 
    wd->show(); 
}

2008年12月24日星期三

GALS设计讨论(part2)flow control机制

前面讨论了ack requst 机制在GALS设计的应用。但是,GALS系统(这里假定一个简单的GALS系统由CLK_DOMAIN_A和CLK_DOMAIN_B组成并使用非同步FIFO作为两个DOMAIN的接口),常常需要使用到flow control机制,这时候就需要,flow control signal:例如:(ready, hold信号)。

使用HOLD信号,可以简单的是CLK_DOMAIN_A 保持了高电平。这时DOMAIN_A发送的DATA信号便保持了最后一个值不变,在DOMAIN_A里的模块,就保持“冻结”状态,只有当HOLD = '0' 时,“冻结”状态被解除。这里所谓的“冻结”状态有两个好处:

  1. 可以防止,系统时序的错乱,我做过几个实验,并没有采用flow control机制,仅仅采用ack requst 机制,当DOMAIN_B里的模块要从非同步FIFO系统需要读出数据时,要对DOMAIN_A发送ACK_A= '0'的信号,注意这里很容易会产生 系统时序的错乱。
  2. 可以节能 Energy Efficient。很简单,当DOMAIN_A里的模块,保持“冻结”状态时,这时模块就几乎不会耗能。

使用同样的原理,我们可以很容易地对DOMAIN_B里的模块控制,使其达到“冻结”状态,当往非同步FIFO里写入数据时。以下是一个 stretchable clock 的例子:

Example of the output from a stretchable clock

现在我们有了非同步FIFO(及其控制信号如WR_EN, RD_EN等等),flow control机制里的hold信号,ack requst 机制的ack request信号,我们可以快速的建立一个很简单的GALS系统。

经验:最好不要将ack requst 机制的ack request信号直接对非同步FIFO的控制信号如WR_EN, RD_EN进行控制,理论上是可以成功,但实践上会遇到很多譬如时序,延迟的问题。

比较聪明的解决方法是:建立一个INPUTINTERFACE(也可以叫做INPUTPORT)和一个OUTPUTINTERFACE(也可以叫做OUTPUTPORT)分别放在非同步FIFO两端,仅仅使用INPUTINTERFACE和OUTPUTINTERFACE的内部信号对FIFO进行控制。对于外部INPUTINTERFACE和OUTPUTINTERFACE控制和接受ack requst 机制的ack request信号,控制flow control机制里的hold信号。并且在INPUTINTERFACE和OUTPUTINTERFACE中放置一系列的flipflops和寄存器,对输出和输入信号还有数据进行“保护”。

本系列文章未完,待续。

2008年12月20日星期六

GALS设计讨论(part1)ack request机制

Handshake Protocol 是在硬件设计时,基础通信的协议。ack request信号的使用是其要点,这篇文章并不对其的基本原理进行讨论,这里着重对于ack request机制在GALS(全局非同步,局部同步系统)应用的讨论。

一般典型设计,以下是一个简单的示例:


模块1 模块2
| request_out |--> |request_in |
| ack_in |<-- |ack_out |

GALS系统设计,以下是一个简单的示例:

模块1 非同步FIFO控制模块 模块2
| request_out |--> |request_A(in) request_B(out)| --> |request_in |
| ack_in |<-- |ack_A(out) ack_B(in)| <-- |ack_out |

因为这里要使用到一个 “非同步FIFO控制模块”过渡,所以时序问题的考虑就特别重要,在多次的实验中,我发现 非同步FIFO控制模块 会使一些信号产生延迟,延迟问题常常是致命的,例如:当ack_A(out)无法在正确的时序给定给模块1时(常常,这个信号已经丢失了),模块1就会不断发送request_out信号,因为不能得到正确的ack_in 信号,整个系统就会停摆,或产生错乱。 这时要导入,几个一级flip flop来过滤信号的非稳定性,并要使对延迟进行严格控制。

Struktur der Synchronisierung der 1-Bit breite Kontrollsignale zwischen den Clock Domains

非同步FIFO控制模块有左右两侧接口。为了命名方便,左侧接口为request_A(in),ack_A(out),右侧则命名为B端。非同步FIFO控制模块的左右两端的信号接口,不仅是作为接口,起到链接作用,更为重要的是从模块1和2获得控制信号,并且通过输出信号ack_A(out) 和request_B(out)对模块1和2进行控制。模块1和2的输出信号request_A(in),ack_B(in),也可以进行对非同步FIFO的控制。

接下来讨论, 非同步FIFO控制模块的具体控制问题。

当非同步FIFO控制模块得到request_A(in)等于1时,说明(同一时间)有有效数据传输,这时将数据和request_A(in)信号输入寄存器,然后非同步FIFO从寄存器中读取数据,并发送 "ack_A(out) <= WR_ACK" 给模块1。

说明:WR_ACK是非同步FIFO的写入反馈信号,WR_EN是写使能信号。RD_ACK是非同步FIFO的读出反馈信号,RD_EN是读使能信号。

本文未完,待续。

2008年12月19日星期五

一些我读到的独到见解

"纯金每克20美元、Burberry的领带每克2.5美元、0.13微米制程的8英寸晶圆每克25美元,而IC设计产品每克可达76美元" -- 蔡明介 《竞争力的探求》节选

"计算机行业是唯一一个比女性时装界还要追逐概念和潮流的行业。"Oracle的拉里·埃利森

美国《大西洋月刊》甚至得出了一个有趣的结论——从郁金香球茎到潜藏复杂数学公式的次级贷,人类的天性就是发明一些自己都不明白的东西,然后用来毁灭自己。

附加:
“诸位,请问美国是什么? 美国就是一小部分聪敏绝顶的人,统治着大多数的傻瓜。 ” -- 郎咸平

本文未完,待续。

2008年12月15日星期一

gcc/g++

gcc/g++在执行编译工作-->总共需要4步
1.预处理,生成.i的文件[预处理器cpp]
2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]
3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
4.连接目标代码,生成可执行程序[链接器ld]

2008年12月12日星期五

在ModelSim中设定大型的Project的一些讨论

以下内容仅仅是举例说明,具体操作视具体项目而定。
举一个例:在ModelSim中设定大型的Project(看完会发现步骤很多):

在.mpf里修改project的路径,用新的地址代替旧的地址。

大型项目常常有储存电路,如果要使用memory进行模拟,先要加入.vhd文档到project里,然后还有要加入.mif 文档到ModelSim的项目目录里,这很重要,还有加入对应的mem_sim文档。
使用memory进行模拟,注意例如要在component里写上:
-- synopsys translate_off
MEM_FILE : string;
-- synopsys translate_on

在instantiation里写上
-- synopsys translate_off
MEM_FILE => "mem_sim/abcd" & str(abcd_NUM-1, 10, 1)& "/xyz" & str(num+1) & "/efgh",
-- synopsys translate_on
-->可以读出ModelSim的项目目录mem\abcd*\ xyz*\efgh的文档里的内容,*代表数字,我们可以通过一些设定设置数字,这里不详细说明。

写一个clean_libs.do和create_libs.do for ModelSim Transcript
clean_libs.do 例如:
vdel -lib work -all
vlib work
vmap work work等等

create_libs.do 例如:
vlib work
vmap work work等等
最后在ModelSim Transcript执行:do clean_libs.do 然后再执行do create_libs.do

对simulation文档进行设定,例如调整unisim的位置,等等。

本文未完,待续。

利用ffmpeg和sdl库播放视频经验

首先要设定Properties for Project: 在MinGW C Linker里-->Libraries --> 加入mingw32, SDLmain, SDL, avformat, avcodec, avutil,并设定想对应的正确的Library search path,在Directories里加入所需的Include path.
然后使用http://www.dranger.com/ffmpeg/tutorial02.c上的tutorial02.c这个例子。
接下来就可以编译和Build啦,(对了,在Build artifact里Artifact Type选用Shared Library或Executable都可以 )。
最后在Command Prompt里进入debug目录输入:例如:projectname.exe examplevideo.avi 就可以播放视频了,实在很简单吧。

最后,推荐一个网站:http://www.arjanhouben.nl/SDL_ffmpeg/

2008年12月9日星期二

Ffmpeg的使用, Eclipse gdb

如果是用C++的话,然后进入Project Properties-->设置好include和lib linker。然后进行编译,如果有问题,无法编译例如avcodec.h里的内容或编译avcodec.h里的内容出错(这常常发生),那么就要点击这个project,然后点击鼠标右键选Open Declaration或按F3。进入可见#include "libavutil/avutil.h"之类的声明,注意这里的#include路径和我们在Project Properties-->设置好include路径是不同的。解决它的最好方法就是,在Project Properties-->include,多设一个路径以满足其要求,例:加上"C:\DA_SDK\ffmpeg-export-snapshot"。
gdb简单的说是一个Debug工具。
MinGW自己并不配gdb,必需自己下载,并安装。注意:必须下载一个6.6版本,或以下版本的,6.8版本的不能在Eclipse中使用,至少现在是这样的。http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=20507 可以直接下载已编译的版本,直接可以使用,吧BIN的exe拷贝到MinGW的bin里就可以,也可以把include里的.h拷贝到MinGW的include里。
现在终于可以进行Debug了。选择Project按鼠标右键,选Debug As --> Open Debug Dialog -->
在Environment例如:new --> Name: PATH Value: C:\DA_SDK\ffmpeg-export-snapshot\lib_dll;%PATH%。
在Debugger里:例如:Debugger: 选MinGW gdb Debugger 在Main: GDB debugger: C:\MinGW\bin\gdb.exe,其他选项可以保持不变。
现在可以进行Debug了,可以点击Elcipse工具条上的小虫,然后进入Debug环境。



2008年12月8日星期一

Ffmpeg构建和编译 续

在ffmpeg构建和编译的过程中我也遇到了一些问题,单凭网上的帮助还是不够的,我把我的解决方案记下来,希望能帮助后来人。
当完成了我上一篇文章的所有步骤后,在MSYS中输入./configure --enable-memalign-hack,若遇到这个错误:“./configure: line 221: pr: command not foundss”
The standard MSys install doesn't come with pr. You need to get it from the coreutils package. 下载coreutils-5.97-MSYS-1.0.11-snapshot.tar并解压,将bin里的文档拷贝到C:\msys\1.0\bin里,这样这个问题就可以解决。
若我们的MSYS的make.exe 的版本例如是make3.79.exe,有在./configure后进行make可能会遇到不能运行的问题,解决这个问题的方法是升级MSYS的make.exe的版本。我这里是升级到make-3.81-MSYS-1.0.11-2版本。
如果输入./configure --enable-memalign-hack后输入make,会生成.a文档,也就是“静态库”,例如: avformat.a \ avcodec.a \ avutil.a
以下转自:http://donaldtc.blogspot.com/2007/05/ffmpeg_22.html
如果希望使用FFmpeg包含的libavcodec库开发多媒体文件处理程序,还需要编译libavcodec的dll动态链接库,编译过程和上述过程稍有差别,如下所述: 首先切换到FFmpeg的源代码目录,在开始编译前先使用"make distclean"清理上一次留下的中间文件,然后向configure脚本多传递两个参数./configure --enable-shared --disable-static --enable-memalign-hack 最后执行"make"命令就可以了。
我因为需要swscale-0.dll,所以我的configure为:
./configure --enable-shared --enable-gpl --enable-swscale --enable-memalign-hack
这个已经可以满足一般的使用。
./configure --help 后你也可以根据自己的需要调整./configure
如果你需要Building FFplay,可以参考以下说明:http://ffmpeg.arrozcru.org/wiki/index.php?title=Building_FFplay

2008年12月4日星期四

一些小问题

int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);

函数说明:最多从源串中拷贝 n 1 个字符到目标串中,然后再在后面加一个 0 。所以如果目标串的大小为 n 的话,将不会溢出。函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。

_snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId());
//snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId());
snprintf函数并不是标准c/c++中规定的函数,但是在许多编译器中,厂商提供了其实现的版本。
在gcc中,该函数名称就snprintf,而在VC中称为_snprintf。但是我在编译的过程中,使用_snprintf就不会出现warning,若使用snprintf则会出现warning。

qmake 不会处理.cpp文件里的Q_OBJECT,所以,如果在.cpp文件中有它的话,也会产生undefined reference to vtable for "xxx::xxx". 这时,需要先用moc xxxx.cpp生成相应的moc文件,再包含到.cpp里面去,才能解决这个问题.
要解决上面的问题
如果分开, 可能就没问题, 包括 h和 cpp 分开。在你main.cpp 最后加一行 #include "main.moc" from:http://blog.donews.com/netexe/archive/2006/02/09/720544.aspx

from: http://lists.mplayerhq.hu/pipermail/ffmpeg-user/2007-March/007669.html
The correct order is -lavformat -lavcodec -lavutil. It doesnt matter 
when you use dynamic linking, but with static libs it does, because ld
does *not* scan static libraries repeatedly, only once (that is, once
per -l option).

#include
#include // < > 代表是用.PRO INCLUDEPATH引用的
#include "mediaplayer.h" // " " 代表是在现存Project中的文档

如何在C++中调用已经被编译好的C函数?这时必须采用“混合编译”,例如:
extern "C"
{
#include
#include
}
这里调用了ffmpeg的头文件avformat.h和avcodec.h,为了解决C++不能编译C的问题,
这里必须加在extern"C"里。原因:例如函数abcd()被C编译器编译后在库中的名字为_abcd,
而C++编译器则会产生_abcd_int_int之类的名字用来支持
函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C函数。
C++提供了一个C连接交换指定符号extern “C” 来解决这个问题。

2008年12月3日星期三

创建ON CHIP测试,我的标准步骤

设置的一般步骤:
  1. create Xilinx ChipScope Core chipscope_icon and chipscope_ila, then put them into ISE directory
  2. add component chipscope_icon and chipscope_ila_1 in Top entity, for example: fpga_right
  3. set the CONTROL, DATA and TRIG signals for the component chipscope_ila, the CONTROL comes from the component chipscope_icon, DATA is the signals, which is important and you want to see, for example, I take the signals from the NCORE_adr(the address from the Processors), for TRIG, I use a trigger_proc or use TRIG <= (not ncore_ta) & ncore_r_w;
  4. maybe set some LED signals for show the RESET signals, to see, if the program "Init_Raptor" works
  5. use lb_interface(for the communication with the Computer) in the Top entity
  6. use a "Init_Raptor", which made of MFC to set the Reset signal --> Init and Reset
  7. now you can use the ChipScope Analyze to do the on chip test
接下来,进行综合,并进行设置:
for Xilinx ISE setting here only for the Studienarbeit(GALS system testing):

Synthesis Properties:
by Synthesis Options: Cross Clock Analysis --> yes
by Xilinx Specific Options: Optimize Instantiated Primitives --> yes

Map Properties:
Trim Unconnected Signals --> yes, Replicate Logic to Allow Logic Level Reduction --> yes, Allow Logic Optimaization Across Hierarchy --> yes,
Use RLOC Constrains --> yes, Pack I/O Register/Latches into IOBs --> For Inputs and Outputs, Map Slice Logic into Unused Block RAMs --> yes
注意:将ISE Project中的所有的无关的.vhd删除,并且加入少的.vhd和.v的文档,让Project简单和其他文档无关,互不影响,只保留有用的文档。注意.ucf很重要,必须直接加入到Project中去,不能和Top entity外部相连。

使用ChipScope:
ChipScope_data <=ncore_addr_top (所需要引出的数据);
ChipScope_trigger <=(not ncore_ta) and (ncore_rw) (给定的trigger条件);

注意使用,如下的语句:
-- synopsys translate_off
在这里面的语句将不参与综合
-- synopsys translate_on

开始改用SVN啦

http://www.ibm.com/developerworks/cn/opensource/os-ecl-subversion/
这个文章介绍了如何结合使用 Subversion 和 Eclipse,很完整。
接下来,简单介绍一下,我对SVN的使用心得:
这里只谈Eclipse:
首先,如同上面给的链接的做法,完成前期设定。
然后Windows --> Open Perspective --> Other... --> SVN Repository Exploring
这时可以对SVN Repository 进行修改。(也可以点击Eclipse右上角的图标进行Perspective 的改变)
--> New --> New Remote Folder
--> 建立自己的项目目录
然后 --> 进行分支设定(以下部分内容来自互联网)
+-trunk 保存项目开发的主线。
+-branches 保存项目的各种开发分支。
+-tags (保存项目的标签,也就是创建后永远不会修改的分支,例如发布release版本,它是某个项目,某个时间的一个快照,每次提交一个修订版本其实都是一个精确的快照。)

简单的说:就是-->trunk为主开发目录,branches为分支开发目录,tags为tag存档目录(不允许修改)。

附注:
常用分支模式: 转载自:http://blog.csdn.net/windone0109/archive/2008/09/10/2908117.aspx
a、发布分支:在代码发展到一定阶段,建立发布分支,将当前的一个版本取出来,拷贝到branches目录下,进行全面严酷的测试,如发现BUG则在当前版本进行修复,并同步更新trunk中的BUG,经测试完成后,将文件拷贝到tags目录中发布,并提交给客户。
b、特性分支:如果需要作复杂的修改,会影响到trunk代码的稳定性,则建议建立一个特性分支,等特性稳定之后,再和truck主干合并。
------------------------------------------------------
NOW使用trunk作为主要的开发目录。
一般的,我们的所有的开发都是基于trunk进行开发,当一个版本/release开发告一段落(开发、测 试、文档、制作安装程序、打包等)结束后,代码处于冻结状态(人为规定,可以通过hook来进行管理)。此时应该基于当前冻结的代码库,打tag。
当下一 个版本/阶段的开发任务此时,如果发现了上一个已发行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在开发的版本(Developing Version)无法满足时间要求,这时候就需要在上一个版本上进行修改了。应该基于发行版对应的tag,做相应的分支(branch)进行开发。开始,继续在trunk进行开发。

待一切都搞定后,现在可以开始使用SVN进行版本控制啦。
右击Project在 Eclipse 的项目视图,并且从菜单中选择 Team --> Share Project, 选择 SVN,然后单击 Next --> 接下来就很简单了,这里不再说明。
值得注意的是:如果将文件添加到项目中,它不会自动成为版本控制的一部分 —— 需要明确将其添加到特定的存储库中右击新文件,然后选择 Team --> Add to Version Control
当然了,我们也可以进行,“更新项目” 版本控制系统的重要特性之一是其他开发人员能够随时继续开发,并在准备好时提交其变更,但是我现在只是一个人进行编程,暂时不需要用到这个功能。这个功能可以下载这些变更,并将其与本地副本集成。 右击要更新的项目,然后从菜单中选择 Team --> Update。Eclipse 将从存储库中检索任何变更,并尝试将它们与本地副本合并。
对我们来说重要的功能是“提交更改” 如果确定了新的代码可以编译,并且已经对变更进行测试,这时就可以把它们放入Subversion 存储库。右击项目,并从菜单中选择 Team --> Commit。Eclipse 会显示一个 Commit 对话框。
SVN还有很多很好的功能,具体请看IBM的帮助文档。

现在谈谈SVN for Window的最最简单用法,先下载一个SVN的Window版本,然后安装。选中你所要check out 的文档,按鼠标右键,选SVN Checkout,在URL of repository里填上你的路径(这个路径你可以用例如http:/.../trunk/abcd/),自己创建一个Checkout directory,然后点OK。接下来,你就有一个带SVN标志的文件夹,你可以把你所要进行文档版本管理的文件放入这个文件夹里,现在就是最后一步啦,点击这个文件夹,点击鼠标右键然后点SVN Commit,完成了,这时文档就上传到.../trunk/abcd/里去了。

2008年12月2日星期二

编译FFmpeg

MinGW: A collection of freely available and freely distributable Windows specific header files and import libraries, augmenting the GNU Compiler Collection, (GCC), and its associated tools, (GNU binutils). MinGW provides a complete Open Source programming tool set which is suitable for the development of native Windows programs that do not depend on any 3rd-party C runtime DLLs.
MSYS: A Minimal SYStem providing a POSIX compatible Bourne shell environment, with a small collection of UNIX command line tools. Primarily developed as a means to execute the configure scripts and Makefiles used to build Open Source software, but also useful as a general purpose command line interface to replace Windows cmd.exe.

详细请见:FFmpeg编译指南
http://donaldtc.blogspot.com/2007/05/ffmpeg_22.html

准备MSys+MinGW系统 -->获取FFmpeg (不用SVN方式的到直接下载一个ffmpeg-export-snapshot.tar: bare sources) --> 编译(启动MSys --> "cd /C/ffmpeg" --> ./configure --enable-memalign-hack --> make --> ... ... ) --> 也可加入对第三方库的支持, 重复编译步骤,只是加入更多的东东 ./configure --enable-static --enable-shared --enable-bla bla --enable-bla bla bla 然后 make ... ... --> 在Qt+MinGW链接,配置的工作和以前配置SDL时一样 --> ... ...

# ./configure \
'--prefix=/usr' \
'--enable-gpl' \
'--enable-shared' \
'--enable-mp3lame' \

... ...
'--disable-ffserver'
# make
# make install

在configure 不要加 --disable-ffplay 就会同时安装ffplay。
典型的 Desktop (PC) 使用 - ffplay + SDL

附加:
如何uilding ffmpeg for Windows with MSYS and MinGW(在windows里构件ffmpeg用MSYS和MinGW)。
1.先下载最新的MinGW:
http://sourceforge.net/project/showfiles.php?group_id=2435
2.下载MSYS和它的bash
3.下载最新的ffmpeg
  1. 安装 MinGW (choose “MinGW base tools” and “MinGW make”) 到 c:\mingw
  2. 安装 MSYS 到 c:\msys\1.0
  3. 在MSYS安装后,回答一下几个问题:
    Do you wish to continue with the post install? [yn ] -> y
    Do you have MinGW installed? [yn ] -> y
    Where is your MinGW installation? -> C:/mingw
  4. 将 bash-2.05b-MSYS.tar.bz2 拷到 c:\msys\1.0 and 并解压缩 (bash.exe 和 sh.exe必须放到 C:\MSYS\1.0\bin里).
    我们要这么做是因为ffmpeg’s configure script不能在MSYS自配的bash 2.0.4下工作。
  5. 解压ffmpeg
然后使用MSYS进入ffmpeg目录,执行./configure 并做一些设定,一切OK,执行make。

-->其实更本不用那么麻烦,直接下载FFMPEG的SDK就可以使用了,很方便,编译太麻烦,如果搞不定,还很浪费时间呢。
http://www.ffmpeg.com.cn/index.php/SDK_Download