Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿

FFmpeg是在Linux平台下开发的,但它同样也可以在其它操作系统环境中编译运行,本文介绍的就是在windowsXP下编译FFmpeg。
一 准备环境:

1 下载 mingw 和 MSYS

去 http://sourceforge.net/projects/mingw/  下载

A 点击“DownLoad mingw-get-inst-...exe”;

B 切换到页面:download? Check your browser's security bar, or try a direct link, or try another mirror. ;

C 点击“direct link”下载类似:mingw-get-inst-20110802.exe 的文件。

提示:msys此处就不用下载了,mingw-get-inst-20110802.exe 中已经包含了msys1.0,后面安装的时候就可以看到该选项。

2 下载 yasm

ffmpeg编译里面的汇编代码需要yasm.exe  

去官网:http://yasm.tortall.net/Download.html 下载

直接下载:Win32 .exe (for general use on 32-bit Windows)

文件名为:yasm-1.1.0-win32.exe

3 下载 ffmpeg

ffmpeg可以到 http://www.ffmpeg.org/releases/ 下载

本人选择的是最新版本:ffmpeg-0.8.5.tar.gz

文件名为:ffmpeg-0.8.5.tar.gz

4 下载 SDL

SDL下载可以到:http://www.libsdl.org/download-1.2.php

选择:SDL-1.2.14.tar.gz - GPG signed

此版本需要自己编译,后面会解释为什么下载该版本,而不下载编译好的SDL-devel-1.2.14-mingw32.tar.gz (Mingw32)

5 下载 pthreadGC2.dll
pthreadgc2.dll 是功能强大的处理数字化影视作品编辑软件premiere6运行所需的一个DLL文件。这是一个无威胁文件。属于Open Source Software community project的文件。直接去baidu.com三搜索下载就可以了。

二 编译步骤

1 安装 mingw 和 msys

    执行下载文件:mingw-get-inst-20110802.exe,

    在第3步选择“Download latest repository catalogues”

    选择安装路径:C:\MinGW(我直接采用默认路径,未做修改)

    在“Select Components”步骤中选择:

    √  C Compiler (默认且一定选择)

    √  C++ Compiler

    √  MSYS Basic System(选择此项将会安装msys,msys则不需要另外安装)

    √  MinGW Developer ToolKit

    等待安装完成!(需要等待一定的时间,因为安装过程需要下载文件,可想而知,网速越快,安装越快)

    安装完成后,在C:\MinGW目录下可以看到 msys 文件夹,msys也已经安装。

2 配置 msys.bat 批处理文件

    为了方便VS200X以及VS2010调用ffmpeg的动态库,可以通过配置让ffmpeg编译时产生windows下调用dll对应的lib,当然,如果你没有这个需要,那么就可以省略以下处理,直接进入步骤3。

    进入:C:\MinGW\msys\1.0\文件夹,使用UltraEdit打开msys.bat文件,在文件的最最前面加入如下一行:

    call "D:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"

    其中“D:\Program Files\Microsoft Visual Studio 10.0”为你机器上安装VS200X或VS2010的目录,我的电脑安装的是VS2010,并且安装在了D盘。文件修改后保存即可。

3 配置 yasm

    为了减少配置环境变量的麻烦,本处直接把 yasm-1.1.0-win32.exe 文件名修改成:yasm.exe,并放到系统目录下:C:\WINDOWS\system32。

4 解压ffmpeg 与 SDL

    ffmpeg-0.8.5.tar.gz 的解压目录您可以直接选择,本人解压到:D:\ffmpeg中,解压后目录为:D:\ffmpeg\ffmpeg-0.8.5

    SDL-1.2.14.tar.tar 解压到 D:\ffmpeg\ffmpeg-0.8.5 目录下,解压后的目录结构为:D:\ffmpeg\ffmpeg-0.8.5\SDL-1.2.14

