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的区别。

 

 

 

 

=================================================

 

posted on 2023-08-20 19:39  Angry_Panda  阅读(315)  评论(0)    收藏  举报

导航