折腾了6个小时,(其实是两天)。终于搞定了(刚找到小白入门的门)。不知道Qt的一些潜规则,导致一直有问题:.h文件找不到。.lib文件找不到,之类的错误。
注意版本的位数,一定要跟工程一致。(这个坑,我久久没有上来)
32位的MinGW对应32位FFmpeg, 64位的VS2017对应64位FFmpeg
环境:Win10 + Qt5.7 + VS2017 + ffmpeg2.5.2版本(有点老)
新建一个非Qt 的C++工程。
取个文件名。然后:↓
我用到了 MinGW和VS2017 , 一个32位,一个64位。
继续完成即可。
打开.pro文件:
TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += \
main.cpp
// 添加如下(不要写注释)
INCLUDEPATH += $$PWD/FFmpeg-64/include-64
LIBS += $$PWD/FFmpeg-64/lib/avcodec.lib\
$$PWD/FFmpeg-64/lib/avdevice.lib\
$$PWD/FFmpeg-64/lib/avfilter.lib\
$$PWD/FFmpeg-64/lib/avformat.lib\
$$PWD/FFmpeg-64/lib/avutil.lib\
$$PWD/FFmpeg-64/lib/postproc.lib\
$$PWD/FFmpeg-64/lib/swresample.lib\
$$PWD/FFmpeg-64/lib/swscale.lib
定义了两个文件,分别为32位和64位。
FFmpeg-64 文件中如下:
开始的时候,我把lib文件,写成了lib-64. 然后就一直找不到.lib文件 —_— !! 后来去掉数字之后,才行了。
转到 main.cpp文件,如下写:
#include <iostream>
using namespace std;
extern "C"
{
#include <FFmpeg-64/include-64/libavcodec/avcodec.h>
#include <FFmpeg-64/include-64/libavformat/avformat.h>
#include <FFmpeg-64/include-64/libswscale/swscale.h>
#include <FFmpeg-64/include-64/libavdevice/avdevice.h>
}
int main()
{
std::cout << "Hello FFmpeg!" << endl;
av_register_all();
unsigned version = avcodec_version();
cout << version << std::endl;
return 0;
}
不知道这个“endl”跟谁冲突了,所以直接去掉就OK。
2019/4/12补充:endl 是<qDebug> 文件中的 qDebug()<<endl; 输出回车。因为没有包含<qDebug>所以,提示红色。
Qt中 endl 并不是VS中的endl
运行成功!
参考:http://blog.yundiantech.com/?log=blog&id=8 继续写例子:遇到的问题如下:
av_register_all();
// 初始化
AVFormatContext *pFormatCtx = avformat_alloc_context();
// 打开视频文件
char file_path[] = "D:/QtProject/pratice/ffmpeg_32_64/Forrest_Gump_IMAX.mp4";
avformat_open_input(&pFormatCtx, file_path, nullptr, nullptr);
问题一:
如上代码,file_path,一直找不到文件。试了很多种方法:char file_path[] = "path_url";
1、视频文件放在debug目录下,file_path[] = "Forrest_Gump_IMAX.mp4" 不可行
2、视频文件放在main.cpp文件同级, file_path[] = "Forrest_Gump_IMAX.mp4" 可行
3、视频文件直接放在D盘,根目录下, file_path[] = "D::name.mp4" 不可行
4、char file_path[] = "D:\\Forrest_Gump_IMAX.mp4"; 可以了 √
5、file_path[] = "D:/QtProject/ffmpeg_32_64/Forrest_Gump_IMAX.mp4"; // 包含绝对路径,反斜杠不要写反了。可以了
问题二:
avpicture_fill((AVPacket *)pFrameRGB, out_buffer, PIX_FMT_RGB24, pCodecCtx->width, pCodecCtx->height);
对于这个问题,一直没有找到解决方法,先暂且搁置,新建一个demo,换一个FFmpeg的版本库。版本问题,已解决。