要真正给FFmpeg编写一个完全的前端界面,工作量无疑是巨大的,因为FFmpeg涉及到对多种格式转化,以及多个选项参数的选择,这
些额外的组件以及不断改变的选项的参数,使得编写一个FFmpeg的前端界面变得尤为复杂,所以这里我们只是涉及到了一些基本音视频格式的转化,以及几个
比较常见的选项参数的设置,在FFmpeg中对于转化成运行在不同设备上每种不同格式的一些选项参数都是固定的,只有少数的几种选项是可供我们来改变的,
所以我们将要转化的目标设备以及一些可供改变的参数开放出来供用户改变,并且同样也会将FFmpeg的输出结果显示出来。
具体在Qt中利用Designer来如何设计页面,这里就不一一细说,只介绍几个关键的槽。
在Qt界面上我们是采用QProcess来运行外部的FFmpeg程序,我们只需要构建FFmpeg命令的参数,然后调用QProcess的start函数就可以运行FFmpeg。
在这里我们以利用FFmpeg转换成适合在PSP设备上运行的视频文件为例,我们已经找到用于转换运行在PSP上的视频的最佳FFMEPG命令是: ffmpeg -i space.mpg -vcodec libxvid -s 320x240 -r 29.97 -b 1500 -acodec libfaac
-ac 2 -ar 24000 -ab 65535 -f psp M4V80113.mp4 -y
我们会根据所选择的目标设备来给参数选择的组合框中设置多个可供选择的选项:
- "color: rgb(0, 0, 255);">void MainWindow"color: rgb(0, 128, 128);">::"color: rgb(0, 119, 136);">setPSP"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)
- "color: rgb(0, 128, 0);">{
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboResolution"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>clear"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboFramerate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>clear"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboBitrate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>clear"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboSamplerate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>clear"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboAbitrate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>clear"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboResolution"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>addItem"color: rgb(0, 128, 0);">("color: rgb(255, 0, 0);">"240x320""color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboResolution"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>addItem"color: rgb(0, 128, 0);">("color: rgb(255, 0, 0);">"160x120""color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboFramerate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>addItem"color: rgb(0, 128, 0);">("color: rgb(255, 0, 0);">"29.97""color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboBitrate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>addItem"color: rgb(0, 128, 0);">("color: rgb(255, 0, 0);">"1500""color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboSamplerate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>addItem"color: rgb(0, 128, 0);">("color: rgb(255, 0, 0);">"2400""color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboAbitrate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>addItem"color: rgb(0, 128, 0);">("color: rgb(255, 0, 0);">"65535""color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>lineEdit_2"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>setText"color: rgb(0, 128, 0);">("color: rgb(255, 0, 0);">"M4V80113.mp4""color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
-
- "color: rgb(0, 128, 0);">}
void MainWindow::setPSP()
{
ui->comboResolution->clear();
ui->comboFramerate->clear();
ui->comboBitrate->clear();
ui->comboSamplerate->clear();
ui->comboAbitrate->clear();
ui->comboResolution->addItem("240x320");
ui->comboResolution->addItem("160x120");
ui->comboFramerate->addItem("29.97");
ui->comboBitrate->addItem("1500");
ui->comboSamplerate->addItem("2400");
ui->comboAbitrate->addItem("65535");
ui->lineEdit_2->setText("M4V80113.mp4");
}
- "color: rgb(0, 128, 0);">在用户设置好了一些参数之后,我们就要进行转换了,可以看到在执行槽中我们更多的是构建FFmpeg命令的选项参数:
在用户设置好了一些参数之后,我们就要进行转换了,可以看到在执行槽中我们更多的是构建FFmpeg命令的选项参数:
- "color: rgb(0, 128, 0);">
"code" class="cpp" style="font-family: monospace;">"color: rgb(0, 0, 255);">void MainWindow"color: rgb(0, 128, 128);">::"color: rgb(0, 119, 136);">executeCommand"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)
- "color: rgb(0, 128, 0);">{
- QStringList args"color: rgb(0, 128, 128);">;
-
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-i""color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>lineEdit"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>text"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-y""color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-s""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboResolution"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>currentText"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-r""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboFramerate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>currentText"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-b""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboBitrate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>currentText"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-ar""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboSamplerate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>currentText"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-ab""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboBitrate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>currentText"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>lineEdit_2"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>text"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
-
- "color: rgb(0, 0, 255);">if "color: rgb(0, 128, 0);">(ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>radioButton"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>isChecked"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">{
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-vcodec""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"libxvid""color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-acodec""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"libfaac""color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-ac""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"2""color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-f""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"psp""color: rgb(0, 128, 128);">;
- "color: rgb(0, 128, 0);">}
- commandProcess."color: rgb(0, 119, 136);">start"color: rgb(0, 128, 0);">("color: rgb(255, 0, 0);">"ffmpeg", args"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
-
- "color: rgb(0, 128, 0);">}
"code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">根据用户的选择来构建多个选项的值。最后调用QProcess的start函数来运行FFmpeg命令,有一点非常重要,start函数中提到的FFmpeg命令从哪里来 "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">我们在上一次讲到在QT中调用Mplayer时,我们是下载了Mplayer的windows版本,然后在里面找到Mplayer的可执行文件,所以我们还需要得到FFmpeg "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">在windows下的可执行文件,这样才能执行,这样就涉及到在windows下如何来编译出ffmpeg.exe(当然你也可以直接到网上找编译好了的ffmpeg.exe然后放置在工程的当前文件下)。 "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">在后面将会具体介绍如何来在windows下编译出ffmpeg.exe文件。 "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">有时候虽然结合前端的图形界面我们可以不用在考虑复杂的选项参数,也不用去在意FFmpeg运行时的输出信息,只需要得到指定格式的目标文件即可,但是 "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">有时候我们也需要了解FFmpeg在运行时的输出信息以及可能的出错信息,这一点QProcess也为我们提供了专门的信号和函数来获取到执行命令的 "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">输出信息和可能的出错信息。 "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">"code" class="cpp" style="font-family: monospace;">connect "color: rgb(0, 128, 0);">("color: rgb(0, 0, 64);">&commandProcess, SIGNAL"color: rgb(0, 128, 0);">(readyReadStandardOutput"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">),"color: rgb(0, 0, 221);">this, SLOT"color: rgb(0, 128, 0);">(outputCommand"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- connect "color: rgb(0, 128, 0);">("color: rgb(0, 0, 64);">&commandProcess, SIGNAL"color: rgb(0, 128, 0);">(readyReadStandardError"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">),"color: rgb(0, 0, 221);">this, SLOT"color: rgb(0, 128, 0);">(outputCommand"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
"code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 128);">当QProcess的标准输出和标准出错上有数据可读时,它就会发出readyReadStandardOutput()和readyReadStandardError()信号,我们利用一个槽函数 "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 128);">来处理这两种信号。 - "color: rgb(0, 128, 128);">
"code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 0, 255);">void MainWindow"color: rgb(0, 128, 128);">::"color: rgb(0, 119, 136);">outputCommand"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">) - "color: rgb(0, 128, 0);">{
- QByteArray cmdoutput "color: rgb(0, 0, 128);">= commandProcess."color: rgb(0, 119, 136);">readAllStandardOutput"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- QString txtoutput "color: rgb(0, 0, 128);">= cmdoutput"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>textBrowser"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>append"color: rgb(0, 128, 0);">(txtoutput"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- cmdoutput "color: rgb(0, 0, 128);">= commandProcess."color: rgb(0, 119, 136);">readAllStandardError"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- txtoutput "color: rgb(0, 0, 128);">= cmdoutput"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>textBrowser"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>append"color: rgb(0, 128, 0);">(txtoutput"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
-
- "color: rgb(0, 128, 0);">}
"code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">从QProcess读出命令运行的输出信息和出错信息并显示出来。 "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">现在再讲讲如何来在windows上编译出ffmpeg.exe,当然编译后产生的目标文件格式可以是多种多样,这取决于我们的程序如何来调用FFmpeg "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">如果在程序中我们动态的调用FFmpeg,则需要编译成FFmpeg的动态库dll,头文件.h等,但在这里我们是直接调用的FFmpeg的可执行文件,所以我们需要 "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">编译出ffmpeg.exe文件。 -
"code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">"color: rgb(0, 128, 128);">1.安装MSys
到"">
/project/showfiles.php?group_id=2435下载文件:
bash-3.1-MSYS-1.0.11-tar.bz2
msysCORE-1.0.11-2007.01.19-1.tar.bz2 -
- "color: rgb(0, 0, 255);">void MainWindow"color: rgb(0, 128, 128);">::"color: rgb(0, 119, 136);">executeCommand"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)
- "color: rgb(0, 128, 0);">{
- QStringList args"color: rgb(0, 128, 128);">;
-
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-i""color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>lineEdit"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>text"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-y""color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-s""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboResolution"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>currentText"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-r""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboFramerate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>currentText"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-b""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboBitrate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>currentText"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-ar""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboSamplerate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>currentText"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-ab""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>comboBitrate"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>currentText"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>lineEdit_2"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>text"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
-
- "color: rgb(0, 0, 255);">if "color: rgb(0, 128, 0);">(ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>radioButton"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>isChecked"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">{
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-vcodec""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"libxvid""color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-acodec""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"libfaac""color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-ac""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"2""color: rgb(0, 128, 128);">;
- args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"-f""color: rgb(0, 128, 128);">; args "color: rgb(0, 0, 128);"><< "color: rgb(255, 0, 0);">"psp""color: rgb(0, 128, 128);">;
- "color: rgb(0, 128, 0);">}
- commandProcess."color: rgb(0, 119, 136);">start"color: rgb(0, 128, 0);">("color: rgb(255, 0, 0);">"ffmpeg", args"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
-
- "color: rgb(0, 128, 0);">}
void MainWindow::executeCommand()
{
QStringList args;
args << "-i";
args << ui->lineEdit->text();
args << "-y";
args << "-s"; args << ui->comboResolution->currentText();
args << "-r"; args << ui->comboFramerate->currentText();
args << "-b"; args << ui->comboBitrate->currentText();
args << "-ar"; args << ui->comboSamplerate->currentText();
args << "-ab"; args << ui->comboBitrate->currentText();
args << ui->lineEdit_2->text();
if (ui->radioButton->isChecked()){
args << "-vcodec"; args << "libxvid";
args << "-acodec"; args << "libfaac";
args << "-ac"; args << "2";
args << "-f"; args << "psp";
}
commandProcess.start("ffmpeg", args);
}
- "color: rgb(0, 128, 0);">根据用户的选择来构建多个选项的值。最后调用QProcess的start函数来运行FFmpeg命令,有一点非常重要,start函数中提到的FFmpeg命令从哪里来
根据用户的选择来构建多个选项的值。最后调用QProcess的start函数来运行FFmpeg命令,有一点非常重要,start函数中提到的FFmpeg命令从哪里来
- "color: rgb(0, 128, 0);">我们在上一次讲到在QT中调用Mplayer时,我们是下载了Mplayer的windows版本,然后在里面找到Mplayer的可执行文件,所以我们还需要得到FFmpeg
我们在上一次讲到在QT中调用Mplayer时,我们是下载了Mplayer的windows版本,然后在里面找到Mplayer的可执行文件,所以我们还需要得到FFmpeg
- "color: rgb(0, 128, 0);">在windows下的可执行文件,这样才能执行,这样就涉及到在windows下如何来编译出ffmpeg.exe(当然你也可以直接到网上找编译好了的ffmpeg.exe然后放置在工程的当前文件下)。
在windows下的可执行文件,这样才能执行,这样就涉及到在windows下如何来编译出ffmpeg.exe(当然你也可以直接到网上找编译好了的ffmpeg.exe然后放置在工程的当前文件下)。
- "color: rgb(0, 128, 0);">在后面将会具体介绍如何来在windows下编译出ffmpeg.exe文件。
在后面将会具体介绍如何来在windows下编译出ffmpeg.exe文件。
- "color: rgb(0, 128, 0);">有时候虽然结合前端的图形界面我们可以不用在考虑复杂的选项参数,也不用去在意FFmpeg运行时的输出信息,只需要得到指定格式的目标文件即可,但是
有时候虽然结合前端的图形界面我们可以不用在考虑复杂的选项参数,也不用去在意FFmpeg运行时的输出信息,只需要得到指定格式的目标文件即可,但是
- "color: rgb(0, 128, 0);">有时候我们也需要了解FFmpeg在运行时的输出信息以及可能的出错信息,这一点QProcess也为我们提供了专门的信号和函数来获取到执行命令的
有时候我们也需要了解FFmpeg在运行时的输出信息以及可能的出错信息,这一点QProcess也为我们提供了专门的信号和函数来获取到执行命令的
- "color: rgb(0, 128, 0);">输出信息和可能的出错信息。
输出信息和可能的出错信息。
- "color: rgb(0, 128, 0);">
"code" class="cpp" style="font-family: monospace;">connect "color: rgb(0, 128, 0);">("color: rgb(0, 0, 64);">&commandProcess, SIGNAL"color: rgb(0, 128, 0);">(readyReadStandardOutput"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">),"color: rgb(0, 0, 221);">this, SLOT"color: rgb(0, 128, 0);">(outputCommand"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- connect "color: rgb(0, 128, 0);">("color: rgb(0, 0, 64);">&commandProcess, SIGNAL"color: rgb(0, 128, 0);">(readyReadStandardError"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">),"color: rgb(0, 0, 221);">this, SLOT"color: rgb(0, 128, 0);">(outputCommand"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
"code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 128);">当QProcess的标准输出和标准出错上有数据可读时,它就会发出readyReadStandardOutput()和readyReadStandardError()信号,我们利用一个槽函数 "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 128);">来处理这两种信号。 - "color: rgb(0, 128, 128);">
"code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 0, 255);">void MainWindow"color: rgb(0, 128, 128);">::"color: rgb(0, 119, 136);">outputCommand"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">) - "color: rgb(0, 128, 0);">{
- QByteArray cmdoutput "color: rgb(0, 0, 128);">= commandProcess."color: rgb(0, 119, 136);">readAllStandardOutput"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- QString txtoutput "color: rgb(0, 0, 128);">= cmdoutput"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>textBrowser"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>append"color: rgb(0, 128, 0);">(txtoutput"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- cmdoutput "color: rgb(0, 0, 128);">= commandProcess."color: rgb(0, 119, 136);">readAllStandardError"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- txtoutput "color: rgb(0, 0, 128);">= cmdoutput"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>textBrowser"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>append"color: rgb(0, 128, 0);">(txtoutput"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
-
- "color: rgb(0, 128, 0);">}
"code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">从QProcess读出命令运行的输出信息和出错信息并显示出来。 "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">现在再讲讲如何来在windows上编译出ffmpeg.exe,当然编译后产生的目标文件格式可以是多种多样,这取决于我们的程序如何来调用FFmpeg "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">如果在程序中我们动态的调用FFmpeg,则需要编译成FFmpeg的动态库dll,头文件.h等,但在这里我们是直接调用的FFmpeg的可执行文件,所以我们需要 "code"
class="cpp" style="font-family: monospace;">"color: rgb(0, 128, 0);">编译出ffmpeg.exe文件。 -
- connect "color: rgb(0, 128, 0);">("color: rgb(0, 0, 64);">&commandProcess, SIGNAL"color: rgb(0, 128, 0);">(readyReadStandardOutput"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">),"color: rgb(0, 0, 221);">this, SLOT"color: rgb(0, 128, 0);">(outputCommand"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- connect "color: rgb(0, 128, 0);">("color: rgb(0, 0, 64);">&commandProcess, SIGNAL"color: rgb(0, 128, 0);">(readyReadStandardError"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">),"color: rgb(0, 0, 221);">this, SLOT"color: rgb(0, 128, 0);">(outputCommand"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
connect (&commandProcess, SIGNAL(readyReadStandardOutput()),this, SLOT(outputCommand()));
connect (&commandProcess, SIGNAL(readyReadStandardError()),this, SLOT(outputCommand()));
- "color: rgb(0, 128, 128);">当QProcess的标准输出和标准出错上有数据可读时,它就会发出readyReadStandardOutput()和readyReadStandardError()信号,我们利用一个槽函数
当QProcess的标准输出和标准出错上有数据可读时,它就会发出readyReadStandardOutput()和readyReadStandardError()信号,我们利用一个槽函数
- "color: rgb(0, 128, 128);">来处理这两种信号。
来处理这两种信号。
- "color: rgb(0, 0, 255);">void MainWindow"color: rgb(0, 128, 128);">::"color: rgb(0, 119, 136);">outputCommand"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)
- "color: rgb(0, 128, 0);">{
- QByteArray cmdoutput "color: rgb(0, 0, 128);">= commandProcess."color: rgb(0, 119, 136);">readAllStandardOutput"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- QString txtoutput "color: rgb(0, 0, 128);">= cmdoutput"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>textBrowser"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>append"color: rgb(0, 128, 0);">(txtoutput"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- cmdoutput "color: rgb(0, 0, 128);">= commandProcess."color: rgb(0, 119, 136);">readAllStandardError"color: rgb(0, 128, 0);">("color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
- txtoutput "color: rgb(0, 0, 128);">= cmdoutput"color: rgb(0, 128, 128);">;
- ui"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>textBrowser"color: rgb(0, 0, 64);">-"color: rgb(0, 0, 128);">>append"color: rgb(0, 128, 0);">(txtoutput"color: rgb(0, 128, 0);">)"color: rgb(0, 128, 128);">;
-
- "color: rgb(0, 128, 0);">}
void MainWindow::outputCommand()
{
QByteArray cmdoutput = commandProcess.readAllStandardOutput();
QString txtoutput = cmdoutput;
ui->textBrowser->append(txtoutput);
cmdoutput = commandProcess.readAllStandardError();
txtoutput = cmdoutput;
ui->textBrowser->append(txtoutput);
}
- "color: rgb(0, 128, 0);">从QProcess读出命令运行的输出信息和出错信息并显示出来。
从QProcess读出命令运行的输出信息和出错信息并显示出来。
- "color: rgb(0, 128, 0);">现在再讲讲如何来在windows上编译出ffmpeg.exe,当然编译后产生的目标文件格式可以是多种多样,这取决于我们的程序如何来调用FFmpeg
现在再讲讲如何来在windows上编译出ffmpeg.exe,当然编译后产生的目标文件格式可以是多种多样,这取决于我们的程序如何来调用FFmpeg
- "color: rgb(0, 128, 0);">如果在程序中我们动态的调用FFmpeg,则需要编译成FFmpeg的动态库dll,头文件.h等,但在这里我们是直接调用的FFmpeg的可执行文件,所以我们需要
如果在程序中我们动态的调用FFmpeg,则需要编译成FFmpeg的动态库dll,头文件.h等,但在这里我们是直接调用的FFmpeg的可执行文件,所以我们需要
- "color: rgb(0, 128, 0);">编译出ffmpeg.exe文件。
编译出ffmpeg.exe文件。
- "color: rgb(0, 128, 0);">"color: rgb(0, 128, 128);">1.安装MSys
到"">下载文件:
bash-3.1-MSYS-1.0.11-tar.bz2
msysCORE-1.0.11-2007.01.19-1.tar.bz2
1.安装MSys
到下载文件:
bash-3.1-MSYS-1.0.11-tar.bz2
msysCORE-1.0.11-2007.01.19-1.tar.bz2
msysCORE-1.0.11-2007.01.19-1.tar.bz2下載鏈接:
bash-3.1-MSYS-1.0.11-tar.bz2下載鏈接:
解压msysCORE-1.0.11-2007.01.19-1.tar.bz2,比如解压到D:\msys(以下内容都使用该路径描述)。
解压bash-3.1-MSYS-1.0.11-tar.bz2,产生一个名为bash-3.1的目录,在该目录下有一个子目录名为bin,其 他
的目录不需要关心。复制bin目录中的所有文件到D:\msys\bin,提示是否要覆盖sh.exe的时候,选择是。
到“D:\msys
\postinstall”目录下执行pi.bat,在出现的提示中输入n回车后,按任意键退出即可。
如果你不输入N的话就输入两次Y,最后把c:\msys\mingw 输入即可
。如果输入N的话,要打开D:\msys\etc\fstab.sample把它重命名为fstab 并用nodepad打开编辑,把c:\mingw
\mingw 改成d:\msys\mingw即可。最后配置PATH,在系统的环境配置中添加d:\msys\bin。
2.安装MinGW
同样是到下载文件:
binutils-2.17.50-20060824-1.tar.gz
gcc-core-3.4.5-20060117-1.tar.gz
gcc-g++-3.4.5-20060117-1.tar.gz
w32api-3.9.tar.gz
mingw-runtime-3.12.tar.gz
把它们全部解压到D:\msys\mingw。
或者直接下载MinGW.exe文件 下载好按步骤安装,选择安装的组件最好都选上啦。不过安装目录一定要选择d:\msys\mingw 别的路径它找不到。
3.修改“msys.bat”
用文本编辑器打开D:\msys\msys.bat, 安装微软的Visual
Studio或是Visual
C++。把下面一行加到msys.bat的最前面,把路径替换成机器上vcvars32.bat实际存在的路径,比如我的在“c:\Program
Files\Microsoft Visual Studio .NET 2005\Vc\bin”,于是就添加:
call "c:\Program Files\Microsoft Visual Studio .NET 2005\Vc\bin\vcvars32.bat"
4.svn
下载TortoiseSVN,安装好之后,在d:\ffmpeg右击,选择SVN check out,
第一行目录选择svn://svn.mplayerhq.hu/ffmpeg/trunk 然后确定。这样就得到最新的SVN。
但由于SVN只针对UNIX系统做的。所以无法GCC对最新的SVN编译。会报错:192 PR command not found.
解决方法一:不用最新的SVN版本。因为即使用了最新的MinGW5.1.exe还是有这样的错误。 windows下还是无法编译最新的SVN代码。我这有07年3月的版本是可以用的。需要的可以索要。
解决方法二:下载 coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2 Mirror
并且解压缩出来,把bin下的内容拷贝到MSYS下,因为MSYS缺少COREUTILS所以报错 PR command not found。
改完后你会发现可以编译了,但是make的时候又出错了。怎么办呢?去sourceforge网站上下载make-3.81-MSYS-1.0.11-2.tar.bz2,替换掉原来的make.exe文件即可 (搜索了一天时间,提供出来免得大家走歪路!)
这样就可以用最新的SVN版本来进行编译了。
5.测试
打开msys.bat,输入cd空格/d/ffmpeg,路径变化后,然后输入./configure空格--enable-memalign-hack,回车!
如果不报错,那么再输入make.
6.第三方插件
根据以上5个步骤就已经可以得到ffmpeg.exe了,但没有加入声音,以及对其他格式支持的也不够好。
现在开始加入lame,就是声音。到下载已经编译的mp3lame库(可以向我索要),解压出来后分别拷贝到你安装好的mingw目录下的相对目录里。在传递配置参数时要加入“--enable-libmp3lame” ,即使用以下命令配置:
./configure --enable-static --disable-shared --enable-memalign-hack --enable-libmp3lame
然后加入mp4的格式的支持:
然后加入3GP的支持:
编译的时候加上--enable-amr_nb --enable-amr_wb参数就行,根据编译系统的提示,所以我们得下载一
些编译3gp所需得文件。
解压以后把里面的文件都拷贝到libavcodec/amrwb_float
解压以后把里面的文件都拷贝到libavcodec/amr_float