热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux下采用PNacl编译ffmpeg4.1

本文通过在linux下面采用PNacl编译ffmpeg4.1,实现了chrome插件也能够使用(部分功能)ffmp

一、发此文的目的

1、对于想通过在chrome浏览器上通过插件的方式跑视频的话,可以解决有无的问题。

2、对于本文提到的问题欢迎有经验的大神给予指导。

二、为什么要做这个事情

由于工作关系,需要在chrome浏览器上实现一个播放视频监控的插件。插件架构选择PNacl,通过对nacl-sdk自带的pp::VideoDecoder进行测试后发现,它非常不稳定,跑rtsp://184.72.239.149:554/vod/mp4:BigBuckBunny_115k.mov,几秒后帧解码就不正常了,图像出不来了,如果跑高分辨率的监控的话,连一个图片也解码不出来,通过对chromium项目的初步研究,pp::VideoDecoder在解码时如果是h.264的话也是ffmpeg参与的解码。折腾了好久,也不知道问题出在哪里,如果有哪位大神踩过这个坑,欢迎沟通讨论。

后面转换思路,抛弃掉nacl-sdk自带的解码功能,采用ffmpeg进行解码,后面取得了成功。下面对过程做一记录,并对可能出现的问题作一个说明。

三、原材料准备

1、CentOS 6.8 X64

2、nacl_sdk linux版(如何获取nacl_sdk不在此讨论)

3、GLIBC要升级到2.15

4、Python2.7(编译插件的时候需要)

5、ffmpeg4.1

四、安装nacl_sdk

只需要设置环境变量即可:

NACL_SDK_ROOT=/home/nacl_sdk/pepper_49
export NACL_SDK_ROOT
PATH=$PATH:/home/nacl_sdk/pepper_49/toolchain/linux_pnacl/bin

五、编译ffmpeg

进入到ffmpeg-4.1目录,执行如下命令

./configure \
    --target-os=linux \
    --arch=pnacl \
    --prefix="$NACL_SDK_ROOT/toolchain/linux_pnacl/le32-nacl/usr" \
    --cross-prefix=pnacl- \
    --cc=pnacl-clang \
    --ld=pnacl-clang++ \
    --enable-static
make
make install

编译完成后,在$NACL_SDK_ROOT/toolchain/linux_pnacl/le32-nacl/usr目录下面会有7们le-32架构的静态库,供二次开发使用。

libavcodec.a
libavdevice.a
libavfilter.a
libavformat.a
libavutil.a
libswresample.a
libswscale.a

六、在编译过程中可能遇到的问题

1、libavformat/codec2.c:22:10: fatal error: ‘memory.h‘ file not found
  在ffbuild/config.mak文件里面找到CFLAGS,增中头文件依赖-I/home/nacl_sdk/pepper_49/include/pnacl

修改后的样子为:

CFLAGS=   -std=c11 -fomit-frame-pointer -pthread -g -Wdeclaration-after-statement -Wall -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef -Wmissing-prototypes -Wno-pointer-to-int-cast -Wstrict-prototypes -Wempty-body -Wno-parentheses -Wno-switch -Wno-format-zero-length -Wno-pointer-sign -Wno-unused-const-variable -O3 -fno-math-errno -fno-signed-zeros -Werror=implicit-function-declaration -Werror=missing-prototypes -Werror=return-type -I/home/nacl_sdk/pepper_49/include/pnacl
 2、fftools/cmdutils.c:1072:19: error: variable has incomplete type ‘struct rlimit‘
  找到opt_timelimit函数在
  #if HAVE_SETRLIMIT后面增加 && !defined(__pnacl__)
  修改后的样子是:
  #if HAVE_SETRLIMIT && !defined(__pnacl__)
 3、fftools/ffmpeg.c:4800:5: error: implicit declaration of function ‘getrusage‘ is invalid in C99
  找到get_benchmark_time_stamps函数在#if HAVE_GETRUSAGE后面增加&& !defined(__pnacl__)
  修改后的样子:
  #if HAVE_GETRUSAGE && !defined(__pnacl__)

七、需要说明的问题

