Browse Source

init

master
JackLee_CN 2 years ago
commit
ab4afbee5e
  1. 1
      .gitignore
  2. 21
      .vscode/c_cpp_properties.json
  3. 70
      .vscode/settings.json
  4. 1908
      3rdparty/stb/stb_font.h
  5. 7897
      3rdparty/stb/stb_image.h
  6. 1724
      3rdparty/stb/stb_image_write.h
  7. 5077
      3rdparty/stb/stb_truetype.h
  8. 99
      CMakeLists.txt
  9. 153
      CMakeLists.txt.user
  10. 129
      FFmpeg.cpp
  11. 54
      FFmpeg.h
  12. 102
      SDL2Player.cpp
  13. 55
      SDL2Player.h
  14. 12
      main.cpp
  15. 63
      playthread.cpp
  16. 24
      playthread.h
  17. 5
      res.qrc
  18. BIN
      res/img/loading.gif
  19. BIN
      res/img/zvo.png
  20. 75
      stb_ffmpeg.cpp
  21. 23
      stb_ffmpeg.h
  22. 13
      stb_impl.cpp
  23. 68
      zffmpeg.cpp
  24. 41
      zffmpeg.h
  25. 38
      zffmpeg.pro
  26. 261
      zffmpeg.pro.user

1
.gitignore vendored

@ -0,0 +1 @@
build/

21
.vscode/c_cpp_properties.json vendored

@ -0,0 +1,21 @@
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "D:\\Dev\\Qt\\Tools\\mingw1120_64\\bin\\gcc.exe",
"cStandard": "gnu17",
"cppStandard": "gnu++17",
"intelliSenseMode": "windows-gcc-x64",
"configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}

70
.vscode/settings.json vendored

@ -0,0 +1,70 @@
{
"files.associations": {
"new": "cpp",
"array": "cpp",
"atomic": "cpp",
"bit": "cpp",
"*.tcc": "cpp",
"cctype": "cpp",
"chrono": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"codecvt": "cpp",
"compare": "cpp",
"concepts": "cpp",
"condition_variable": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"list": "cpp",
"map": "cpp",
"set": "cpp",
"string": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"vector": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"iterator": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"optional": "cpp",
"random": "cpp",
"ratio": "cpp",
"source_location": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"fstream": "cpp",
"future": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"limits": "cpp",
"mutex": "cpp",
"numbers": "cpp",
"ostream": "cpp",
"semaphore": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"stop_token": "cpp",
"streambuf": "cpp",
"thread": "cpp",
"cinttypes": "cpp",
"typeinfo": "cpp",
"variant": "cpp"
}
}

1908
3rdparty/stb/stb_font.h vendored

File diff suppressed because it is too large Load Diff

7897
3rdparty/stb/stb_image.h vendored

File diff suppressed because it is too large Load Diff

1724
3rdparty/stb/stb_image_write.h vendored

File diff suppressed because it is too large Load Diff

5077
3rdparty/stb/stb_truetype.h vendored

File diff suppressed because it is too large Load Diff

99
CMakeLists.txt

