前言
先要复杂点的例子可以看:
https://blog.csdn.net/JasonDing1354/article/details/41212425
https://blog.csdn.net/leixiaohua1020/article/details/44084321
不过先说明,要看看这些文章的时间,如果用的是很早之前的ffmpeg的版本的话
那么有些api是改了的,估计没办法可以运行得通。
正文
好了,先看看qt的目录结构:
CMakeLists.txt的内容如下--当然了,我这里删除掉一些没用的东西,只保留需要的东西:
cmake_minimum_required(VERSION 3.5)
SET(SOURCE_FILES
main.cpp
)
project(00_LearnOpenCV LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(X11 REQUIRED)
# ---[ FFMPEG
set( FFMPEG_BUILD_PATH /home/too-white/ffmpeg-build/target)
set( FFMPEG_INCLUDE_PATH ${FFMPEG_BUILD_PATH}/include)
set( FFMPEG_LIB_PATH ${FFMPEG_BUILD_PATH}/lib)
##头文件
include_directories(SYSTEM ${FFMPEG_INCLUDE_PATH})
list(APPEND LINKER_LIBS
${FFMPEG_LIB_PATH}/libavcodec.so
${FFMPEG_LIB_PATH}/libavformat.so
${FFMPEG_LIB_PATH}/libavutil.so
${FFMPEG_LIB_PATH}/libswresample.so
${FFMPEG_LIB_PATH}/libswscale.so
)
# ---[ OpenCV
find_package(OpenCV QUIET COMPONENTS core highgui imgproc imgcodecs videoio)
if(NOT OpenCV_FOUND) # if not OpenCV 3.x, then imgcodecs are not found
find_package(OpenCV REQUIRED COMPONENTS core highgui imgproc)
endif()
include_directories(SYSTEM ${OpenCV_INCLUDE_DIRS})
list(APPEND LINKER_LIBS ${OpenCV_LIBS})
message(STATUS "OpenCV found (${OpenCV_CONFIG_PATH})")
# ---[ Boost
## 引入boost类库
#导入需要使用的boost库,如regex filesystem thread
find_package(Boost REQUIRED COMPONENTS regex filesystem thread )
if (NOT Boost_FOUND)
message("Boost类库找不到---还没有配置吗??")
endif ()
#导入头文件
include_directories(${Boost_INCLUDE_DIRS})
#Boost_LIBRARIES的库顺便添加到liker_libs里面去。
list(APPEND LINKER_LIBS ${Boost_LIBRARIES})
INCLUDE(FindPkgConfig)
PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
add_executable(00_LearnOpenCV ${SOURCE_FILES})
target_include_directories(00_LearnOpenCV PRIVATE ${INCLUDE_DIR})
target_link_libraries(00_LearnOpenCV
${LINKER_LIBS}
${SDL2_LIBRARIES}
pthread
swresample
m
swscale
z
lzma
rt
)
测试用代码:
#include <stdio.h>
#include "ffmpegdecode.h"
#define __STDC_CONSTANT_MACROS
#ifdef _WIN32
//Windows
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
};
#else
//Linux...
#ifdef __cplusplus
extern "C"
{
#endif
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#ifdef __cplusplus
};
#endif
#endif
int is_h264_file(char *filename)
{
AVFormatContext *ifmt_ctx = NULL;
int ret = 0;
if ((ret = avformat_open_input(&ifmt_ctx, filename, 0, 0)) < 0) {
printf( "Could not open input file.");
return 0;
}
// printf("1ifmt_ctx->video_codec_id:%d\n",ifmt_ctx->video_codec_id);
if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) < 0) {
printf( "Failed to retrieve input stream information");
avformat_close_input(&ifmt_ctx);
return 0;
}
//ifmt_ctx->streams[0]->codecpar->codec_id;
printf("3ifmt_ctx->video_codec_id:%d\n",ifmt_ctx->streams[0]->codecpar->codec_id);
if(ifmt_ctx->streams[0]->codecpar->codec_id==AV_CODEC_ID_H264)
{
printf("is h264 file\n");
avformat_close_input(&ifmt_ctx);
return 1;
}
else
{
printf("is not h264 file\n");
avformat_close_input(&ifmt_ctx);
return 0;
}
}
int main(int argc, char* argv[])
{
char * filepath="/home/too-white/temp/002.mp4";
is_h264_file(filepath);
}
执行结果:
这个代码其实只是读取文件的编码判断是不是h264的格式,就用来测试一下。