ffmpeg+SDL-Linux编译

19 阅读2分钟

安装nasm汇编器 apt install nasm

x264

下载:x264, the best H.264/AVC encoder - VideoLAN

# git clone https://code.videolan.org/videolan/x264.git
# ./configure --enable-static --enable-shared --enable-pic --prefix=/code/tool/x264/install
# make
# make install

x265

下载:x265, the free H.265/HEVC encoder - VideoLAN

# 依赖ccmake
# sudo apt install cmake cmake-curses-gui 
# git clone https://bitbucket.org/multicoreware/x265_git.git
# cd x265_git/build/linux
# ./make-Makefiles.bash
# 编辑安装路径后,按下c g会自动生成MakeFile
# make 
# make install

编辑安装路径,其他不变 image.png

aac

# git clone https://github.com/mstorsjo/fdk-aac.git
# cd fdk-aac
# ./autogen.sh
# ./configure --prefix=/code/tool/fdk-aac/install --enable-shared --enable-static
# make 
# make install

ffmpeg

# apt install libspeex-dev
# wget https://ffmpeg.org/releases/ffmpeg-6.1.tar.xz
# tar -xvf ffmpeg-6.1.tar.xz
# 将x264 x265 aac安装路径(install)拷贝到/code/tool/ffmpeg-6.1/下并重命名为third_lib,并导入PKG_CONFIG_PATH,自动查找对应的库
# export PKG_CONFIG_PATH=/code/tool/ffmpeg-6.1/third_lib/lib/pkgconfig/
# ./configure --prefix=/code/tool/ffmpeg-6.1/install --enable-vaapi --enable-libdrm --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-filter=delogo --enable-debug --disable-optimizations --enable-libspeex --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --extra-cflags=-I/code/tool/ffmpeg-6.1/third_lib/include/ --extra-ldflags=-L/code/tool/ffmpeg-6.1/third_lib/lib/
make -j$(nproc)
make install
  • --enable-gpl --enable-nonfree: 因使用了x264/x265(GPL)和fdk-aac(非自由),需启用此许可证声明。
  • --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-vaapi: 启用你指定的功能。
  • --enable-libdrm: 对VAAPI硬解后通过DMA-BUF进行零拷贝渲染至关重要。
  • --enable-shared: 构建共享库,便于你的Qt程序链接。
  • 排查错误,查看日志: cat ffbuild/config.log
# export LD_LIBRARY_PATH=/opt/ffmpegbin4.3.1/lib  
# ./ffmpeg

image.png

libva

# git clone https://github.com/intel/libva.git
# ./autogen.sh
# ./configure --prefix=/user_code/tool/libva/install
# make
# make install

SDL

# git clone https://github.com/libsdl-org/SDL.git
# git checkout release-2.32.8
# ./configure --prefix=/code/tool/SDL/install/ --enable-video-kmsdrm
# make 
# make install

修改libavutil/error.h

源代码:
#define av_err2str(errnum) \ av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum)
**报错:error: taking address of temporary array**
因为上面这句宏定义中存在动态申请临时变量(char[AV_ERROR_MAX_STRING_SIZE]){0}

修改后代码:
#ifdef __cplusplus
    // C++中使用av_err2str宏
    static char av_error[AV_ERROR_MAX_STRING_SIZE] = { 0 };
#define av_err2str(errnum)     av_make_error_string(av_error, AV_ERROR_MAX_STRING_SIZE, errnum)
#else
#define av_err2str(errnum) \
    av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum)
#endif
``

未完成,待续。。。