ffmpeg编译支持AVS3编解码

2023-12-07 06:44

本文主要是介绍ffmpeg编译支持AVS3编解码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. libuavs3d
    ffmpeg的官方源码中已经支持了libuavs3d解码器的接口(libavcodec/libuavs3d.c中定义),因此如果需要编译ffmpeg支持libuavs3d解码器,只需要安装libuavs3d.so以及开启ffmpeg的编译选项即可。
    安装libuavs3d解码器
#代码仓库
git clone https://github.com/uavs3/uavs3d.git
#可以参考其仓库说明安装,这里使用linux平台
apt install gawk cmake #安装依赖
cd uavs3d
mkdir build/linux
cd build/linux
cmake -DCOMPILE_10BIT=1 -DBUILD_SHARED_LIBS=1 --install-prefix=/usr ../..
make && make install

libuavs3d会安装的文件:

/usr/lib/libuavs3d.so
/usr/include/uavs3d.h
/usr/lib/pkgconfig/uavs3d.pc

如果编译得时候没有-DBUILD_SHARED_LIBS,则uavs3d不会生成libuavs3d.so,静态链接生成uavs3dec可执行文件,这样ffmpeg就不能使用libuavs3d库了。

  1. libuavs3e
    ffmpeg官方源码中还未添加对libuavs3e库的支持,需要做一点修改。
    安装libuavs3e编码器
#代码仓库
git clone https://github.com/uavs3/uavs3d.git
apt install gawk cmake #安装依赖
cd uavs3e
mkdir build/linux
cd build/linux
cmake -DCOMPILE_10BIT=1 -DBUILD_SHARED_LIBS=1 --install-prefix=/usr ../..
make && make install

uavs3e安装的文件比uavs3d的多一个

/usr/lib/libuavs3e.so
/usr/include/uavs3e/uavs3e.h
/usr/include/uavs3e/com_api.h
/usr/lib/pkgconfig/uavs3e.pc

ffmpeg添加libuavs3e.c及接口支持

#libavs3e.c开源代码仓库
git clone https://github.com/uavs3/uavs3e_ffmpeg_interface.git

ffmpeg中configure修改以及allcodecs.c修改:

diff --git a/configure b/configure
index 838e627084..e95345aaf2 100755
--- a/configure
+++ b/configure
@@ -279,6 +279,7 @@ External library support:if openssl, gnutls or mbedtls is not used [no]--enable-libtwolame      enable MP2 encoding via libtwolame [no]--enable-libuavs3d       enable AVS3 decoding via libuavs3d [no]
+  --enable-libuavs3e       enable AVS3 encoding via libuavs3e [no]--enable-libv4l2         enable libv4l2/v4l-utils [no]--enable-libvidstab      enable video stabilization using vid.stab [no]--enable-libvmaf         enable vmaf filter via libvmaf [no]
@@ -1898,6 +1899,7 @@ EXTERNAL_LIBRARY_LIST="libtheoralibtwolamelibuavs3d
+    libuavs3elibv4l2libvmaflibvorbis
@@ -3443,6 +3445,7 @@ libsvtav1_encoder_deps="libsvtav1"libtheora_encoder_deps="libtheora"libtwolame_encoder_deps="libtwolame"libuavs3d_decoder_deps="libuavs3d"
+libuavs3e_encoder_deps="libuavs3e"libvo_amrwbenc_encoder_deps="libvo_amrwbenc"libvorbis_decoder_deps="libvorbis"libvorbis_encoder_deps="libvorbis libvorbisenc"
@@ -6836,6 +6839,7 @@ enabled libtwolame        && require libtwolame twolame.h twolame_init -ltwolame{ check_lib libtwolame twolame.h twolame_encode_buffer_float32_interleaved -ltwolame ||die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; }enabled libuavs3d         && require_pkg_config libuavs3d "uavs3d >= 1.1.41" uavs3d.h uavs3d_decode
+enabled libuavs3e         && require_pkg_config libuavs3e "uavs3e >= 1.1.41" uavs3e.h uavs3e_encenabled libv4l2           && require_pkg_config libv4l2 libv4l2 libv4l2.h v4l2_ioctlenabled libvidstab        && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInitenabled libvmaf           && require_pkg_config libvmaf "libvmaf >= 2.0.0" libvmaf.h vmaf_init
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index b0f004e15c..9a3b95299b 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -800,6 +800,7 @@ extern const FFCodec ff_libsvtav1_encoder;extern const FFCodec ff_libtheora_encoder;extern const FFCodec ff_libtwolame_encoder;extern const FFCodec ff_libuavs3d_decoder;
+extern const FFCodec ff_libuavs3e_encoder;extern const FFCodec ff_libvo_amrwbenc_encoder;extern const FFCodec ff_libvorbis_encoder;extern const FFCodec ff_libvorbis_decoder;