@ -0,0 +1,99 @@
#cmake
cmake_minimum_required(VERSION 3.16)
#
project(ZFFmpeg VERSION 1.0 LANGUAGES CXX)
#moc ui rcc
SET(CMAKE_AUTOMOC ON)
SET(CMAKE_AUTOUIC ON)
SET(CMAKE_AUTORCC ON)
#C++
set(CMAKE_CXX_STANDARD 17)
#.h
SET(CMAKE_INCLUDE_CURRENT_DIR ON)
#release
#ADD_DEFINITIONS(-DQT_MESSAGELOGCONTEXT)
#debugrelease
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/build/debug)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/build/release)
#QT .cmake
SET(QT_DIR "D:/Dev/Qt/6.3.1/mingw1120_static_x64/lib/cmake")
SET(MSYS2 "D:/Dev/msys64/mingw64")
SET(FFMPEG "D:/Dev/msys64/usr/local/ffmpeg_5_1")
list(APPEND CMAKE_PREFIX_PATH ${QT_DIR} ${MSYS2} ${FFMPEG})
message("QT_DIR_PATH=${QT_DIR}")
message("MSYS2_DIR_PATH=${MSYS2}")
message("FFMPEG_DIR_PATH=${FFMPEG}")
#QT
find_package(Qt6Core REQUIRED)
find_package(Qt6Gui REQUIRED)
find_package(Qt6Widgets REQUIRED)
#MSYS2 SDL
include(FindPackageHandleStandardArgs)
find_library(SDL2_LIBRARY NAMES SDL2 PATHS ${MSYS2} PATH_SUFFIXES lib)
find_path(SDL2_INCLUDE_DIR NAMES SDL2/SDL.h PATHS ${MSYS2} PATH_SUFFIXES include)
find_package_handle_standard_args(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR)
if (SDL2_FOUND)
mark_as_advanced(SDL2_INCLUDE_DIR)
mark_as_advanced(SDL2_LIBRARY)
endif()
if (SDL2_FOUND AND NOT TARGET SDL2::SDL2)
add_library(SDL2::SDL2 STATIC IMPORTED)
set_property(TARGET SDL2::SDL2 PROPERTY IMPORTED_LOCATION ${SDL2_LIBRARY})
target_include_directories(SDL2::SDL2 INTERFACE ${SDL2_INCLUDE_DIR})
include_directories(${SDL2_INCLUDE_DIR})
target_link_libraries(SDL2::SDL2 INTERFACE SDL2::SDL2 mingw32 glu32 opengl32 setupapi hid z)
endif()
#MSYS2 FFMPEG
find_package(PkgConfig REQUIRED)
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET
libavdevice
libavfilter
libavformat
libavcodec
libswresample
libswscale
libavutil
libpostproc
)
include_directories(${FFMPEG}/include)
#
include_directories(${PROJECT_SOURCE_DIR}/3rdparty/stb)
set(PROJECT_SOURCES
main.cpp
PlayThread.cpp
PlayThread.h
SDL2Player.cpp
SDL2Player.h
ZFFmpeg.cpp
ZFFmpeg.h
stb_impl.cpp
stb_ffmpeg.h
stb_ffmpeg.cpp
)
#
qt6_add_resources(RCFILES res.qrc)
add_executable(${PROJECT_NAME} WIN32 ${PROJECT_SOURCES} ${RCFILES})
target_link_libraries(
${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets
${SDL2_LIBRARY}
PkgConfig::FFMPEG
)

153
CMakeLists.txt.user

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 8.0.1, 2022-09-25T15:03:28. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{bd716bc2-53a5-45e0-976b-573eccb8e3a0}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="qlonglong">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">1</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">2</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Imported Kit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Imported Kit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{ddb406ba-b06f-4720-bf29-b36018b1f977}</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="CMake.Build.Type">Release</value>
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_GENERATOR:STRING=MinGW Makefiles
-DCMAKE_BUILD_TYPE:STRING=Release
-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake
-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable}
-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}</value>
<value type="QString" key="CMake.Source.Directory">F:\SourceCode\VTS\ZFFmpeg\zffmpeg</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">F:\SourceCode\VTS\ZFFmpeg\zffmpeg\build</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">clean</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">ZFFmpeg</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.ZFFmpeg</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">ZFFmpeg</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">F:/SourceCode/VTS/ZFFmpeg/zffmpeg/build/release</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="qlonglong">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

129
FFmpeg.cpp

