Emscripten编译ffmpeg+libx264

分享一篇旧文:Emscripten编译ffmpeg+libx264。

第一步:搭建Emscripten编译环境(建议使用linux环境)

首先安装依赖包

# Install Python
sudo apt-get install python3

# Install CMake (optional, only needed for tests and building Binaryen)
sudo apt-get install cmake

# Install Java (optional, only needed for Closure Compiler minification)
sudo apt-get install default-jre

然后获取emsdk

下载地址:
git clone https://github.com/emscripten-core/emsdk.git

配置emsdk

# 进入emsdk目录
cd emsdk

# 下载依赖工具.
./emsdk install latest

# 激活sdk(感觉就是生成一下环境变量)
./emsdk activate latest

# 激活环境变量,使当前用户可以通过终端使用
source ./emsdk_env.sh

# 如果需要打开终端自动加载环境变量
vim ~/.bashrc
在最后一行添加
source path_to_emsdk/emsdk_env.sh

验证一下

# 编辑test.c文件
vim test.c

# 输入
#include <stdio.h>

int main() {
printf("hello, world!\n");
return 0;
}

# 执行编译
emcc test.c -o test.html

# 生成三个文件
test.html --- 测试页面
test.js --- 调用js
test.wasm --- 二进制库

# 执行
## 方法一:使用npm的static-server
npm install -g static-server
static-server

然后通过web浏览器访问http://127.0.0.1:9080/test.html

## 方法二:
使用node直接执行
node test.js

第二步,编译libx264

下载源码

下载地址:
https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2

编译

# 解压
tar xvjf x264-master.tar.bz2

# 进入目录
cd x264-master

# 配置Makefile
emconfigure ./configure --prefix=/home/test/libs/ --enable-static --disable-asm \
--host=i686-gnu --disable-cli --extra-cflags="-s USE_PTHREADS=1"

# 编译
emake make

# 安装,会安装到--prefix指定的目录
emmake install

# 在--prefix目录下会有include和lib目录
include----- 头文件目录
|---x264.h
|---x264_config.h
lib---------库目录
|---libx264.a
|---pkgconfig

第三步,编译ffmpeg

下载源码

下载地址:
https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2

编译

# 解压
tar xvjf ffmpeg-snapshot.tar.bz2

# 进入目录
cd ffmpeg-snapshot

# 配置Makefile
emconfigure ./configure --prefix=/home/test/libs --enable-gpl \
--enable-libx264 --enable-cross-compile --target-os=none --arch=x86_64 \
--cpu=generic --disable-ffplay --disable-ffprobe --disable-asm --disable-doc \
--disable-devices --disable-pthreads --disable-w32threads --disable-network \
--disable-hwaccels --disable-parsers --disable-bsfs --disable-debug \
--disable-protocols --disable-indevs --disable-outdevs --enable-protocol=file \
--cc="emcc" --cxx="em++" --ar="emar" --ranlib="emranlib" \
--extra-cflags="-I/home/test/libs/include" \
--extra-cxxflags="-I/home/test/libs/include" \
--extra-ldflags="-L/home/test/libs/lib -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=2"

# 编译
emake make

编译过程中遇到的问题

问题一:ERROR: libx264 not found

该问题是由于ffmpeg无法找到libx264库,网上很多问答都只说添加–extra-cflags就可以了,但是实际操作的时候仍然会报错;其实还需要增加–extra-cxxflags和–extra-ldflags,即:–extra-cflags和–extra-cxxflags使用-I指定头文件目录 –extra-ldflags使用-L指定库文件目录

问题二:wasm-ld: error: libavdevice/libavdevice.a: archive has no index; run ranlib to add one

该问题是由于没有指定ranlib工具的问题,需要在配置的时候添加–ranlib=”emranlib”

问题三:strip: ffmpeg_g: file format not recognized

在config.log里面会看到

emcc: warning: ignoring unsupported linker flag:
`-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample` [-Wlinkflags]

原因是emcc不支持-rpath参数,所以需要在makefile里面把这部分注释掉

# 编辑Makefile,大概在99行
$(PROGS): %$(PROGSSUF)$(EXESUF): %$(PROGSSUF)_g$(EXESUF)
ifeq ($(STRIPTYPE),direct)
$(STRIP) -o $@ $<
else
$(CP) $< $@
$(STRIP) $@
endif

# 最后就是把ffmpeg_g拷贝到ffmpeg,其实不改也没关系,直接用ffmpeg_g就可以了,修改为如下:
$(PROGS): %$(PROGSSUF)$(EXESUF): %$(PROGSSUF)_g$(EXESUF)
#ifeq ($(STRIPTYPE),direct)
# $(STRIP) -o $@ $<
#else
$(CP) $< $@
# $(STRIP) $@
#endif

注意

出问题一定要记得看ffbuild/config.log,不要只看终端返回内容,写的很模糊,config.log里面会写的很细。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论