mac平台electron native(ffmpeg)模块编译

来源:互联网 发布:客户信息管理系统php 编辑:程序博客网 时间:2024/06/11 13:16

近段时间一直在忙着编译mac平台下ffmpeg库用于electron项目。搜索了很多资料才终于把整个编译过程整通过。

1.查看以下安装说明并安装ffmpeg依赖模块

http://blog.csdn.net/matrix_laboratory/article/details/53519165

http://blog.csdn.net/willib/article/details/52530328

2. 编译FFMPEG模块

#说明:#FFMPEG版本:3.2.2#配置命令:./configure --enable-gpl --enable-version3 --enable-nonfree \--enable-bzlib --enable-iconv --enable-zlib --enable-libopus \--enable-libfdk-aac --enable-libx264 --enable-libvpx --enable-libfreetype \--enable-fontconfig --enable-libass --enable-libssh \--enable-static \--disable-sdl2 \--extra-ldflags=-L/usr/local/lib#编译模块make BITS=64#安装模块至../../ffmpeg_dev64 目录DESTDIR='../../ffmpeg_dev64' make install#修正目录中模块INSTALL_DIR=../../ffmpeg_dev64cp -r $INSTALL_DIR/usr/local/  $INSTALL_DIRrm -r $INSTALL_DIR/usr/#清理垃圾make clean

 

3.安装electron

#electron:#安装1.4.4版本npm install electron@1.4.4

4.配置node-gyp编译脚本

{"targets":[{"target_name":"xxx",        'include_dirs': [            '.',            '../3rd-mac/ffmpeg/include',            '../3rd-mac/iojs/deps/uv/include',            '../3rd-mac/iojs/deps/npm',            '../3rd-mac/iojs/deps/v8',            '../3rd-mac/iojs/deps/http_parse',            '../3rd-mac/iojs/deps/zlib',            '../3rd-mac/iojs/src',            '/usr/local/include'        ],"sources":["RegisterModules.cpp","xxx.cpp",],'libraries': ["-lstdc++","-lpthread","-lsdl2",  "-lavcodec","-lavdevice","-lavfilter","-lavformat","-lavutil","-lpostproc","-lswresample","-lswscale","-lopus","-logg","-lfdk-aac","-lvpx","-lass","-lx264","-liconv","-lfontconfig","-lfreetype","-lssh","-lssl","-lbz2","-lz","-llzma","-framework CoreGraphics","-framework CoreVideo","-framework Foundation","-framework AVFoundation","-framework CoreMedia","-framework QuartzCore","-framework AppKit","-framework OpenGL","-framework VideoDecodeAcceleration","-framework CoreFoundation","-framework CoreServices","-framework Security"        ],        'xcode_settings': {            'GCC_ENABLE_CPP_EXCEPTIONS': 'NO',        'OTHER_CFLAGS':[        '-std=c++11',        '-stdlib=libc++'        ]        },'defines': [        ],        'cflags-cc':[        ],        'cflags':[        ],        'ldflags':[        ],}]}



5.node-gyp编译模块

#!/bin/shLDFLAGS='-L../../xxx/ -L/usr/local/lib/ -L../../3rd-mac/ffmpeg/lib/' node-gyp rebuild --target=1.4.4 --arch=x64 --dist-url=https://atom.io/download/electron



6.makefile编译脚本