@ -0,0 +1,129 @@
#include "FFmpeg.h"
#include<iostream>
FFmpeg::FFmpeg()
{
}
FFmpeg::FFmpeg(std::string path)
{
}
INITERRO FFmpeg::initFFmpeg(const std::string& path)
{
if (path.empty() && this->filePath.empty()) {
return INITERRO::INIT_ERRO_OPEN_FAILED;
}
//优先选用传入的参数
std::string pathTemp = path.empty() ? this->filePath : path;
//初始化
av_register_all();
avformat_network_init();
this->pFormatCtx = avformat_alloc_context();
//open_input
if (avformat_open_input(&this->pFormatCtx, pathTemp.c_str(), NULL,NULL) != 0) {
return INITERRO::INIT_ERRO_OPEN_FAILED;
}
//find_stream_infomation
if (avformat_find_stream_info(this->pFormatCtx, NULL) < 0) {
return INITERRO::INIT_ERRO_FIND_FAILED;
}
//find_decoder
videoIndex = -1;
audioIndex = -1;
for (int i = 0; i < this->pFormatCtx->nb_streams; ++i) {
if (this->pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
videoIndex = i;
}
if (this->pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
audioIndex = i;
}
}
if (videoIndex != -1) {
pCodercCtxVideo = pFormatCtx->streams[videoIndex]->codec;
pCodercVideo = avcodec_find_decoder(pCodercCtxVideo->codec_id);
if (pCodercVideo == NULL) {
printf("Codec not found.\n");
return INITERRO::INIT_ERRO_DECODE_FAILED;
}
}
if (audioIndex != -1) {
pCodercCtxAudio = pFormatCtx->streams[audioIndex]->codec;
//
}
//open2
if (avcodec_open2(pCodercCtxVideo, pCodercVideo, NULL) < 0) {
return INITERRO::INIT_ERRO_OPEN2_FAILED;
}
//init
pFrame = av_frame_alloc();
pFrameYUV = av_frame_alloc();
uint8_t* outBuffer = (uint8_t*)av_malloc(avpicture_get_size(AV_PIX_FMT_YUV420P, pCodercCtxVideo->width, pCodercCtxVideo->height));
avpicture_fill((AVPicture*)pFrameYUV, outBuffer, AV_PIX_FMT_YUV420P, pCodercCtxVideo->width, pCodercCtxVideo->height);
pPacket = (AVPacket*)av_malloc(sizeof(AVPacket));
//Output Info-----------------------------
/*printf("--------------- File Information ----------------\n");
av_dump_format(pFormatCtx, 0, pathTemp.c_str(), 0);
printf("-------------------------------------------------\n");*/
imgConvertCtx = sws_getContext(pCodercCtxVideo->width, pCodercCtxVideo->height, pCodercCtxVideo->pix_fmt,
pCodercCtxVideo->width, pCodercCtxVideo->height, AV_PIX_FMT_YUV420P, 4, NULL, NULL, NULL);
return INITERRO::INIT_ERRO_NO_ERRO;
}
std::shared_ptr<uint8_t> FFmpeg::getFrameYUV(int& isVideo)
{
int y_size = pCodercCtxVideo->width * pCodercCtxVideo->height;
std::shared_ptr<uint8_t> bufferFram(new uint8_t[y_size * 3 / 2]);
int ret = -1;
int gotPic = -1;
if (av_read_frame(pFormatCtx, pPacket) < 0) {
isVideo = -2;
return bufferFram;
}
if (pPacket->stream_index == videoIndex) {
ret = avcodec_decode_video2(pCodercCtxVideo, pFrame, &gotPic, pPacket);
if (gotPic) {
sws_scale(imgConvertCtx, (const uint8_t* const*)pFrame->data, pFrame->linesize, 0, pCodercCtxVideo->height,
pFrameYUV->data, pFrameYUV->linesize);
// U V 的数据分别是Y的1/4 宽高各减少一半
memcpy(bufferFram.get(), pFrameYUV->data[0], y_size);
memcpy(bufferFram.get() + y_size, pFrameYUV->data[1], y_size / 4);
memcpy(bufferFram.get() + y_size + y_size / 4, pFrameYUV->data[2], y_size / 4);
isVideo = 1;
}
else {
isVideo = -1;
}
}
else {
isVideo = 0;
}
av_free_packet(pPacket);
return bufferFram;
}
int FFmpeg::getWidth()
{
return this->pCodercCtxVideo->width;
}
int FFmpeg::getHeight()
{
return this->pCodercCtxVideo->height;
}
FFmpeg::~FFmpeg()
{
sws_freeContext(imgConvertCtx);
av_frame_free(&pFrameYUV);
av_frame_free(&pFrame);
avcodec_close(pCodercCtxVideo);
avcodec_close(pCodercCtxAudio);
avformat_close_input(&pFormatCtx);
}

