ffmpeg编译支持AVS3编解码

  1. libuavs3d
    ffmpeg的官方源码中已经支持了libuavs3d解码器的接口(libavcodec/libuavs3d.c中定义),因此如果需要编译ffmpeg支持libuavs3d解码器,只需要安装libuavs3d.so以及开启ffmpeg的编译选项即可。
    安装libuavs3d解码器
shell 复制代码
#代码仓库
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会安装的文件:

shell 复制代码
/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编码器
shell 复制代码
#代码仓库
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的多一个

shell 复制代码
/usr/lib/libuavs3e.so
/usr/include/uavs3e/uavs3e.h
/usr/include/uavs3e/com_api.h
/usr/lib/pkgconfig/uavs3e.pc

ffmpeg添加libuavs3e.c及接口支持

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

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

shell 复制代码
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="
     libtheora
     libtwolame
     libuavs3d
+    libuavs3e
     libv4l2
     libvmaf
     libvorbis
@@ -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_enc
 enabled libv4l2           && require_pkg_config libv4l2 libv4l2 libv4l2.h v4l2_ioctl
 enabled libvidstab        && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit
 enabled 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路径一致了)

shell 复制代码
cp /usr/include/uavs3e/* /usr/include/

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

c 复制代码
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          0
 
 static 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视频【编码出来的视频播放有问题,待调试解决】
相关推荐
lxkj_20243 小时前
使用线程局部存储解决ffmpeg中多实例调用下自定义日志回调问题
ffmpeg
runing_an_min7 小时前
ffmpeg视频滤镜:替换部分帧-freezeframes
ffmpeg·音视频·freezeframes
ruizhenggang7 小时前
ffmpeg本地编译不容易发现的问题 — Error:xxxxx not found!
ffmpeg
runing_an_min9 小时前
ffmpeg视频滤镜:提取缩略图-framestep
ffmpeg·音视频·framestep
韩曙亮1 天前
【FFmpeg】FFmpeg 内存结构 ③ ( AVPacket 函数简介 | av_packet_ref 函数 | av_packet_clone 函数 )
ffmpeg·音视频·avpacket·av_packet_clone·av_packet_ref·ffmpeg内存结构
oushaojun21 天前
ubuntu中使用ffmpeg和nginx推流rtmp视频
nginx·ubuntu·ffmpeg·rtmp
莫固执,朋友1 天前
网络抓包工具tcpdump 在海思平台上的编译使用
网络·ffmpeg·音视频·tcpdump
lxkj_20241 天前
修改ffmpeg实现https-flv内容加密
网络协议·https·ffmpeg
cuijiecheng20181 天前
音视频入门基础:MPEG2-TS专题(6)——FFmpeg源码中,获取MPEG2-TS传输流每个transport packet长度的实现
ffmpeg·音视频
VisionX Lab1 天前
数据脱敏工具:基于 FFmpeg 的视频批量裁剪
python·ffmpeg·音视频