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

linux编译ffmpeg静态版本,linux下采用PNacl编译ffmpeg4.1

一、发此文的目的1、对于想通过在chrome浏览器上通过插件的方式跑视频的话,可以解决有无的问题。2、对于本文提到的问题欢迎有经验的大神给予指导。二、为什么要做这个事

一、发此文的目的

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)自己实现才能解决。但是静态库的解码功能是正常可以使用。

2、编译出的静态库只能在linux下进行二次开发使用,在windows当中进行编译会通过,但链接时会出现不明原因错误,导致生成不了pexe。

八、未来需要解决的问题

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

7c6147122dfed027f620e58cce438501.png

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

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

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

八、致谢

1、在线流媒体测试视频

rtsp://184.72.239.149:554/vod/mp4:BigBuckBunny_115k.mov

2、编译选项启发:

https://github.com/mdhsl/FFmpeg-Pnacl



推荐阅读
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 在 CentOS 7 系统中安装 Scrapy 时遇到了一些挑战。尽管 Scrapy 在 Ubuntu 上安装简便,但在 CentOS 7 上需要额外的配置和步骤。本文总结了常见问题及其解决方案,帮助用户顺利安装并使用 Scrapy 进行网络爬虫开发。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 在 CentOS 7 中,为了扩展可用软件包的数量,通常需要配置多个第三方软件源。这些第三方源包括 EPEL、Nux Dextop 和 ELRepo 等,它们提供了大量官方源中未包含的软件包,从而增强了系统的功能性和灵活性。通过正确配置这些源,用户可以轻松安装和管理更多种类的软件,满足不同的需求。 ... [详细]
  • 本文详细介绍了如何在Linux系统(以CentOS为例)上彻底卸载Zimbra邮件系统,包括停止服务、删除文件和用户等步骤。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 在VS2013中编译FFMPEG时遇到的问题及解决方案
    在使用VS2013编译旧版本FFMPEG库时遇到了一些问题,因为官方并未提供预编译的LIB和DLL文件。由于对Linux环境不熟悉,只能在Windows环境下进行配置和编译。具体步骤如下:首先,下载FFMPEG的源代码;然后,安装必要的编译工具和依赖项;接着,配置Visual Studio 2013的项目设置;最后,解决编译过程中出现的各种错误和警告。通过这些步骤,最终成功编译出所需的FFMPEG库文件。 ... [详细]
  • 求助:在CentOS 5.8系统上安装PECL扩展遇到问题
    在 CentOS 5.8 系统上尝试安装 APC 扩展时遇到了问题,具体表现为 PECL 工具无法正常工作。为了确保顺利安装,需要解决 PECL 的相关依赖和配置问题。建议检查 PHP 和 PECL 的版本兼容性,并确保所有必要的库和开发工具已正确安装。此外,可以尝试手动下载 APC 扩展的源代码并进行编译安装,以绕过 PECL 工具的限制。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
author-avatar
飘飘秀秀真人_562
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有