CC = gccCXX = g++AR = arRM = rm -rf#原始目录SRC_PATH :=.#目标名TARGET :=xxx#源文件SRCS += $(wildcard $(SRC_PATH)/*.cpp)#中间文件OBJS := $(SRCS:.cpp=.o)#node模块动态库路径NODE_MODULE_PATH="/usr/local/lib/node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries"#动态库LIBS := stdc++ pthread sdl2  \avcodec avdevice avfilter avformat avutil postproc swresample swscaleLIBS += opus ogg fdk-aac vpx ass x264 iconv fontconfig freetype ssh ssl bz2 z lzmaFRAMEWORK :=  Foundation AVFoundation CoreFoundation VideoToolbox AudioToolbox CoreMedia CoreVideo \QuartzCore AppKit OpenGL \CoreServices Security Security \CoreGraphics VideoDecodeAcceleration CoreServices#模块头文件MODULE_INCLUDE_PATH = ../3rd-mac/ffmpeg/include ../3rd-mac/iojs/deps/uv/include \../3rd-mac/iojs/deps/npm ../3rd-mac/iojs/deps/v8/include \../3rd-mac/iojs/deps/http_parse ../3rd-mac/iojs/deps/zlib ../3rd-mac/iojs/src#模块库文件MOULE_LIBRARY_PATH = ../3rd-mac/ffmpeg/lib/ /usr/lib/ /usr/local/lib/ /usr/local/opt/openssl/lib/ LD_LIBRARY_PATH = -L$(NODE_MODULE_PATH)#头文件路径INCLUDE_PATH :=. #动态库路径LIBRARY_PATH :=../xxx INCLUDE_PATH += $(MODULE_INCLUDE_PATH)LIBRARY_PATH += $(MOULE_LIBRARY_PATH)RELEASE = 1BITS =#ifeq ( 1 , ${DBG_ENABLE} )#CFLAGS += -D_DEBUG -O0 -g -DDEBUG=1#endifCFLAGS = -Wall -std=c++11 -stdlib=libc++LFLAGS =#头文件CFLAGS += $(foreach dir,$(INCLUDE_PATH),-I$(dir))#库路径LDFLAGS += $(foreach lib,$(LIBRARY_PATH),-L$(lib))#库名LDFLAGS += $(foreach lib,$(LIBS),-l$(lib))#框架名LDFLAGS += $(foreach lib,$(FRAMEWORK),-framework $(lib))LDFLAGS +=$(LD_LIBRARY_PATH)#延迟加载模块LDFLAGS += -Wl,-L$(NODE_MODULE_PATH),-lazy-lnode#检查版本ifeq ($(RELEASE),0)#debugCFLAGS += -gelse#releaseCFLAGS += -O3 -DNDEBUGendif#检查位宽ifeq ($(BITS),32)CFLAGS += -m32LFLAGS += -m32elseifeq ($(BITS),64)CFLAGS += -m64LFLAGS += -m64elseendifendif#操作命令all:clean dynamic$(OBJS):%.o:%.cpp$(CXX) $(CFLAGS) -c $^ -o $@build:$(OBJS)$(CXX) $(LFLAGS) -o $(TARGET) $(OBJS) $(LDFLAGS)$(RM) $(OBJS)packet:$(OBJS)$(AR) -r $(TARGET).a $(OBJS)$(RM) $(OBJS)dynamic:$(CXX) -fPIC -shared $(SRCS) $(CFLAGS) $(LDFLAGS) $(LFLAGS) -o $(TARGET).node$(RM) $(OBJS)clean:echo $(SRCS)$(RM) $(OBJS) $(TARGET)$(TARGET).a


7.修改electron-build package.Json

