上一节实现了从本地向BPlay1.0载入一个媒体文件,但是却无法解析该文件,本节将通过向QT载入ffmpeg解决这个问题。
ffmpeg装载
1、 首先需要从 ffmpeg官网 下载ffmpeg库,我下载的是ffmpeg-n4.4-latest-win64-gpl-shared-4.4版本的库,解压后可以看到里面有这些文件:
2、我们需要将这些文件装载到QT工程下,打开BPlay1.0所在的路径,创建一个以ffmpeg命名的文件夹:
3、进入ffmpeg文件夹,将第一步从官网下载的ffmpeg库里的lib文件夹和include文件夹拷贝到BPlay1.0工程ffmpeg路径下:
4、修改QT中间文件(xxx.pro),添加下面几行,使BPlay1.0构建时可以链接到ffmpeg库:
INCLUDEPATH += $$PWD/ffmpeg/include
LIBS +=-L$$PWD/ffmpeg/lib
LIBS += -lavcodec -lavformat -lswscale -lavutil -lswresample
5、编写测试程序检查ffmpeg是否已经成功链接上,首先修改打开媒体文件按钮的回调,新增如下代码:
/********************************
* void MainWindow::on_Bopenfile_btn_clicked()
* 功能:打开文件按钮点击回调函数
* *****************************/
void MainWindow::on_Bopenfile_btn_clicked()
{
QString FilePath = QFileDialog::getOpenFileName(this, QString("媒体文件"), QString("."), QString("视频文件(*.mp4 *.flv *.avi);;所有文件(*.*)"));
if (FilePath.isEmpty()) {
BLOG("Media File empty");
return;
}
if (-1 == Bffmpeg::BLoadMediaFile(FilePath)) {
BLOG("Media File illegal");
return;
}
return;
}
在Bffmpeg类里面添加BLoadMediaFile方法(此步是检查ffmpeg是否可用):
/********************************
* int BLoadMediaFile(QString FilePath)
* 功能:媒体文件加载
* 成功返回:0
* 失败返回:-1
* *****************************/
int Bffmpeg::BLoadMediaFile(QString FilePath)
{
unsigned ver = avcodec_version();
BLOG("ver:%d", ver);
return 0;
}
BLoadMediaFile里面应用了ffmpeg里面一个查看ffmpeg版本号的接口,Bffmpeg.h页需要包含上ffmpeg的头文件(注意加上extern “C”):
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavformat/version.h>
#include <libavdevice/avdevice.h>
#include <libavutil/time.h>
#include <libavutil/mathematics.h>
#include <libswscale/swscale.h>
#include <libswresample/swresample.h>
}
接着重新构建一下代码,发现程序编译、链接均成功,但是在运行时报错了:
不要慌,这个是因为BPlay1.0在运行时找不到装载库造成的,我们需要把ffmpeg库里面的bin下是dll文件放到BPlay1.0运行的路径下:
再次构建BPlay1.0时,成功获取到ffmpeg版本号,ffmpeg装载成功!