编译时会报错,pkg-config找不到uavs3e,可以查看ffbuild/config.log中的具体错误,我这里是因为uavse.h头文件和uavs3e.pc中路径不匹配,直接把/usr/include/uavs3e/路径下的两个头文件拷贝到/usr/include/下面(和uavs3d.h路径一致了)

cp /usr/include/uavs3e/* /usr/include/

libuavs3e.c修改,为了适配较新的ffmpeg代码【编码还有问题】

diff --git a/libuavs3e.c b/libuavs3e.c
index a82dde7..91333d0 100644
--- a/libuavs3e.c
+++ b/libuavs3e.c
@@ -15,10 +15,16 @@#include "libswscale/swscale_internal.h"//#include "mxnet_api.h"+#include "encode.h"
+#include "avcodec.h"
+#include "avs3.h"
+#include "codec_internal.h"
+#include "uavs3e/uavs3e.h" #define MAX_BUMP_FRM_CNT           (8 <<1)#define MAX_BS_BUF                 (32*1024*1024)
+#define FF_API_CODED_FRAME          0static const int color_primaries_tab[10] = {AVCOL_PRI_RESERVED0   , // 0
@@ -167,7 +173,7 @@ static int uavs3e_encode_frame(AVCodecContext *avctx, AVPacket *pkt,int ret;-	if (ff_alloc_packet2(avctx, pkt, MAX_BS_BUF, 0) < 0) {
+	if (ff_alloc_packet(avctx, pkt, MAX_BS_BUF) < 0) {return -1;}@@ -253,26 +259,21 @@ static const AVClass uavs3e_class = {.version    = LIBAVUTIL_VERSION_INT,};-static const AVCodecDefault uavs3e_defaults[] = {
-    { "b",                "0" },
-    { NULL },
-};
-
-AVCodec ff_libuavs3e_encoder = {
-    .name           = "libuavs3e",
-    .long_name      = NULL_IF_CONFIG_SMALL("libuavs3e Chinese AVS3 (Audio Video Standard)"),
-    .type           = AVMEDIA_TYPE_VIDEO,
-    .id             = AV_CODEC_ID_AVS3,
+const FFCodec ff_libuavs3e_encoder = {
+    .p.name           = "libuavs3e",
+    CODEC_LONG_NAME("libuavs3e Chinese AVS3 (Audio Video Standard)"),
+    .p.type           = AVMEDIA_TYPE_VIDEO,
+    .p.id             = AV_CODEC_ID_AVS3,.priv_data_size = sizeof(UAVS3EContext),.init           = uavs3e_init,
-    .encode2        = uavs3e_encode_frame,
+    FF_CODEC_ENCODE_CB(uavs3e_encode_frame),.close          = uavs3e_close,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
+    .p.capabilities   = AV_CODEC_CAP_DELAY,
+    .caps_internal  = FF_CODEC_CAP_AUTO_THREADS,#if (BIT_DEPTH == 10)
-    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P10LE, AV_PIX_FMT_NONE },
+    .p.pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P10LE, AV_PIX_FMT_NONE },#else
-    .pix_fmts		= (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
+    .p.pix_fmts		= (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },#endif
-    .priv_class     = &uavs3e_class,
-    .defaults       = uavs3e_defaults,
+    .p.priv_class     = &uavs3e_class,} ;

ffmpeg的配置选项
./configure --enable-libuavs3d --enable-libuavs3e --enable-shared --disable-stripping --enable-ffplay --prefix=/usr

  1. 效果
  • 解码播放avs3视频
    在这里插入图片描述
  • 编码yuv至avs3视频【编码出来的视频播放有问题,待调试解决】
    在这里插入图片描述

这篇关于ffmpeg编译支持AVS3编解码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/464876

相关文章

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

ffmpeg面向对象-待定

1.常用对象 rtsp拉流第一步都是avformat_open_input,其入参可以看下怎么用: AVFormatContext *fmt_ctx = NULL;result = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL); 其中fmt_ctx 如何分配内存的?如下 int avformat_open_input(

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Golang test编译使用

创建文件my_test.go package testsimport "testing"func TestMy(t *testing.T) {t.Log("TestMy")} 通常用法: $ go test -v -run TestMy my_test.go=== RUN TestMyTestMy: my_test.go:6: TestMy--- PASS: TestMy (0.

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(