{  "name": "xxx",  "version": "0.0.1",  "win32metadata":{    "CompanyName":"1",    "FileDescription":"2",    "OriginalFilename":"3",    "ProductName":"4",    "InternalName":"5"  },  "revision":"0.0.1",  "devDependencies": {    "electron-prebuilt": "^1.4.4",    "electron-builder": "^10.9.2"  },  "homepage": "http://evomotion.com",  "description": "xxx Release Version.",  "author": "xxx Tech Inc.",  "license": "ISC",  "build": {    "appId":"M8Y3XUZGHE",  "asar":true,    "directories":{      "app":"../xxx.app/Contents/Resources/app/"    },    "extraResources":[      {       "from": "../dylib/",       "to": "${arch}/../../dylib/",       "filter": ["**/*.dylib", "!**/*.node"]     }    ],    "dmg":{      "title": "xxx",      "icon": "title.icns",      "window":{        "x":400,        "y":400      }    },    "mac": {      "title": "xxx",      "target":"dmg",      "background": "title.png",      "icon": "title.icns",      "fileAssociations":{        "name":"Applications",        "icon":"title.icns"      },      "icon-size": 128    },    "nsis":{      "installerIcon":"title.ico",  "installerHeader":"title.png",      "installerHeaderIcon":"title.ico",  "oneClick":false,  "allowToChangeInstallationDirectory":true,  "runAfterFinish":false    },"win": {  "target": "nsis",      "title": "xxx",  "legalTrademarks":"http://www.evomotion.com/",      "icon": "title.ico"    }  },  "scripts": {    "dist": "npm run dist:mac",    "dist:mac": "build --platform darwin --arch x64 ",    "dist:win": "build --platform win32 --arch all ",    "dist:linux": "build --platform linux --arch x64 "  }}


8.修正模块依赖路径