5 编译SDL

    双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,

    切换到SDL目录:D:\ffmpeg\ffmpeg-0.8.5\SDL-1.2.14,切换方法如下:

    $ cd /d

    $ cd ffmpeg

    $ cd ffmpeg-0.8.5

    $ cd SDL-1.2.14

    再执行以下命令:

    $ ./configure --prefix=/usr 回车等待…

    $ Make 回车等待…

    $ make install 回车等待…

    编译完成后,在C:\MinGW\msys\1.0的bin、include和lib文件夹下可以看到编译结果。

    直接编译ffmpeg时,发现未生成ffplay.exe,

    configure的时候提示信息如下:

    SDL support  no

    所以需要开启SDL,本人头天接触这东西,不知道使用什么方法可以开启,但通过编译SDL后

    SDL support  yes

    如果你的 SDL 已经是开启状态,你可以直接使用下载中提到的编译好的压缩包SDL-devel-1.2.14-mingw32.tar.gz,直接解压,并把解压包中的 bin、include和lib文件夹中的文件复制到D:\ffmpeg\ffmpeg-0.8.5,与步骤六相同,只是不在从C:\MinGW \msys\1.0中复制。

6 拷贝编译结果:

    C:\MinGW\msys\1.0  到 c:/mingw下 覆盖

    bin下的SDL.dll、sdl-config拷贝到 bin中

    include下的 SDL文件夹拷贝到 include中

    lib下的libSDL.a、libSDL.dll.a、libSDL.la和libSDLmain.a拷贝到 lib中

7 修改sdl-config配置文件

    使用UltraEdit打开D:\ffmpeg\ffmpeg-0.8.5\bin下的 sdl-config文件

    把 prefix=/usr 该成: prefix=c:/mingw

    其中:c:/mingw 为 mingw的安装路径,请根据你的安装进行修改。

8 编译 ffmpeg

    双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,

    切换到SDL目录:D:\ffmpeg\ffmpeg-0.8.5\SDL-1.2.14,

    切换方法如下:

    $ cd /d

    $ cd ffmpeg

    $ cd ffmpeg-0.8.5

    如果你的“MinGW32”没有关闭,可以直接切换路径到:D:\ffmpeg\ffmpeg-0.8.5。

    再执行以下命令:

    $ ./configure --enable-shared --disable-static --enable-memalign-hack

    请耐心等待一段时间

  $ make

   需要等待很长一段时间,等待编译结束。


    为了汇总编译结果,请继续执行以下命令:

    $ make install

    等待完成,在C:\MinGW\msys\1.0\local中将会生成 bin、include、lib等文件夹,其中包含了ffmpeg.exe、ffplay.exe、ffprobe.exe、dll、lib和头文件等。

9 运行测试

直接双击运行”ffplay.exe”,如果提示没有“pthreadGC2.dll”文件,你可以包“pthreadGC2.dll”直接拷贝到当前目录,也可放到系统目录C:\WINDOWS\system32中。
avcodec.lib avformat.lib swscale.lib avutil.lib
posted @ 2012-12-29 19:53 ccsdu2009 阅读(4467) | 评论 (0)编辑 收藏
 
from lxml import etree

root 
= etree.parse('xml.xml').getroot()

itr 
= root.iter()
for i in itr:
    
print 'node:' + i.tag
    att 
= i.keys()
    
for j in att:
        
print 'attrib:' + j,i.get(j)
posted @ 2012-12-14 19:35 ccsdu2009 阅读(463) | 评论 (0)编辑 收藏
 
import glob
import io

file 
= open('out.txt','w')

for filename in glob.glob("E:\\*.cpp"):
    str 
= '@'
    str 
+= filename
    str 
+= '@\n'
    file.write(str)

file.close()
posted @ 2012-11-10 18:53 ccsdu2009 阅读(502) | 评论 (0)编辑 收藏
 
1.对于读二进制文件,必须使用rb模式
如果使用r模式,那么在fread的时候可能会出现读取字节为0的情况
2.如果是写二进制文件,必须使用wb模式
否则写成的文件可能存在异常
posted @ 2012-10-11 21:22 ccsdu2009 阅读(398) | 评论 (0)编辑 收藏
 