54
FFmpeg.h

@ -0,0 +1,54 @@
#ifdef FFMPEG_H
#define FFMPEG_H
#include<string>
#define __STDC_CONSTANT_MACROS
#ifdef __cplusplus
extern "C"
{
#endif
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#ifdef __cplusplus
}
#endif
#include<memory>
enum class INITERRO {
INIT_ERRO_NO_ERRO,
INIT_ERRO_ALLOC_FAILED,
INIT_ERRO_OPEN_FAILED,
INIT_ERRO_FIND_FAILED,
INIT_ERRO_NO_VIDEO,
INIT_ERRO_NO_AUDIO,
INIT_ERRO_DECODE_FAILED,
INIT_ERRO_OPEN2_FAILED
};
class FFmpeg
{
public:
FFmpeg();
FFmpeg(std::string path);
INITERRO initFFmpeg(const std::string& path="");
std::shared_ptr<uint8_t> getFrameYUV(int& isVideo);
int getWidth();
int getHeight();
~FFmpeg();
private:
std::string filePath;
int videoIndex;
int audioIndex;
AVFormatContext* pFormatCtx;
AVCodecContext* pCodercCtxVideo;
AVCodecContext* pCodercCtxAudio;
AVCodec* pCodercVideo;
AVFrame* pFrame;
AVFrame* pFrameYUV;
AVPacket* pPacket;
struct SwsContext* imgConvertCtx;
};
#endif

102
SDL2Player.cpp

@ -0,0 +1,102 @@
#include "SDL2Player.h"
SDL2Player::SDL2Player(void* t_winID):
d_width(640),
d_height(480),
d_Title("SDL player"),
st_exit(0),
st_pause(0),
sd_time(25),
stbffmpeg(new STB_FFmpeg())
{
winID=t_winID;
}
SDL2Player::~SDL2Player()
{
SDL_DestroyTexture(sdl_texture);
//SDL_FreeSurface(pic);
SDL_DestroyRenderer(sdl_rander);
SDL_DestroyWindow(sdl_window);
SDL_Quit();
delete stbffmpeg;
stbffmpeg=nullptr;
}
void SDL2Player::set_window_size(int t_width,int t_height){
d_width=t_width;
d_height=t_height;
}
void SDL2Player::set_player_title(QString t_str){
d_Title=t_str;
}
int SDL2Player::initPlayer()
{
if(!winID){
return -1;
}
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
printf("Could not initialize SDL - %s\n", SDL_GetError());
return -1;
}
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");
if (winID != NULL) {
sdl_window = SDL_CreateWindowFrom(winID);
}
else {
sdl_window = SDL_CreateWindow(d_Title.toStdString().c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
d_width, d_height, SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE|SDL_WINDOW_ALLOW_HIGHDPI);
}
if (!sdl_window) {
printf("SDL: could not create window - exiting:%s\n", SDL_GetError());
return -1;
}
sdl_rander = SDL_CreateRenderer(sdl_window, -1,SDL_RENDERER_TARGETTEXTURE);
SDL_SetRenderDrawBlendMode(sdl_rander, SDL_BLENDMODE_BLEND);
SDL_ShowWindow(sdl_window);
sdl_surface=stbffmpeg->default_logo_surface(logoImageStr);
if(sdl_surface){
sdl_texture = SDL_CreateTextureFromSurface(sdl_rander, sdl_surface);
}
stbffmpeg->setFontArgs(sdl_rander);
SDL_CreateThread(SDL2Player::refresh_video_thread, NULL, this);
return 1;
}
void SDL2Player::default_logo_texture(){
SDL_WaitEvent(&event);
int iW,iH,iWidth,iHeight;
SDL_QueryTexture(sdl_texture, NULL, NULL, &iW, &iH);
SDL_GetWindowSize(sdl_window, &iWidth, &iHeight);
sdlRect.x = iWidth/2-iW/2;
sdlRect.y = iHeight/2-iH/2;
sdlRect.w = iW;
sdlRect.h = iH;
SDL_RenderClear(sdl_rander);
SDL_RenderCopy(sdl_rander, sdl_texture, NULL,&sdlRect);
sdlFontRect.x=(iWidth/2-iW/2)-stbffmpeg->fc.faceSize;
sdlFontRect.y=iHeight-50;
stbffmpeg->fc.drawText(sdlFontRect.x, sdlFontRect.y, logoStr);
SDL_RenderPresent(sdl_rander);
}
int SDL2Player::refresh_video_thread(void* opaque)
{
SDL2Player* sdl = (SDL2Player*)opaque;
SDL_Event _event;
while (!sdl->st_exit)
{
if (!sdl->st_pause) {
_event.type = REFRESH_EVENT;
SDL_PushEvent(&_event);
SDL_Delay(sdl->sd_time);
}
}
_event.type = BREAK_EVENT;
SDL_PushEvent(&_event);
return 0;
}