#!/bin/shPRODUCT_PATH=../dylibINSTALL_PATH=/usr/local/libLOAD_PATH=@rpath/../dylibPRODUCT_NAME=$PRODUCT_PATH/xxx.nodeinstall_name_tool -change "$INSTALL_PATH/libSDL2-2.0.0.dylib" "$LOAD_PATH/libSDL2.dylib" "$PRODUCT_NAME"install_name_tool -change "$INSTALL_PATH/libopus.0.dylib" "$LOAD_PATH/libopus.0.dylib" "$PRODUCT_NAME"install_name_tool -change "$INSTALL_PATH/libogg.0.dylib" "$LOAD_PATH/libogg.0.dylib" "$PRODUCT_NAME"install_name_tool -change "$INSTALL_PATH/libfdk-aac.1.dylib" "$LOAD_PATH/libfdk-aac.1.dylib" "$PRODUCT_NAME"install_name_tool -change "$INSTALL_PATH/libx264.146.dylib" "$LOAD_PATH/libx264.146.dylib" "$PRODUCT_NAME"install_name_tool -change "$INSTALL_PATH/liblzma.5.dylib" "$LOAD_PATH/liblzma.5.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/libass/lib/libass.9.dylib" "$LOAD_PATH/libass.9.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/fontconfig/lib/libfontconfig.1.dylib" "$LOAD_PATH/libfontconfig.1.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/freetype/lib/libfreetype.6.dylib" "$LOAD_PATH/libfreetype.6.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/libssh/lib/libssh.4.dylib" "$LOAD_PATH/libssh.4.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/lib/libiconv.2.dylib" "$LOAD_PATH/libiconv.2.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/lib/libssl.0.9.8.dylib" "$LOAD_PATH/libssl.0.9.8.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/lib/libbz2.1.0.dylib" "$LOAD_PATH/libbz2.1.0.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/lib/libz.1.dylib" "$LOAD_PATH/libz.1.dylib" "$PRODUCT_NAME"LOAD_PATH=@loader_pathPRODUCT_NAME=$PRODUCT_PATH/libSDL2.dylibinstall_name_tool -change "/usr/lib/libiconv.2.dylib" "$LOAD_PATH/libiconv.2.dylib" "$PRODUCT_NAME"PRODUCT_NAME=$PRODUCT_PATH/libass.9.dylibinstall_name_tool -change "/usr/lib/libiconv.2.dylib" "$LOAD_PATH/libiconv.2.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/fribidi/lib/libfribidi.0.dylib" "$LOAD_PATH/libfribidi.0.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/glib/lib/libglib-2.0.0.dylib" "$LOAD_PATH/libglib-2.0.0.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/gettext/lib/libintl.8.dylib" "$LOAD_PATH/libintl.8.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/fontconfig/lib/libfontconfig.1.dylib" "$LOAD_PATH/libfontconfig.1.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/freetype/lib/libfreetype.6.dylib" "$LOAD_PATH/libfreetype.6.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/harfbuzz/lib/libharfbuzz.0.dylib" "$LOAD_PATH/libharfbuzz.0.dylib" "$PRODUCT_NAME"PRODUCT_NAME=$PRODUCT_PATH/libfribidi.0.dylibinstall_name_tool -change "/usr/local/opt/glib/lib/libglib-2.0.0.dylib" "$LOAD_PATH/libglib-2.0.0.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/gettext/lib/libintl.8.dylib" "$LOAD_PATH/libintl.8.dylib" "$PRODUCT_NAME"PRODUCT_NAME=$PRODUCT_PATH/libglib-2.0.0.dylibinstall_name_tool -change "/usr/lib/libiconv.2.dylib" "$LOAD_PATH/libiconv.2.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/pcre/lib/libpcre.1.dylib" "$LOAD_PATH/libpcre.1.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/gettext/lib/libintl.8.dylib" "$LOAD_PATH/libintl.8.dylib" "$PRODUCT_NAME"PRODUCT_NAME=$PRODUCT_PATH/libintl.8.dylibinstall_name_tool -change "/usr/lib/libiconv.2.dylib" "$LOAD_PATH/libiconv.2.dylib" "$PRODUCT_NAME"PRODUCT_NAME=$PRODUCT_PATH/libharfbuzz.0.dylibinstall_name_tool -change "/usr/local/opt/glib/lib/libglib-2.0.0.dylib" "$LOAD_PATH/libglib-2.0.0.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/gettext/lib/libintl.8.dylib" "$LOAD_PATH/libintl.8.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/freetype/lib/libfreetype.6.dylib" "$LOAD_PATH/libfreetype.6.dylib" "$PRODUCT_NAME"PRODUCT_NAME=$PRODUCT_PATH/libfontconfig.1.dylibinstall_name_tool -change "/usr/local/opt/freetype/lib/libfreetype.6.dylib" "$LOAD_PATH/libfreetype.6.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/lib/libexpat.1.dylib" "$LOAD_PATH/libexpat.1.dylib" "$PRODUCT_NAME"PRODUCT_NAME=$PRODUCT_PATH/libfreetype.6.dylibinstall_name_tool -change "/usr/lib/libz.1.dylib" "$LOAD_PATH/libz.1.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/lib/libbz2.1.0.dylib" "$LOAD_PATH/libbz2.1.0.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/local/opt/libpng/lib/libpng16.16.dylib" "$LOAD_PATH/libpng16.16.dylib" "$PRODUCT_NAME"PRODUCT_NAME=$PRODUCT_PATH/libpng16.16.dylibinstall_name_tool -change "/usr/lib/libz.1.dylib" "$LOAD_PATH/libz.1.dylib" "$PRODUCT_NAME"PRODUCT_NAME=$PRODUCT_PATH/libssh.4.dylibinstall_name_tool -change "/usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib" "$LOAD_PATH/libcrypto.1.0.0.dylib" "$PRODUCT_NAME"install_name_tool -change "/usr/lib/libz.1.dylib" "$LOAD_PATH/libz.1.dylib" "$PRODUCT_NAME"PRODUCT_NAME=$PRODUCT_PATH/libssl.0.9.8.dylibinstall_name_tool -change "/usr/lib/libcrypto.0.9.8.dylib" "$LOAD_PATH/libcrypto.0.9.8.dylib" "$PRODUCT_NAME"PRODUCT_NAME=$PRODUCT_PATH/libcrypto.0.9.8.dylibinstall_name_tool -change "/usr/lib/libz.1.dylib" "$LOAD_PATH/libz.1.dylib" "$PRODUCT_NAME"




备注:

如果在运行node模块时出现Module did not self-register问题,请检查node模块导出函数是否正确.

0 0
原创粉丝点击