08-Qt结合FFmpeg导出/导入mp4或avi或mov(qt使用FFmpeg的步骤)

一、本例实现的功能与使用场景

本例实现了把内存中的rgb数组图像导出为标准的mp4文件,以及把标准的mp4视频文件解码并导入到内存中。从而获取到RAW视频,方便对视频做图像处理。

支持的格式为mp4,avi,mov
支持的平台有MacOS,windows

  1. 用qt做一个视频剪辑软件。剪辑之前需要导入标准的视频文件到内存,以及剪辑好的视频需要导出为标准的mp4文件。
  2. 用qt做一个图像或视频处理类的软件,需要导出为标准的mp4文件。(本例子就是在这个需求下写的)

二、使用环境

Qt Creater + FFmpeg, 本例子在macos下开发并测试。由于Qt和FFmpeg都是跨平台的库,因此本工程适用于所有支持Qt的平台。

  1. FFmpeg下载安装:
    http://ffmpeg.org/download.html#build-mac
    https://ffmpeg.zeranoe.com/builds/
    在这里插入图片描述
    由于FFmpeg是在GNU GPL 3.0 和 LGPL 协议下开发的。
    建议使用动态库+ LGPL的方案来使用FFmpeg的库。
    把下载好的dev和shareLib 两个文件夹合并,就获得了开发FFmpeg所需要的所有文件了。
  2. 新建Qt Creater 工程并添加FFmpeg库
    用Qt Creater创建好工程之后,在Qt Creater内选择新建的工程,点击右键,选择导入库。就会弹出导入库的引导对话框引导你导入需要的库。
  3. 本例子的FFmpeg目录与Qt工程目录同在一个父目录下,如下图所示:
    在这里插入图片描述
  4. 导入库之后,在工程文件*.pro文件中有关FFmpeg的配置如下,你也可以直接复制如下配置(只要目录布局和以上提到的相同即可)。
macx {
INCLUDEPATH += $$PWD/../ffmpeg-macos64-shared/include
DEPENDPATH += $$PWD/../ffmpeg-macos64-shared/include

macx: LIBS += -L$$PWD/../ffmpeg-macos64-shared/bin/ -lavcodec.58
macx: LIBS += -L$$PWD/../ffmpeg-macos64-shared/bin/ -lavdevice.58
macx: LIBS += -L$$PWD/../ffmpeg-macos64-shared/bin/ -lavfilter.7
macx: LIBS += -L$$PWD/../ffmpeg-macos64-shared/bin/ -lavformat.58
macx: LIBS += -L$$PWD/../ffmpeg-macos64-shared/bin/ -lavutil.56
macx: LIBS += -L$$PWD/../ffmpeg-macos64-shared/bin/ -lpostproc.55
macx: LIBS += -L$$PWD/../ffmpeg-macos64-shared/bin/ -lswresample.3
macx: LIBS += -L$$PWD/../ffmpeg-macos64-shared/bin/ -lswscale.5
}

win32 {
INCLUDEPATH += $$PWD/../ffmpeg-win32-shared/include
DEPENDPATH += $$PWD/../ffmpeg-win32-shared/include

win32: LIBS += -L$$PWD/../ffmpeg-win32-shared/lib/ -lavcodec
win32: LIBS += -L$$PWD/../ffmpeg-win32-shared/lib/ -lavdevice
win32: LIBS += -L$$PWD/../ffmpeg-win32-shared/lib/ -lavfilter
win32: LIBS += -L$$PWD/../ffmpeg-win32-shared/lib/ -lavformat
win32: LIBS += -L$$PWD/../ffmpeg-win32-shared/lib/ -lavutil
win32: LIBS += -L$$PWD/../ffmpeg-win32-shared/lib/ -lpostproc
win32: LIBS += -L$$PWD/../ffmpeg-win32-shared/lib/ -lswresample
win32: LIBS += -L$$PWD/../ffmpeg-win32-shared/lib/ -lswscale
}

三、Qt类调用FFmpeg函数的方法

FFmpeg是用c语言写的,而开发Qt是C++语言。因此C++代码调用c的方法有如下两种:

  • 方法一:直接在Qt类的成员函数中调用FFmpeg的c函数。
    当需要包含FFmpeg的头文件的时候使用如下方法:
	extern "C" {
		#include <libavformat/avformat.h>
		#include <libswscale/swscale.h>
	}
  • 方法二:把有关FFmepg调用的函数写到一个*.c与*.h文件中
    即把FFmpeg有关的代码单独分装起来,提供给C++成员函数调用。由于封装是c文件因此,在C++中调用的时候也得使用如下方式调用头文件:
	extern "C" {
	#include "./ffmpeg/outputstream.h"
	#include "./ffmpeg/inputstream.h"
	}

四、本例源码获取与工程布局

代码工程布局如下图:
d在这里插入图片描述

本例子是在FFmpeg官方例子的基础上修改而来的。原始例子如下图所示
在这里插入图片描述

github地址:
https://github.com/robert1207/QtFFmpegExoprtMp4

github上只有源码,没有下载好的ffmpeg库,以下csdn资源里面包含Windows下和MacOS下的FFmpeg库以及源代码,地址如下:
https://download.csdn.net/download/robert_cysy/11667426

发布了88 篇原创文章 · 获赞 45 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/robert_cysy/article/details/97797657