55
SDL2Player.h

@ -0,0 +1,55 @@
#ifndef SDL2PLAYER_H
#define SDL2PLAYER_H
#include <iostream>
#include <fstream>
#include <QWidget>
#include <QDir>
#define SDL_MAIN_HANDLED
#include "SDL2/SDL.h"
#include "stb_ffmpeg.h"
//Refresh Event
#define REFRESH_EVENT (SDL_USEREVENT + 1)
//Break
#define BREAK_EVENT (SDL_USEREVENT + 2)
class SDL2Player
{
public:
SDL2Player(void* winId);
~SDL2Player();
int initPlayer();
void set_window_size(int t_width,int t_height);
void set_player_title(QString);
void default_logo_texture();
private:
SDL_Surface* default_logo_surface(std::string image);
static int refresh_video_thread(void* opaque);
private:
void* winID;
int d_width;
int d_height;
QString d_Title;
STB_FFmpeg* stbffmpeg;
//SDL WINDOW
SDL_Window* sdl_window;
SDL_Texture* sdl_texture;
SDL_Renderer* sdl_rander;
SDL_Surface *sdl_surface;
SDL_Rect sdlRect,sdlFontRect;
//事件
SDL_Event event;
int st_exit;
int st_pause;
int sd_time;
//默认字符串
std::string logoImageStr="F:/SourceCode/VTS/ZFFmpeg/ZFFmpeg/res/img/zvo.png";
std::string logoStr="新时代社会主义中国";
};
#endif // SDL2PLAYER_H

12
main.cpp

@ -0,0 +1,12 @@
#include "ZFFmpeg.h"
#include <QApplication>
//#undef main
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
ZFFmpeg* wx = new ZFFmpeg;
wx->show();
return a.exec();
}

63
playthread.cpp

