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 */