1. &amp  空格
2. %27   '
3. %28  (
4 %29   )
4 %2C  .
posted @ 2012-10-09 22:12 ccsdu2009 阅读(275) | 评论 (0)编辑 收藏
 
    QTranslator* translator = new QTranslator(NULL);
    translator->load("prj_zh.qm");
    app.installTranslator(translator);

使用linguist.exe即可把ts文件转换为qm语言资源文件
posted @ 2012-09-09 11:53 ccsdu2009 阅读(1306) | 评论 (0)编辑 收藏
 
很简单的 QSound::play(filename).
posted @ 2012-09-02 18:33 ccsdu2009 阅读(1960) | 评论 (1)编辑 收藏
 
QFileInfo类提供了与系统无关的文件信息,它能提供以下信息:
1.文件和文件路径
2.存取权限,以及文件是否为目录或符号链接
3.文件大小和最后的读取时间
4.QFileInfo可以使用相对路径或绝 对路径。
5.要判断一个函数是否存在,使用exits()函数,文件大小可以通过size()函数获取,文件类型可以通过isFile(),isDir(),isSymLink()来获 取,symLinkTarget()函数返回符号链接所指向的真正文件名。

值得说明的是QFileInfo支持从资源获取文件.
posted @ 2012-08-13 21:27 ccsdu2009 阅读(1009) | 评论 (0)编辑 收藏
 
如下只允许输入数字和字母切长度为九
    QRegExp regx("[a-zA-Z0-9]{9}");
    QValidator
* validator = new QRegExpValidator(regx,this);

    edit   
= new QLineEdit();
    edit
->setValidator(validator);
posted @ 2012-08-01 20:56 ccsdu2009 阅读(872) | 评论 (0)编辑 收藏
 
效果不太明显
class StateMachine : public QWidget
{
    Q_OBJECT
public:
    StateMachine(QWidget 
*parent = 0, Qt::WFlags flags = 0);
    
~StateMachine();
private:
    
void createWidget();
private:
    QStateMachine
* machine;
    QState
*        state1;
    QState
*        state2;

    QLayout
*       layout;

    QLineEdit
*     edit1;
    QPushButton
*   button1;
    QLineEdit
*     edit2;
    QPushButton
*   button2;
};

StateMachine::StateMachine(QWidget *parent, Qt::WFlags flags):
QWidget(parent,flags)
{
    machine 
= new QStateMachine;
    state1 
= new QState(machine);
    state2 
= new QState(machine);
    createWidget();
}

StateMachine::
~StateMachine()
{
}

void StateMachine::createWidget()
{
    layout 
= new QHBoxLayout(this);
    edit1 
= new QLineEdit("QLineEdit1");
    button1 
= new QPushButton("Click1");
    
    edit2 
= new QLineEdit("QLineEdit2");
    button2 
= new QPushButton("Click2");
    edit2
->setVisible(false);
    button2
->setVisible(false);

    layout
->addWidget(edit1);
    layout
->addWidget(button1);
    layout
->addWidget(edit2);
    layout
->addWidget(button2);
     
    state1
->assignProperty(edit2,"visible",false);
    state1
->assignProperty(button2,"visible",false);
    state1
->assignProperty(edit1,"visible",true);
    state1
->assignProperty(button1,"visible",true);
    machine
->setInitialState(state1);

    state2
->assignProperty(edit1,"visible",false);
    state2
->assignProperty(button1,"visible",false);
    state2
->assignProperty(edit2,"visible",true);
    state2
->assignProperty(button2,"visible",true);

    QPropertyAnimation
* ani = new QPropertyAnimation();
    ani
->setDuration(2000);
    ani
->setEasingCurve(QEasingCurve::InOutExpo);   

    QSignalTransition 
*transition1=state1->addTransition(button1,SIGNAL(clicked()),state2);    
    transition1->addAnimation(ani);
    QSignalTransition 
*transition2=state2->addTransition(button2,SIGNAL(clicked()),state1);
    transition2
->addAnimation(ani);
    machine
->start();  
}
posted @ 2012-07-30 23:09 ccsdu2009 阅读(1076) | 评论 (0)编辑 收藏
仅列出标题
共38页: First 11 12 13 14 15 16 17 18 19 Last