@ -0,0 +1,63 @@
#include "PlayThread.h"
PlayThread::PlayThread(void* t_winID):
f_Path(tr(nullptr))
{
winID = t_winID;
sdl_Player=new SDL2Player(winID);
sdl_Player->set_player_title("SDL Player");
}
PlayThread::~PlayThread()
{
}
void PlayThread::run()
{
//FFmpeg ffmpeg;
//auto r = ffmpeg.initFFmpeg(f_Path.toStdString().c_str());
//if (r != INITERRO::INIT_ERRO_NO_ERRO) {
// return;
//}
//SDL 播放器
sdl_Player->initPlayer();
while(true){
sdl_Player->default_logo_texture();
SDL_Delay(25);
}
/*
int isVideo = -2;
auto buffer = ffmpeg.getFrameYUV(isVideo);
while (isVideo != -2)
{
buffer = ffmpeg.getFrameYUV(isVideo);
if (isVideo == 1) {
auto r = sdl_Player.playYUV(buffer.get());
if (r == -1) {
break;
}
}
}
*/
}
void PlayThread::pause()
{
}
void PlayThread::stop()
{
}
void PlayThread::setPath(QString filePath)
{
f_Path = filePath;
}

24
playthread.h

@ -0,0 +1,24 @@
#ifndef PLAYTHREAD_H
#define PLAYTHREAD_H
#include <QThread>
#include "SDL2Player.h"
class PlayThread:public QThread
{
Q_OBJECT
public:
PlayThread(void*);
~PlayThread();
virtual void run();
void pause();
void stop();
void setPath(QString f_Path);
int isStop = 0;
private:
QString f_Path;
void* winID;
SDL2Player* sdl_Player;
};
#endif // PLAYTHREAD_H

5
res.qrc

@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/">
<file>res/img/zvo.png</file>
</qresource>
</RCC>

BIN
res/img/loading.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
res/img/zvo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

75
stb_ffmpeg.cpp

@ -0,0 +1,75 @@
#include "stb_ffmpeg.h"
STB_FFmpeg::STB_FFmpeg(){
}
STB_FFmpeg::~STB_FFmpeg(){
}
SDL_Surface* STB_FFmpeg::default_logo_surface(std::string image){
int req_format = STBI_rgb_alpha;
int width, height, orig_format;
unsigned char* data = stbi_load(image.c_str(), &width, &height, &orig_format, req_format);
if(data==NULL){
return nullptr;
}
int depth, pitch;
Uint32 pixel_format;
if (req_format == STBI_rgb) {
depth = 24;
pitch = 3*width;
pixel_format = SDL_PIXELFORMAT_RGB24;
} else {
depth = 32;
pitch = 4*width;
pixel_format = SDL_PIXELFORMAT_RGBA32;
}
return SDL_CreateRGBSurfaceWithFormatFrom((void*)data, width, height,depth, pitch, pixel_format);
}
void STB_FFmpeg::readFileRaw (const std::string & fullPath, std::string & output) {
std::ifstream fs(fullPath.c_str(), std::ios::in | std::ios::binary);
if (!fs.is_open()) {
std::cout << "readFileRaw: " << fullPath << " -- " << "WARNING: Could not open file." << std::endl;
return;
}
else {
std::cout << "Opened! " << fullPath << std::endl;
}
fs.seekg (0, std::ios::end);
const size_t LEN = fs.tellg();
fs.seekg (0, std::ios::beg);
output.resize(LEN);
fs.read(&output[0], LEN);
fs.close();
}
void STB_FFmpeg::readFileRaw_toMemory (const std::string & fullPath, sttfont_memory & mem) {
std::ifstream fs(fullPath.c_str(), std::ios::in | std::ios::binary);
if (!fs.is_open()) {
std::cout << "readFileRaw: " << fullPath << " -- " << "WARNING: Could not open file." << std::endl;
return;
}
else {
std::cout << "Opened! " << fullPath << std::endl;
}
fs.seekg (0, std::ios::end);
const size_t LEN = fs.tellg();
fs.seekg (0, std::ios::beg);
mem.alloc(LEN);
fs.read(mem.data, LEN);
fs.close();
}
void STB_FFmpeg::setFontArgs(SDL_Renderer* sdl_rander){
fc.faceSize = 48;
fc.tabWidthInSpaces = 12;
sttfont_memory notoSans;
readFileRaw_toMemory((QDir::currentPath()+"/font/PingFang.ttf").toStdString(), notoSans);
fc.loadFontManaged(notoSans);
fc.bindRenderer(sdl_rander);
}

