使用emscripten编译ffmpeg程序为js

上面两个博客已经介绍了如何安装enscripten以及如何使用emscripten编译第三方库ffmpeg,本博客主要以本人所作的web播放器为例,介绍如何将调用了第三方库的C程序编译为可供js调用的wasm文件的方法。

在本人所作的项目中,需要编译的C语言程序主要需要完成的工作是将前端js读入内存的视频文件进行解码,并将解码后的文件传给前端js的工作。简单来说待编译的C文件的作用就是解码

在开始介绍如何编译之前先介绍下编译结果,以方便后续的描述。以下为编译结果:

如上所示其中:.html文件暂且用不到不做解释。wasm文件为C程序编译后的结果,相当于使用gcc编译后的可执行文件。js文件相当于供前端调用wasm文件的入口函数。

ok,现在开始正式介绍编译过程。

根据本人的理解,由于编译后的wasm文件在运行时自成系统,且不具有IO等以供传递数据,说以在编译C至wasm时需要暴露一个函数以供前端js的调用,同时wasm使用这个函数的参数获取js读入内存的视频文件的指针,wasm程序对视频文件进行解码后再通过这个函数将解码后的文件指针返回给前端js,以供后续播放程序的使用。具体函数结构如下:如上图所示

EMSCRIPTEN_KEEPALIVE:在这里的作用是告诉编译器将次函数暴露给js,以供后续调用。

MediaData:解码后的数据指针,用于返回给前端js以供调用。

*buff:前端读入的视频文件的指针

buffLength:视频文件的长度,以供wasm中的程序调用。

out_width、out_height:输出视频的分辨率

在完成了对原始C程序的修改后,开始最激动人心的时刻,编译!

编译代码 $:emcc simplest_ffmpeg_decoder.cpp ./lib/libavformat.bc ./lib/libavcodec.bc ./lib/libswscale.bc ./lib/libswresample.bc ./lib/libavutil.bc  -I./include    -Os -s WASM=1 -o player.html -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]' -s ALLOW_MEMORY_GROWTH=1   -s TOTAL_MEMORY=671088640

编译后的结果如本文开始所示,本文到此已经结束,祝大家编译顺利!

 

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值