FFmpeg 集成 x265 编译及解码

news2024/11/30 13:47:49

x265 是一个免费的软件库和应用程序,用于将视频流编码为 H.265/MPEG-H HEVC 压缩格式,并在 GNU GPL 条款下发布。

FFmpeg 为了支持 H.265 编、解码可以集成 x265 编译,在编译 FFmpeg 之前需要先编译 x265,但并不是所有的版本都能直接使用,比如笔者同时编译 Android、Window 和 Linux 三个平台时,使用 Android NDK r21e 会遇到很多报错,符号缺失,无法编译 .S 文件都是可能遇到的问题。

一、x265 编译

下面的编译统一都使用 ubuntu 18.04 版本进行。编译目录结构如下:

在这里插入图片描述

其中 i686 & x86_64 和平台相关,这里是 window 平台示例。 Android 上 arm 平台是 armeabi-v7a & arm64-v8a。x265 目录内放置 x265 的源码。

编译的时候 cd x265 工程 & ./build_x265.sh 即可。然后同级的 build 目录会输出相应的编译产物。

1. 交叉编译 Android 使用的 x265

前置条件使用 android-ndk-r21e linux 版本。编译脚本内容如下:

build_x265.sh

rm -rf $(pwd)/x265/build/android
rm -rf $(pwd)/build