23
stb_ffmpeg.h

@ -0,0 +1,23 @@
#ifndef STBFFMPEG_H
#define STBFFMPEG_H
#include "SDL2/SDL.h"
extern "C"{
#include "stb_image.h"
}
#include "stb_font.h"
#include <iostream>
#include <fstream>
#include <QDir>
class STB_FFmpeg{
public:
STB_FFmpeg();
~STB_FFmpeg();
SDL_Surface* default_logo_surface(std::string image);
void readFileRaw (const std::string & fullPath, std::string & output);
void readFileRaw_toMemory (const std::string & fullPath, sttfont_memory & mem);
void setFontArgs(SDL_Renderer* sdl_rander);
sdl_stb_font_cache fc;
};
#endif

13
stb_impl.cpp

@ -0,0 +1,13 @@
#ifdef STB_IMAGE_IMPLEMENTATION
#undef STB_IMAGE_IMPLEMENTATION
#endif
#define STB_IMAGE_IMPLEMENTATION
extern "C"{
#include "stb_image.h"
}
#ifdef SDL_STB_FONT_IMPL
#undef SDL_STB_FONT_IMPL
#endif
#define SDL_STB_FONT_IMPL
#include "stb_font.h"

68
zffmpeg.cpp

@ -0,0 +1,68 @@
#include "ZFFmpeg.h"
ZFFmpeg::ZFFmpeg(QWidget *parent)
: QWidget(parent),
mLayout(new QVBoxLayout),
cLayout(new QHBoxLayout),
vLayout(new QHBoxLayout),
l_path(new QLabel),
e_edit(new QLineEdit),
m_playerwidget(new QWidget),
t_play(new QPushButton),
t_pause(new QPushButton),
t_stop(new QPushButton),
t_exit(new QPushButton),
t_open_file(new QPushButton)
{
l_path->setText(tr("播放地址:"));
t_play->setText(tr("播放"));
t_pause->setText(tr("暂停"));
t_stop->setText(tr("停止"));
t_exit->setText(tr("退出"));
t_open_file->setText(tr("打开文件"));
setMinimumSize(800,600);
m_playerwidget->setMinimumSize(640,480);
cLayout->addWidget(l_path);
cLayout->addWidget(e_edit);
cLayout->addWidget(t_open_file);
cLayout->addWidget(t_play);
cLayout->addWidget(t_pause);
cLayout->addWidget(t_stop);
cLayout->addWidget(t_exit);
vLayout->addWidget(m_playerwidget);
mLayout->addLayout(cLayout);
mLayout->addLayout(vLayout);
setLayout(mLayout);
e_edit->setText(QDir::currentPath()+tr("/Av7046974.mp4"));
m_playerthread=new PlayThread((void*)m_playerwidget->winId());
connect(t_play, SIGNAL(clicked()), this, SLOT(play()));
connect(t_pause, SIGNAL(clicked()), this, SLOT(pause()));
connect(t_stop, SIGNAL(clicked()), this, SLOT(stop()),Qt::QueuedConnection);
connect(t_open_file,SIGNAL(clicked()),this,SLOT(set_open_file()));
connect(t_exit, SIGNAL(clicked()), this, SIGNAL(QWidget::close()));
m_playerthread->start();
}
ZFFmpeg::~ZFFmpeg()
{
}
void ZFFmpeg::set_open_file(){
QString ms_Path=QFileDialog::getOpenFileName(this,tr("选择要播放的文件"),tr(""));
if(ms_Path!=nullptr){
e_edit->setText(ms_Path);
}
}
void ZFFmpeg::play(){
}
void ZFFmpeg::pause(){
}
void ZFFmpeg::stop(){
}

41
zffmpeg.h