1、ffmpeg的静态库当中的网络连接功能不能使用,即avformat_open_input是不能使用的。测试过程中一直返回错误,推测可能是由于chrome的沙箱的拦截造成的,网络部分需要通过nacl_sdk的pp::HostResolver、pp::TCPSocket(或者pp::UDPSocket)自己实现才能解决。但是静态库的解码功能是正常可以使用。

八、未来需要解决的问题

1、播放过程中有花屏现象(原因不明)效果如下图所示:

技术分享图片

经过测试,相同版本的ffmpeg在编译出来的windows的dll库上是不存在此问题的,不知道是不是与pnacl不支持汇编,而ffmpeg有汇编代码有关,欢迎大神们解惑。

2、不支持高清分辨率的视频

经过测试,如果是高清的主码流可以很好的播放,但是如果是主码流1080p的rtsp的话播放会出现花屏和条带现象。

 


推荐阅读
  • ARToolKitunity
    ARToolKit为开源的AR库,相对于高通和easyAr有几点特点:1)开源2)识别项目可以动态添加(详细在后)3)识别文件可以本地生成4)目前只能识别图片(目前为.jpg格式) ... [详细]
  • 以SOA服务为导向的信息系统构建是通过有计划地构建信息系统时,一种简单而有柔性的方法,就是组件化与服务导向架构。过去的信息系统,是在使用者需要新功能时才开发的,也就是响应不同时 ... [详细]
  • 目录结构如下:Nginx基础知识NginxHTTP服务器的特色及优点Nginx的主要企业功能Nginx作为web服务器的主要应用场景包括:Nginx的安装安装环境 ... [详细]
  • ASP.NET Core WebAPI 开发新建WebAPI项目  转
    转 http:www.cnblogs.comlinezerop5497472.htmlASP.NETCoreWebAPI开发-新建WebAPI项目ASP.NETCoreWebAPI ... [详细]
  • 步骤一:明确主打的核心目标用户群(对应产品侧的定位)这个核心目标用户群体是该产品成功挤进市场的切入点,甚至是撬动市场的支点和撬杠。市面上几乎很少有产品是专门给一个群体用而对其他群体 ... [详细]
  • 猫猫分享,必须精品原文地址:http:blog.csdn.netu013357243articledetails44571163素材地址:http:download.csdn.n ... [详细]
  • 2019.4.14第1001题:SumProblemProblemDescriptionHey,welcometoHDOJ(HangzhouDianziUniversityOnli ... [详细]
  • Git(1)
    安装Git完毕(在开始菜单打开的话,打开的不是你想要的路径,切换路径很麻烦)1.D盘新建GitTest文件夹2.打开GitTest,在空白的地方右键,3.单击GitBashHere ... [详细]
  • python基础(二、pycharm安装、卸载)
    3.在Ubuntu中安装PyCharmPyCharm的官方网站地址是:https:www.jetbrains.compycharm注意:安装时不要使用root用户安装,否则后期使用 ... [详细]
  • 这一篇主要总结一下jQuery这个js在引入的时候做的一些初始化工作第一句window.undefinedwindow.undefined;是为了兼容低版本的IE而写的因为在低版本 ... [详细]
  • spotify engineering culture part 1
    原文,因为原视频说的太快太长,又没有字幕,于是借助youtube,把原文听&打出来了。中文版日后有时间再翻译。oneofthebigsucceessfactorshereatSpo ... [详细]
  • MyBatis模糊查询和多条件查询一、ISmbmsUserDao层根据姓名模糊查询publicListgetUser();多条件查询publicList ... [详细]
  • vscode里的html标签导航的一系列问题
    哈喽,我今天带来的经验是,vscode在18年10月更新后的1.29以后,编辑html文档时,会发现最上面有个类似于HTML标签导航的玩意儿,可能部分同学和我一样不习惯用它们,现在 ... [详细]
  • iOS之富文本
    之前做项目时遇到一个问题:使用UITextView显示一段电影的简介,由于字数比较多,所以字体设置的很小,行间距和段间距也很小,一大段文字挤在一起看起来很别扭,想要把行间距调大,结 ... [详细]
  • 例子如Table表有性别字段,1代表男2代表女、3代表中性、还有没填就代表未说明selectid,decode(sex,'1','男', ... [详细]
author-avatar
_快樂Smile_903
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有