x86_64/aarch64架构下ffpyplayer源码编译
问题来源:
某鱼上挂着pytorch的aarch64架构下的源码编译,遇到某网友提出的要在aarch64架构下的ubuntu上ffpyplayer源码编译,于是有了本文。
=================================================
1.下载源码
ffpyplayer源码下载地址:
https://github.com/matham/ffpyplayer
2. 安装依赖环境
官网的教程:
https://matham.github.io/ffpyplayer/installation.html
官网给出的ubuntu18.04下的安装依赖为:(经过证实该种方式现已无法源码编译ffpyplayer,但是可以安装预编译版本ffpyplayer)
sudo apt install ffmpeg libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev \
libavutil-dev libswscale-dev libswresample-dev libpostproc-dev libsdl2-dev libsdl2-2.0-0 \
libsdl2-mixer-2.0-0 libsdl2-mixer-dev python3-dev
如果你使用预编译方式安装,那么上面的依赖环境就可以,直接安装预编译版本:
pip install ffpyplayer
但是,如果你准备源码编译ffpyplayer那么上面的这个依赖环境则是错误的,编译过程中会报错:
fatal error: “libavcodec/avcodec.h”: No such file or directory
报错原因为:
ubuntu的默认安装的avcodec版本过低,其中没有avcodec.h头文件,由于我们现在使用的ffpyplayer版本比较高,为此我们有两个选择,第一个选择就是降低ffpyplayer版本,第二个选择就是手动安装最新版本的avcodec库。
因此如果我们使用ffpyplayer的源码安装那么我们的依赖环境安装则需要去掉ffmpeg和avcodec的安装,这样依赖安装则为:
sudo apt install libavdevice-dev libavfilter-dev libavformat-dev \
libavutil-dev libswscale-dev libswresample-dev libpostproc-dev libsdl2-dev libsdl2-2.0-0 \
libsdl2-mixer-2.0-0 libsdl2-mixer-dev python3-dev
这里需要注意,依赖环境中去掉ffmpeg和avcodec只是为了保证编译ffpyplayer的时候安全些,其实就是不去掉的话只要在编译ffpyplayer的时候设置好库地址也是可以的。
这里我们选择使用手动编译最新版本的avcodec库,同时发现这个库是给ffmpeg使用的,因此我们只要源码编译最新版本的ffmpeg也就可以满足编译最新版本的avcodec库的需求,于是选择手动编译最新版本的ffmpeg。
也就是说源码编译ffpyplayer的问题现在成为了源码编译FFmpeg的问题。
--------------------------------------------------------------------------------------
以下内容为ffmpeg和avcodec库的源码编译操作:
下载ffmpeg源码:
git clone https://git.ffmpeg.org/ffmpeg.git
ffmpeg的源码编译:
参考:https://zhuanlan.zhihu.com/p/347780238
如果只想把ffmpeg安装到个人路径下则如下配置:
./configure --prefix=host --enable-shared --disable-static --disable-doc --enable-ffplay
如果想把ffmpeg安装到系统路径下,那么可以去掉--prefix选项,即:
./configure --enable-shared --disable-static --disable-doc --enable-ffplay
这里我们选择的则是安装到个人路径下,即:
./configure --prefix=host --enable-shared --disable-static --disable-doc --enable-ffplay
(需要注意:该种方式编译后安装的路径就在源码路径下的host文件夹下)
编译&安装:
make
make install
为ffpyplayer设置FFmpeg的地址,然后进行ffpyplayer的源码编译:
需要注意的是现在主流的python的lib库的编译环境为anaconda,我们这里使用的python环境也是anaconda,但是需要注意的是anaconda会将所用到的所有Linux的系统lib库设置好预安装版本,并且对自己的anaconda环境设置一个和操作系统独立的lib库环境,因此anaconda环境接受的系统动态链接库只有系统默认环境下的,对于设置LD_LIBRARY_PATH环境是不接受的,不过经过调查发现anaconda可以通过设置环境变量LIBRARY_PATH的方式设置其他的动态链接库地址。
我们这里下载的ffpyplayer的源码地址为:
/root/ffpyplayer
为了方便,我们把刚才的ffmpeg的源码地址放在的路径为:
/root/ffpyplayer/ffmpeg
因此我们为ffpyplayer设置的依赖环境的变量为:
export LIBRARY_PATH=/root/ffpyplayer/ffmpeg:/root/ffpyplayer/ffmpeg/libswscale:/root/ffpyplayer/ffmpeg/libswresample:/root/ffpyplayer/ffmpeg/libpostproc:/root/ffpyplayer/ffmpeg/libavutil:/root/ffpyplayer/ffmpeg/libavformat:/root/ffpyplayer/ffmpeg/libavfilter:/root/ffpyplayer/ffmpeg/libavdevice:/root/ffpyplayer/ffmpeg/libavcodec
这样我们也就把ffmpeg的lib地址和依赖的编解码器的lib地址设置为anaconda可以识别的环境变量。
上面的工作结束后即可进入到ffpyplayer的源码文件夹下,进行编译和安装:
python setup.py install
需要注意的是这时往往会报错,错误为cython的错误,给出解决方法:
ffpyplayer源码编译报错:ffpyplayer/tools.pyx:182:28: Cannot assign type 'void (*)(void *, int, const char *, va_list) except * nogil' to 'void (*)(void *, int, const char *, va_list) noexcept nogil' 
=================================================
编译并安装成功后,测试一下:
from ffpyplayer.pic import Image, SWScale
w, h = 500, 100
size = w * h * 3
buf = bytearray([int(x * 255 / size) for x in range(size)])
img = Image(plane_buffers=[buf], pix_fmt='rgb24', size=(w, h))
sws = SWScale(w, h, img.get_pixel_format(), ofmt='yuv420p')
img2 = sws.scale(img)
img2.get_pixel_format()
planes = img2.to_bytearray()
map(len, planes)
没有报错,编译并安装成功:

PS:
编译并安装好ffpyplayer后,我们可以把刚才设置的ffmpeg和相关的编解码器的环境变量注释掉,当然如果刚才是临时设置的话我们重新打开一个终端即可,但是这时我们就需要为系统安装ffmpeg和相应的编解码器,即:
sudo apt install ffmpeg libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev \
libavutil-dev libswscale-dev libswresample-dev libpostproc-dev libsdl2-dev libsdl2-2.0-0 \
libsdl2-mixer-2.0-0 libsdl2-mixer-dev python3-dev
之所以有这种反复的设置其原因就是老版本的ffmpeg不支持最新版本的ffpyplayer的编译,但是老版本的ffmpeg及相关编解码器却可以支持编译好的ffpyplayer运行,这就是dev-level和run-level的区别。
=================================================
x86_64/aarch64架构下ffpyplayer源码编译的更多相关文章
- TensorFlow Python2.7环境下的源码编译(三)编译
一.源代码编译 这里要为仅支持 CPU 的 TensorFlow 构建一个 pip 软件包,需要调用以下命令: $ bazel build --cxxopt="-D_GLIBCXX_USE_ ...
- 分布式架构高可用架构篇_06_MySQL源码编译安装(CentOS-6.7+MySQL-5.6)
redhat: 下载:http://dev.mysql.com/downloads/mysql/ 选择5.6 source包 解压 cmake . -DCMAKE_INSTALL_PREFIX=/us ...
- linux下JUCE源码编译依赖库
JUCE 源码https://github.com/julianstorer/JUCE 想在ubuntu下编译需要提前安装以下依赖库 sudo apt-get install mesa-common- ...
- ubuntu下mysql源码编译安装
建议:cpu4核以上,内存4G以上 1. 安装环境:Ubuntu Server 14.10MySQL-5.6.23.tar.gz 2. 安装必备的工具sudo apt-get install make ...
- Mac下使用源码编译安装TensorFlow CPU版本
1.安装必要的软件 1.1.安装JDK 8 (1)JDK 8 can be downloaded from Oracle's JDK Page: http://www.oracle.com/techn ...
- Ubuntu系统下OpenDaylight源码编译安装
操作系统:Linux x64 / Ubuntu 14.04 研究领域:软件定义网络SDN (Software-defined Networking) 开发组件:OpenDaylight 声明:转载请注 ...
- Ubuntu12.04下zxing源码编译
1.下载zxing源码 git clone https://github.com/15903016222/zxing-cpp.git 2.安装依赖工具cmake sudo apt-get instal ...
- centos7下比特币源码编译安装
今天我们介绍比特币的源码安装过程,是利用编译安装的 首先安装依赖 1 yum install -y boost-devel qt-devel protobuf-devel qrencode-devel ...
- Linux环境下levelDB源码编译与安装
1.下载源码并编译 git clone https://github.com/google/leveldb.git cd leveldb //编译源码的时候需要安装cmake,并且版本需要大于3.9, ...
- 001_centos7下比特币源码编译安装
今天我们介绍比特币的源码安装过程,是利用编译安装的 首先安装依赖 yum install -y boost-devel qt-devel protobuf-devel qrencode-devel l ...
随机推荐
- Spring源码——@Component,@Service是如何被解析?
引言 在Spring中,Component.Service是在工作中经常被使用到的注解,为了加深对Spring运行机制的理解,今天我们一起来看一下Spring中对Component等注解的处理方式 C ...
- Spring扩展——Aware接口
Aware接口 在Spring中有许多的Aware接口,提供给应用开发者使用,通过Aware接口,我们可以通过set的方式拿到我们需要的bean对象(包括容器中提供的一些对象,ApplicationC ...
- kettle从入门到精通 第六十九课 ETL之kettle kettle cdc mysql,轻松实现实时增量同步
1.之前kettle cdc mysql的时候使用的方案是canal+kafka+kettle,今天我们一起学习下使用kettle的插件Debezium直接cdc mysql. 注:CDC (Chan ...
- JS常用的工具方法
记录一些经常使用的JS通用工具方法,代码来自互联网,佛性更新 空字符串校验 /** * 判断字符串是不是NULL或空串或空格组成 * @param str 被判断的字符串 * @return {boo ...
- 08-Python迭代器与生成器
迭代器 什么是迭代器 迭代是Python最强大的功能之一,是访问序列中元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器 ...
- 04-Python文件操作
打开文件 f=open("我的文件.txt","r",encoding="utf8") #打开一个文件(读模式) f.close() #关闭 ...
- 2024-06-26:用go语言,给定一个长度为n的数组nums和一个正整数k, 找到数组中所有相差绝对值恰好为k的子数组, 并返回这些子数组中元素之和的最大值。 如果找不到这样的子数组,返回0。 输
2024-06-26:用go语言,给定一个长度为n的数组nums和一个正整数k, 找到数组中所有相差绝对值恰好为k的子数组, 并返回这些子数组中元素之和的最大值. 如果找不到这样的子数组,返回0. 输 ...
- OpenTelemetry 深度定制:跨服务追踪的实战技巧
背景 在上一篇<从 Dapper 到 OpenTelemetry:分布式追踪的演进之旅>中在最后提到在做一些 Trace 的定制开发. 到现在差不多算是完成了,可以和大家分享一下. 我们的 ...
- nn.Conv2d()中dilation参数的作用
nn.Conv2d()中dilation参数的作用 下面这张图很好的描述了这个参数的作用 优点: 这样每次进行单次计算时覆盖的面积(感受域)增大,最开始时3*3 = 9 然后是5*5 = 25最后是7 ...
- Babel 7 初探
Babel有两大功能,转译和polyfill.转译就是把新的JS的语法,转化成旧的JS的语法.polyfill则是针对JS中新增的一些对象(Map, Set)和实例方法,这些对象和方法,在旧的浏览器中 ...