这段时间都在折腾FFmpeg 视频硬解码,不得不说,在ARM下完成音视频硬解码已经很有挑战了,而我却选择的一条更难的路——基于Linux-Qt 平台,完成FFmpeg的硬解码...没办法,GUI交互框架只会个Qt,安卓不会,只能硬着头皮啃...
FFmpeg的视频解码程序在Windows下已经实现,要在Linux开发板上实现播放,所以要移植到ARM平台。由于架构的不同,在ARM下需要对源码进行交叉编译,API才能被调用。本文章就记录针对RK3399平台的FFmpeg的交叉编译。
交叉编译x264
下载x264
源码,并交叉编译
git clone https://github.com/mirror/x264.git
cd x264
mkdir build
./configure --prefix=/home/forlinx/x264/build \ #build文件夹存放库
--enable-shared \
--enable-static \
--host=arm-linux \
--cross-prefix=/home/forlinx/OK3399-linux/OK3399-linux-release/host/bin/aarch64-buildroot-linux-gnu- \ #RK3399编译器路径,非ubuntu 自带编译器
--disable-opencl \
--enable-pic \
--disable-asm
make -j4
make install
编译成功截图:
交叉编译FFmpeg
去这里,下载ffmpeg-3.4.5.tar.gz 源码,传到ubuntu中
tar xvf ffmpeg-3.4.5.tar.gz
cd ffmpeg-3.4.5/
mkdir build #新建编译文件夹
./configure \
--prefix=/home/forlinx/ffmpeg/ffmpeg-3.4.5/build \
--enable-cross-compile \
--cross-prefix=/home/forlinx/OK3399-linux/OK3399-linux-release/host/bin/aarch64-buildroot-linux-gnu- \
--enable-filters \
--disable-asm \
--enable-ffmpeg \
--enable-ffplay \
--enable-ffprobe \
--enable-doc \
--arch=aarch64 \
--target-os=linux \
--host-os=linux \
--enable-gpl \
--enable-version3 \
--enable-small \
--enable-static \
--enable-shared \
--enable-encoder=rawvideo \
--enable-encoder=mpeg2video \
--enable-encoder=mp2 \
--enable-encoder=libx264 \
--enable-libx264 \
--enable-muxer=adts \
--enable-muxer=mpegts \
--enable-muxer=mpeg2video \
--enable-muxer=rtsp \
--enable-muxer=hls \
--enable-muxer=h264 \
--enable-muxer=rtp \
--enable-muxer=avi \
--enable-muxer=flv \
--enable-muxer=mp4 \
--enable-demuxer=mpegts \
--enable-demuxer=rtsp \
--enable-demuxer=hls \
--enable-demuxer=h264 \
--enable-demuxer=rtp \
--enable-demuxer=flv \
--enable-muxer=mp4 \
--enable-demuxer=mpegts \
--enable-demuxer=rtsp \
--enable-demuxer=hls \
--enable-demuxer=h264 \
--enable-demuxer=rtp \
--enable-demuxer=flv \
--enable-demuxer=avi \
--enable-demuxer=mpegps \
--enable-demuxer=mpegtsraw \
--enable-demuxer=mpegvideo \
--enable-parser=aac \
--enable-parser=h264 \
--enable-parser=mpeg4video \
--enable-parser=mpegvideo \
--enable-parser=mpegaudio \
--enable-bsf=h264_mp4toannexb \
--enable-protocol=http \
--enable-protocol=rtp \
--enable-protocol=hls \
--enable-protocol=file \
--enable-protocol=data \
--enable-gray \
--enable-safe-bitstream-reader \
--enable-swscale \
--enable-swscale-alpha \
--enable-filter=scale \
--extra-cflags="-I/home/forlinx/x264/x264-master/build/include" \ #指定x264 include路径
--extra-ldflags="-L/home/forlinx/x264/x264-master/build/lib" #指定x264 lib 路径
make -j4
make install
编译成功截图:
至此,ffmpeg-3.4.5的交叉编译就完成了,将生成的lib
库,复制到Qt程序目录下,即可在Qt程序中调用FFmpeg相关API。
注意:由于目前我只用到H.264的摄像头,且不需要带音频,所以我只针对了x264进行了交叉编译,并未编译音频解码模块;若需要H.265和音频,则需要将对应的解码库先交叉编译,再编译FFmpeg,关于这块的方法,可以参考本博客全志A40 FFmpeg交叉编译的文章
版权属于:编码书生
本文链接:https://codess.cc/archives/454.html
所有原创文章采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
除特别注明,您可以自由的转载和修改,但请务必注明文章来源且不可用于商业目的。
9 条评论
请问编译好FFmpeg移植后rtsp取流不成功是因为没有x264吗
有很多原因,建议先用编译出来的ffplay试试, 看看能不能播,如果ffplay可以播,说明相关依赖和环境都没问题。接下来再去检查你的代码,和FFmpeg API 的调用是否存在问题。
我现在是用mpp硬解码老是崩,按照你这个,用软解码,1路视频,cpu占比60%,我们预期要用4路视频,估计到时CPU发热会非常严重。
不好意思,之前是我搞错了平台。今天我特地确认了一下,20%是我们x86 ubuntu 版本下的,RK3399 4路解码我这边也比较卡,720p下4路也几乎占满了CPU
rk3399 ffmpeg需要于mmp关联,没看见你的编译参数中有mmp选项
我没有使用瑞芯微的mmp库,所以严格意义上说,我的FFmpeg 解码应该是CPU软解实现的
软件解码速度怎么样,卡吗?
博主不知道你做的怎么样了。怎么么选择gstreamer来做视频编解码。在arm里一般qt和gstreamer厂家都是已经做好的不需要移植。
用FFmpeg + Qt 搞成功了,实现了多路视频的实时解码播放。gstreamer 厂家是编译进去了,但不适用于我的应用环境,也无法同时完成多路视频,遂自行填坑FFmpeg了