osg可以通过ffmpeg插件来实现播放视频的功能,但是在编译osg的时候要确保成功的完成才可以使用此插件。在编译的过程中有几点需特别注意,否则可能导致无法成功编译。
1、要正确选择ffmpeg的版本
首先要到https://ffmpeg.zeranoe.com/builds/win32/dev/下载ffmpeg的开发版,最小版本在3.2,这里也要特别注意,因为osg中的ffmpeg处理模块调用了ffmpeg开发库的相关接口,如果选择的版本不对应,会导致编译时候报诸如此类:error C2065: “PIX_FMT_YUVA420P”: 未声明的标识符,error C3861: “avcodec_alloc_frame”: 找不到标识符。。。等错误。osg3.4.0版本使用ffmpeg3.2及以上版本库的时候就会报这样的问题,所以尽量使用osg比较新的版本来避免此类问题。
2、在cmake配置的时候,要进行适当的修改和路径配置
修改OpenSceneGraph-3.6.3\CMakeModules\FindFFmpeg.cmake文件,在136行SET(FFMPEG_FOUND "NO")之后添加SET(STDINT_OK TRUE),同时确保CMake界面中的FFMPEG的FFMPEG_STDINT_INCLUDE_DIR为空。在cmake中选中Grouped,会看到一个ffmpeg的选项,正确选择ffmpeg的对应路径,以及反斜杠的问题。
3、inttypes.h问题
在common.h中可能会报无法打开包括文件:“inttypes.h”: No such file or directory的问题,解决如下:
注释掉#include <inttypes.h>
添加如下代码:
#if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
#define CONFIG_WIN32
#endif
#if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(EMULATE_INTTYPES)
#define EMULATE_INTTYPES
#endif
#ifndef EMULATE_INTTYPES
#include <inttypes.h>
#else
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
#ifdef CONFIG_WIN32
typedef signed __int64 int64_t;
typedef unsigned __int64 uint64_t;
#else /* other OS */
typedef signed long long int64_t;
typedef unsigned long long uint64_t;
#endif /* other OS */
#endif /* EMULATE_INTTYPES */
//
在Windows下可以播放 先编译好 Plugins ffmpeg
osgmovie -e ffmpeg d:\1.avi