mkdir x265/build/android
cp -rf build_script/* x265/build/android

export NDK_ROOT=/home/snake/Android/android-ndk-r21e # 换成自己的实际 NDK 路径
export ANDROID_API_VERSION=21
export NUMBER_OF_CORES=4
export OUTPUT_PREFIX=$(pwd)/build

pushd x265/build/android/armeabi-v7a
bash build.sh
popd

pushd x265/build/android/arm64-v8a
bash build.sh
popd

build_script/armeabi-v7a/build.sh

cmake ../../../source \
  -DCMAKE_SYSTEM_NAME=Android \
  -DCMAKE_SYSTEM_VERSION=${ANDROID_API_VERSION} \
  -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a \
  -DCMAKE_ANDROID_NDK=${NDK_ROOT} \
  -DCMAKE_ANDROID_STL_TYPE=c++_static \
  -DNEON_ANDROID=1

sed -i 's/-lpthread/-pthread/g' CMakeFiles/cli.dir/link.txt
sed -i 's/-lpthread/-pthread/g' CMakeFiles/x265-shared.dir/link.txt
sed -i 's/-lpthread/-pthread/g' CMakeFiles/x265-static.dir/link.txt

make -j${NUMBER_OF_CORES}
make DESTDIR=${OUTPUT_PREFIX}/armeabi-v7a install

build_script/arm64-v8a/build.sh

cmake ../../../source \
  -DCMAKE_SYSTEM_NAME=Android \
  -DCMAKE_SYSTEM_VERSION=${ANDROID_API_VERSION} \
  -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
  -DCMAKE_ANDROID_NDK=${NDK_ROOT} \
  -DCMAKE_ANDROID_STL_TYPE=c++_static \
  -DNEON_ANDROID=1

sed -i 's/-lpthread/-pthread/g' CMakeFiles/cli.dir/link.txt
sed -i 's/-lpthread/-pthread/g' CMakeFiles/x265-shared.dir/link.txt
sed -i 's/-lpthread/-pthread/g' CMakeFiles/x265-static.dir/link.txt

make -j${NUMBER_OF_CORES}
make DESTDIR=${OUTPUT_PREFIX}/arm64-v8a install

同时为了支持 NEON,需要修改 x265 的源码可参考:https://github.com/kimsan0622/libx265-android/commit/cda6b5eac8f293b7f8264e98b722fd4fb252b072

在这里插入图片描述在这里插入图片描述

首先编译 x265 Release_3.5 版本,armeabi-v7a 编译的时候会出现符号缺失的问题(ftello、fseeko…):

在这里插入图片描述

fseeko 和 ftello

  1. fseeko
int fseeko(FILE *stream, off_t offset, int whence);
  1. ftell
off_t ftello(FILE *stream);

fseeko 和 ftello 两个函数的存在,就是为了解决 fseek 和 ftell 这两个函数中文件 2G 大小限制的历史遗留问题。NDK r21e 中无法导出(ANDROID_API_VERSION=21)armeabi-v7a 内的 fseeko、ftello 符号。

arm64-v8a 编译则会报 .S 文件里的各种符号错误,因此 r21e ndk 是无法正常编译 x265 Release_3.5 版本的。

在这里插入图片描述

经过实验,2.6 版本的 x265 是可以正常编译的! 下面的 Window & Linux 版本编译同样使用 x265 2.6 版本。

2. 交叉编译 Windows 使用的 x265

编译环境搭建可以使用 mingw-w64-build:https://github.com/Zeranoe/mingw-w64-build

build_x265.sh

rm -rf $(pwd)/x265/build/windows
rm -rf $(pwd)/build

mkdir $(pwd)/x265/build/windows
cp -rf build_script/* x265/build/windows


export TOOLCHAIN_ROOT=/home/snake/.zeranoe/mingw-w64 # 换成自己的实际 mingw-w64 路径
export NUMBER_OF_CORES=4
export OUTPUT_PREFIX=$(pwd)/build

pushd x265/build/windows/i686
bash build.sh
popd

pushd x265/build/windows/x86_64
bash build.sh
popd

build_script/i686/build.sh

cmake ../../../source \
  -DCMAKE_SYSTEM_NAME=Windows \
  -DCMAKE_C_COMPILER=${TOOLCHAIN_ROOT}/i686/bin/i686-w64-mingw32-gcc \
  -DCMAKE_CXX_COMPILER=${TOOLCHAIN_ROOT}/i686/bin/i686-w64-mingw32-g++ \
  -DCMAKE_RANLIB=${TOOLCHAIN_ROOT}/i686/bin/i686-w64-mingw32-ranlib \
  -DCMAKE_STRIP=${TOOLCHAIN_ROOT}/i686/bin/i686-w64-mingw32-strip \
  -DCMAKE_AR=${TOOLCHAIN_ROOT}/i686/bin/i686-w64-mingw32-ar \
  -DCMAKE_LD=${TOOLCHAIN_ROOT}/i686/bin/i686-w64-mingw32-ld \
  -DCMAKE_NM=${TOOLCHAIN_ROOT}/i686/bin/i686-w64-mingw32-nm \
  -DCMAKE_RC_COMPILER=${TOOLCHAIN_ROOT}/i686/bin/i686-w64-mingw32-windres

make -j${NUMBER_OF_CORES}
make DESTDIR=${OUTPUT_PREFIX}/i686 install

build_script/x86_64/build.sh

cmake ../../../source \
  -DCMAKE_SYSTEM_NAME=Windows \
  -DCMAKE_C_COMPILER=${TOOLCHAIN_ROOT}/x86_64/bin/x86_64-w64-mingw32-gcc \
  -DCMAKE_CXX_COMPILER=${TOOLCHAIN_ROOT}/x86_64/bin/x86_64-w64-mingw32-g++ \
  -DCMAKE_RANLIB=${TOOLCHAIN_ROOT}/x86_64/bin/x86_64-w64-mingw32-ranlib \
  -DCMAKE_STRIP=${TOOLCHAIN_ROOT}/x86_64/bin/x86_64-w64-mingw32-strip \
  -DCMAKE_AR=${TOOLCHAIN_ROOT}/x86_64/bin/x86_64-w64-mingw32-ar \
  -DCMAKE_LD=${TOOLCHAIN_ROOT}/x86_64/bin/x86_64-w64-mingw32-ld \
  -DCMAKE_NM=${TOOLCHAIN_ROOT}/x86_64/bin/x86_64-w64-mingw32-nm \
  -DCMAKE_RC_COMPILER=${TOOLCHAIN_ROOT}/x86_64/bin/x86_64-w64-mingw32-windres

make -j${NUMBER_OF_CORES}
make DESTDIR=${OUTPUT_PREFIX}/x86_64 install

3. 编译 Linux 使用的 x265

此处只编译 x86_64 版本。

build_x265.sh

rm -rf $(pwd)/x265/build/linux-out
rm -rf $(pwd)/build

mkdir $(pwd)/x265/build/linux-out
cp -rf build_script/* x265/build/linux-out


export TOOLCHAIN_ROOT=/usr/bin
export NUMBER_OF_CORES=4
export OUTPUT_PREFIX=$(pwd)/build

pushd x265/build/linux-out/x86_64
bash build.sh
popd

build_script/x86_64/build.sh

cmake ../../../source \
  -DCMAKE_SYSTEM_NAME=Linux \
  -DCMAKE_C_COMPILER=${TOOLCHAIN_ROOT}/x86_64-linux-gnu-gcc \
  -DCMAKE_CXX_COMPILER=${TOOLCHAIN_ROOT}/x86_64-linux-gnu-g++ \
  -DCMAKE_RANLIB=${TOOLCHAIN_ROOT}/x86_64-linux-gnu-ranlib \
  -DCMAKE_STRIP=${TOOLCHAIN_ROOT}/x86_64-linux-gnu-strip \
  -DCMAKE_AR=${TOOLCHAIN_ROOT}/x86_64-linux-gnu-ar \
  -DCMAKE_LD=${TOOLCHAIN_ROOT}/x86_64-linux-gnu-ld \
  -DCMAKE_NM=${TOOLCHAIN_ROOT}/x86_64-linux-gnu-gcc-nm

make -j${NUMBER_OF_CORES}
make DESTDIR=${OUTPUT_PREFIX}/x86_64 install

二、FFmpeg 集成 x265 编译

下面是 Linux FFmpeg 编译脚本修改点,增加以下差异点即可。

+ # x265的目录
+ X265_INCLUDE=${ROOT_SOURCE}/x265_git_2.6/build/x86_64/usr/local/include
+ X265_LIB=${ROOT_SOURCE}/x265_git_2.6/build/x86_64/usr/local/lib
+ X265_LIB_PKG_CONFIG=${ROOT_SOURCE}/x265_git_2.6/build/x86_64/usr/local/lib/pkgconfig

+ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$X264_LIB/pkgconfig:$FDK_AAC_LIB/pkgconfig:$X265_LIB_PKG_CONFIG
echo PKG-CONFIG-PATH=$PKG_CONFIG_PATH

./configure \
......
+ --extra-cflags="-I${X264_INCLUDE} -I${FDK_AAC_INCLUDE} -I${X265_INCLUDE} -I/usr/include" \
+ --extra-ldflags="-L${X264_LIB} -L${FDK_AAC_LIB} -L${X265_LIB}" \
......
+ --enable-libx265 \
+ --enable-encoder=libx265 \
+ --enable-muxer=hevc \
+ --enable-decoder=hevc \
+ --enable-demuxer=hevc \
+ --enable-parser=hevc \

三、H.265 解码

FFmpeg 解码 H.265 码流整体并不难,重点需要注意下,avcodec_find_decoder(…) 入参传入 AV_CODEC_ID_HEVC,然后 avcodec_send_packet 送入 packet 需要拼装 VPS + SPS + PPS + IDR 后一起送入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152274.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python一轮知识拾遗

目录 字符串格式化 %格式符 format字符串格式化 三元条件运算符 可迭代对象 break和continue语句 enumerate函数 序列封包 序列解包 部分序列解包 append.列表和extend.列表的区别 字符串格式化 通过字符串的格式化,可以输出特定格式的字符串。 (1) 格式化…

为什么要申报绿色工厂?

一、什么是绿色工厂? 绿色工厂是指实现了用地集约化、生产洁净化、废物资源化、能源低碳化的工厂。 二、为什么要申报绿色工厂? 1、政策导向,发展趋势 发展绿色工厂是顺应全球绿色发展的大趋势,符合国家政策导向。 2、荣誉称号…

[笔记]Windows Cyswin ssh配置及远程控制

文章目录前言一、配置1.1 安装 Cygwin1.2 Cygwin安装时搜索安装ssh1.3 添加cygwin安装目录至Path环境变量1.4 配置 SSHD 服务1.5 添加 sshd连接账号二、使用2.1 使用配置的连接账号进行登录2.2 连接远程主机三、常见问题3.1 ssh on cygwin和openssh 冲突 提示 Host key verific…

新增血缘关系功能,色彩地图支持标记功能,DataEase开源数据可视化分析平台v1.18.0发布

2023年1月9日,DataEase开源数据可视化分析平台正式发布v1.18.0版本。 这一版本的功能升级包括:数据集方面,定时任务采用分页的方式拉取数据,减少资源消耗;仪表板方面,新增仪表板主题,以满足不同…

二叉平衡树之二叉树搜索树【咱们一起手动模拟实现】

目录 1、什么是二叉搜索树? 2、手动模拟二叉搜索树 2.1、整体代码 2.2、查找数据 2.3、插入数据 2.4、删除数据 3、性能分析 1、什么是二叉搜索树? 二叉搜索树也叫作二叉排序树,可以使一颗空树,也可以是具有以下性质的二…

JavaScript 高级 内存管理和闭包

这里写目录标题1. JavaScript内存管理2. 垃圾回收机制算法1. 引用计数算法2. 标记清除算法3. 闭包的概念理解4. 内存泄露5. 面试题1. JavaScript内存管理 不管什么样的编程语言,在代码的执行过程中都是需要给它分配内存的,不同的是某些编程语言需要我们…

基于融合C3SE+YOLOv5s的高精度二维码检测识别分析系统

在前面的系列博文中,我们尝试了在不同款的yolov5模型中加入不同的注意力机制来提升模型的性能,都有不错的表现效果,本文主要的目的是尝试将注意力机制融合集成进入原生的C3模块中来替换原生的C3模块来对比分析模型的检测性能,首先…

【精华】JVM调优学习

JVM 介绍 1. 什么是 JVM JVM 是 Java Virtual Machine(Java 虚拟机)的缩写。一台执行 Java 程序的机器。 2 .JAVA 语言的执行原理 计算机语言: 计算机能够直接执行的指令。这种指令和系统及硬件有关。 计算机高级语言: 在遵循…

模块化建筑全球市场分析

模块化市场分析 市场摘要 全球模块化建筑市场,预计从2019年的1199亿6千万美元,到2027年的1916亿2千万,以6.4%的年复合成长率成长。人口增加,快速城市化和基础设施发展投资增加是预测期内刺激市场增长的关键因素。模块化施工是最可…

【C进阶】第十三篇——指针详解

指针的基本概念 指针类型的参数和返回值 指针与数组 指针与const限定符 指针与结构体 指向指针的指针与指针数组 指向数组的指针与多维数组 函数类型和函数指针类型 不完全类型和复杂声明 指针的基本概念 堆栈有栈顶指针,队列有头指针和尾指针,…

C++ 图进阶系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径求解算法

1. 前言 因无向、无加权图的任意顶点之间的最短路径由顶点之间的边数决定,可以直接使用原始定义的广度优先搜索算法查找。 但是,无论是有向、还是无向,只要是加权图,最短路径长度的定义是:起点到终点之间所有路径中权…

第五十讲:神州路由器IPv6隧道的配置

目前IPv6隧道技术有ISATAP隧道、6to4隧道、IPv6 over MPL隧道等。 任务一:配置ISATAP隧道 实验拓扑图如下所示 配置要求:两台路由器ROUTERA和ROUTERB通过IPv4网络连接,要求在两台路由器上分别配置ISATAP隧道,实现两端IPv6主机PC…

回收租赁商城系统功能拆解05讲-供货商

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格,后台调整最终回收价,用户同意回收后系统即刻放款,用户微信零…

2022年学习和实习总结——收获颇多(未完待续...)

0 序言 时间已经进入了2023年,今年将是属于我们这一届秋招的一年。回顾2022年的学习和实习历程,我觉得今年的收获还是不少的,甚至可以说是整个高等教育生涯中,收获最多的一年。 1 学习情况总结 1.1 读书和学习总结 原来…

【Linux】项目构建自动化工具——make和makefile

make 和 makefile1.背景2. 利用make和makefile简单编译一个源文件3.使用方法解释4.执行原理5.项目清理1.背景 (1)一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定&#xff…

智能驾驶视觉传感器测试:自动驾驶车辆如何进行传感器标定?

为什么要进行标定?一辆自动驾驶车辆会安装多个传感器,需要通过传感器标定来确定相互之间的坐标关系,从而将多个传感器数据整合为“一个传感器”。因此,准确的传感器标定是实现智能车辆多传感器感知和定位系统的先决条件。传感器标…

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《6》

我们在看Faster R-CNN源码(MXNet版本)的时候,除了下面这些我们遇到的常见的参数解析 import argparse import ast parser argparse.ArgumentParser(descriptionDemonstrate a Faster R-CNN network,formatter_classargparse.ArgumentDefaultsHelpFormatter) parse…

【操作系统系统/Golang】实验5:磁盘调度(FCFS,SSTF,SCAN与循环SCAN)

1 实验问题描述设计程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法(对应其他参考书的LOOK和C-LOOK)的工作过程。假设有trackNum个磁道号所组成的磁道访问序列,给定开始磁道号initTrackNum和磁头移动…

Java项目管理工具:Maven介绍

Maven 简介下载与环境配置Maven仓库仓库类型本地仓库配置简介 Maven ,一款跨平台的项目管理工具。它主要服务于基于 Java 平台的项目构建与依赖管理。即可以将项目的开发和管理过程抽象成一个项目对象模型(POM),开发人员只需要做一些简单的配置,Maven 便可自动完成项目构建…

HRNet源码阅读笔记(4),庞大的PoseHighResolutionNet模块-stage1

一、图和代码上一讲的图中,有stage1图例如下;关键是看pose_hrnet.py中PoseHighResolutionNet模块的forward函数相关部分如下:def forward(self, x):x self.conv1(x)x self.bn1(x)x self.relu(x)x self.conv2(x)x self.bn2(x)x self.relu(x)x self…