@ -0,0 +1,41 @@
#ifndef ZFFMPEG_H
#define ZFFMPEG_H
#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QDir>
#include <QPushButton>
#include <QVBoxLayout>
#include <QFileDialog>
#include <QtConcurrent/QtConcurrent>
#include "PlayThread.h"
class ZFFmpeg : public QWidget
{
Q_OBJECT
public:
ZFFmpeg(QWidget *parent = nullptr);
~ZFFmpeg();
private:
QVBoxLayout* mLayout;
QHBoxLayout* cLayout;
QHBoxLayout* vLayout;
QLabel* l_path;
QLineEdit* e_edit;
QWidget* m_playerwidget;
QPushButton* t_play;
QPushButton* t_pause;
QPushButton* t_stop;
QPushButton* t_exit;
QPushButton* t_open_file;
PlayThread* m_playerthread;
public slots:
void set_open_file();
void play();
void pause();
void stop();
};
#endif // ZFFMPEG_H

38
zffmpeg.pro

@ -0,0 +1,38 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += console c++17
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
PlayThread.cpp \
SDL2Player.cpp \
ZFFmpeg.cpp \
stb_impl.cpp \
main.cpp
HEADERS += \
PlayThread.h \
SDL2Player.h \
ZFFmpeg.h
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
INCLUDEPATH += $$PWD/3rdparty/stb
INCLUDEPATH += D:/Dev/msys64/usr/local/ffmpeg_5_1/include
LIBS += -LD:/Dev/msys64/usr/local/ffmpeg_5_1/lib -lavcodec.dll -lavdevice.dll -lavfilter.dll -lavformat.dll -lavutil.dll -lpostproc.dll -lswresample.dll -lswscale.dll
INCLUDEPATH += D:/Dev/msys64/mingw64/include
LIBS += -LD:/Dev/msys64/mingw64/lib -lmingw32 -lSDL2main -lSDL2 -lglu32 -lopengl32 -lsetupapi -lhid -lz
RESOURCES += \
res.qrc

261
zffmpeg.pro.user

@ -0,0 +1,261 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 8.0.1, 2022-09-23T20:53:50. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{bd716bc2-53a5-45e0-976b-573eccb8e3a0}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="qlonglong">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">1</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">2</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
<value type="bool" key="AutoTest.Framework.Boost">true</value>
<value type="bool" key="AutoTest.Framework.CTest">false</value>
<value type="bool" key="AutoTest.Framework.Catch">true</value>
<value type="bool" key="AutoTest.Framework.GTest">true</value>
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
</valuemap>
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
<value type="int" key="AutoTest.RunAfterBuild">0</value>
<value type="bool" key="AutoTest.UseGlobal">true</value>
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey">
<value type="QString">-fno-delayed-template-parsing</value>
</valuelist>
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
<value type="QString" key="ClangCodeModel.WarningConfigId">Builtin.BuildSystem</value>
<valuemap type="QVariantMap" key="ClangTools">
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
<value type="int" key="ClangTools.ParallelJobs">6</value>
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
</valuemap>
<valuemap type="QVariantMap" key="CppEditor.QuickFix">
<value type="bool" key="UseGlobalSettings">true</value>
</valuemap>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.3.1 MinGW static 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.3.1 MinGW static 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{f1ff2937-c384-4857-8fb4-abdb53acc94f}</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">F:\SourceCode\VTS\zffmpeg\build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">F:/SourceCode/VTS/zffmpeg/build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">F:\SourceCode\VTS\zffmpeg\build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">F:/SourceCode/VTS/zffmpeg/build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">F:\SourceCode\VTS\zffmpeg\build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Profile</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">F:/SourceCode/VTS/zffmpeg/build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value>
<value type="int" key="SeparateDebugInfo">0</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:F:/SourceCode/VTS/ZFFmpeg/zffmpeg/ZFFmpeg.pro</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">F:/SourceCode/VTS/ZFFmpeg/zffmpeg/ZFFmpeg.pro</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">F:/SourceCode/VTS/zffmpeg/build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Release</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="qlonglong">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>
Loading…
Cancel
Save