当前位置: 首页 > news >正文

编译 ffmpeg 以支持AVS格式视频解码与解码

前言

当前文章介绍如何在Linux下使用FFmpeg转码其他视频格式到AVS格式的指南,包括编译FFmpeg以支持XAVS编码和如何使用FFmpeg进行转码。

AVS (Audio Video Coding Standard) 格式是一种由中国主导制定的视频编码标准,全称为“中国数字音视频编解码技术标准”(China Digital Audio Video Coding Standard),主要应用于高清电视广播、数字电视、网络视频传输等领域。AVS 标准提高视频压缩效率,降低计算复杂度,并减少专利费用,为中国及其他国家提供一种自主可控的视频编码技术。

AVS 视频编码标准由多个子标准组成,其中 AVS1-P2(也称为 AVS+)是最广泛使用的版本之一,被设计用于高清晰度电视广播服务,并被中国数字地面电视广播标准 DTMB 采纳为推荐的视频编码格式。AVS1-P2 提供了与 H.264/AVC 相当的压缩效率,同时减少了计算复杂度,使得其在硬件实现上更为经济高效。

技术特点

  • 高效压缩:AVS 标准采用了多种先进的压缩技术,如帧内预测、帧间预测、运动补偿、熵编码等,以实现高效的视频数据压缩。
  • 低计算复杂度:与 H.264/AVC 相比,AVS 设计上更加注重计算效率,减少了复杂的运算过程,从而降低了硬件实现的成本。
  • 自主知识产权:AVS 作为一种中国主导的标准,避免了因专利费而产生的高额成本,对于国内厂商来说具有一定的成本优势。
  • 支持多种应用场景:AVS 支持多种视频分辨率和帧率,适用于从标清到高清甚至超高清的各种视频应用场合。

一个avs2编码的视频信息如下:

[davs2 info]: Manager 26c5cacfc00: Sequence Resolution: 3840x2160.
[davs2 info]: Dec[ 0] 26c5cad0780: COI of the first frame is 25.
[davs2 info]: davs2: 1.6.205 5313a0a9f7e63110.10, 2022-02-20 13:39:38
[davs2 info]: CPU Capabilities:  MMX2 SSE2Fast SSSE3 SSE4.2 AVX AVX2 FMA3 LZCNT BMI2
[davs2 info]: Manager 26c5cacfc00: using 1 thread(s): 1(frame/AEC)+0(pool/REC), 2 tasks"streams": [{"index": 0,"codec_name": "avs2","codec_long_name": "AVS2-P2/IEEE1857.4","codec_type": "video","codec_tag_string": "[0][0][0][0]","codec_tag": "0x0000","width": 3840,"height": 2160,"coded_width": 3840,"coded_height": 2160,"closed_captions": 0,"film_grain": 0,"has_b_frames": 0,"pix_fmt": "yuv420p10le","level": -99,"refs": 1,"r_frame_rate": "50/1","avg_frame_rate": "50/1","time_base": "1/1000","start_pts": 23,"start_time": "0.023000","extradata_size": 45,"disposition": {"default": 0,"dub": 0,"original": 0,"comment": 0,"lyrics": 0,"karaoke": 0,"forced": 0,"hearing_impaired": 0,"visual_impaired": 0,"clean_effects": 0,"attached_pic": 0,"timed_thumbnails": 0,"captions": 0,"descriptions": 0,"metadata": 0,"dependent": 0,"still_image": 0},"tags": {"DURATION": "00:00:06.163000000"}},{"index": 1,"codec_name": "ac3","codec_long_name": "ATSC A/52A (AC-3)","codec_type": "audio","codec_tag_string": "[0][0][0][0]","codec_tag": "0x0000","sample_fmt": "fltp","sample_rate": "48000","channels": 6,"channel_layout": "5.1(side)","bits_per_sample": 0,"r_frame_rate": "0/0","avg_frame_rate": "0/0","time_base": "1/1000","start_pts": 24,"start_time": "0.024000","bit_rate": "448000","disposition": {"default": 0,"dub": 0,"original": 0,"comment": 0,"lyrics": 0,"karaoke": 0,"forced": 0,"hearing_impaired": 0,"visual_impaired": 0,"clean_effects": 0,"attached_pic": 0,"timed_thumbnails": 0,"captions": 0,"descriptions": 0,"metadata": 0,"dependent": 0,"still_image": 0},"tags": {"DURATION": "00:00:06.008000000"}}]
}

ffplay播放效果如下:

image-20240730161658034

播放效果:

image-20240730161758597

播放效果:

image-20240730161947359

一、如何编译FFmpeg以支持XAVS编码

1. 下载FFmpeg源代码

  • 使用Subversion(SVN)从FFmpeg官方仓库下载FFmpeg源代码:

    svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
    

2. 下载XAVS源代码

  • 从SourceForge下载XAVS源代码:

    svn co https://xavs.svn.sourceforge.net/svnroot/xavs/trunk xavs
    

3. 编译XAVS代码

  • 安装XAVS并将其头文件(.h)和静态库文件(.a)安装到系统目录,例如 /usr/local

    cd xavs
    ./configure --enable-shared
    make
    make install
    

4. 配置FFmpeg

  • 在配置FFmpeg时添加以下选项以启用GPL许可证和XAVS支持:

    cd ../ffmpeg
    ./configure --enable-gpl --enable-libxavs
    
  • 确保FFmpeg项目也安装到与XAVS库相同的目录,本例中为 /usr/local

    make
    make install
    

5. 检查XAVS支持

  • 运行以下命令来验证FFmpeg是否成功构建了AVS视频编码器:

    ./ffmpeg -formats | less
    
  • 如果看到类似 cavsvideo raw Chinese AVS video 的输出,则表示AVS视频编码器已成功集成。

二、如何使用FFmpeg转码视频到AVS

2.1 转码命令示例

  • 下面的命令展示了如何使用FFmpeg将视频转码成AVS格式:

    ./ffmpeg -vframes 300 -cqp 29 -refs 2 -bf 2 -g 16 -s widthxheight -i "INPUT_FILE_NAME" -vcodec libxavs "OUTPUT_FILE_NAME"
    
  • 其中:

    • -vframes: 设置要编码的帧数。
    • -cqp: 设置常量量化参数。
    • -refs: 设置参考帧的数量。
    • -bf: 设置启用的B帧数量。
    • -g: 设置GOP(图像组)大小,即I帧之间的距离。
    • -s: 设置分辨率,格式为宽度x高度。
    • -i: 指定输入文件名。
    • -vcodec libxavs: 指定使用XAVS编码器。

2.2 常用参数

  • 一些常用的FFmpeg参数及其含义:
    • -b-vb: 设置比特率或视频比特率。
    • -s: 分辨率,格式为宽度x高度。
    • -r: 帧速率。
    • -refs: 参考帧的数量。
    • -bf: 启用的B帧数量。
    • -g: GOP大小,即I帧之间的距离。
    • -cqp: 常量量化参数,应为大于等于0的整数。
    • -me_method: 运动估计方法。
    • -qmin/-qmax: 最小/最大量化步长。
    • -vframes: 要编码的帧数。

2.3 示例

  • H.264转AVS(不含B帧):

    ./ffmpeg -i test0.avi -g 60 -b 600k -vcodec libxavs output1.cavs
    
  • H.264转AVS(含B帧):

    ./ffmpeg -i test0.avi -b 600k -bf 2 -vcodec libxavs output2.cavs
    

以上步骤和命令可以用来在Linux环境下使用FFmpeg将视频文件转码为AVS格式。

三、VLC、mpc-hc如何集成AVS?

详情看这里:https://gitee.com/zhengtianbo

3.1 ffmpeg集成AVS

链接:https://gitee.com/zhengtianbo/FFmpeg-avs2-avs3

直接下载编译好的ffmpeg:https://gitee.com/zhengtianbo/FFmpeg-avs2-avs3/releases/tag/A5.X_222

直接下载地址:https://gitee.com/zhengtianbo/FFmpeg-avs2-avs3/releases/download/A5.X_222/ffmpeg-V5.X-avs23-20220222_davs2-10bit-Win10-X64-EXE.zip

播放效果:

image-20240730162010741

3.2 LAVFilters增加CAVS-AVS2-AVS3解码器

链接:https://gitee.com/zhengtianbo/LAVFilters-GB-CAVS-AVS2-AVS3-decoder

直接下载:https://gitee.com/zhengtianbo/LAVFilters-GB-CAVS-AVS2-AVS3-decoder/releases

3.3 VLC 4.0播AVS3_AVS2_CAVS视频

链接:https://gitee.com/zhengtianbo/AVS123_VLC4_Player

直接下载编译好的VLC:https://gitee.com/zhengtianbo/VLC3-AVS3AVS2CAVS/releases/download/vlc3.0.11.1AVS3_10-AVS2-CAVS/vlc-3.0.11.1-dev-AVS3_10b-AVS2-CAVS(TS_MKV)Win64_EXE%E8%BF%90%E8%A1%8C%E6%96%87%E4%BB%B6-avs2fix.zip

编译好的VLC下载地址:https://gitee.com/zhengtianbo/VLC3-AVS3AVS2CAVS/releases

3.4 mpc-hc增加CAVS-AVS2-AVS3解码器

链接:https://gitee.com/zhengtianbo/cavs-avs2-avs3_decoder_added_to_mpc_hc

播放效果:

image-20240730161956615

image-20240730162110410

image-20240730162159075

相关文章:

  • [Python] 从0到1实现一个简单的数字图像识别大模型
  • H5漂流瓶社交系统源码
  • 肖扬老师好书《微权力下的项目管理(第3版)》读书笔记1
  • kubelet 探针
  • 14.1 为什么说k8s中监控更复杂了
  • 营养作用的对象是有区别的 第八篇
  • 2025年25届新文出炉:如何打造Java SpringBoot Vue个性化课程推荐系统?
  • UMI复现基础环境安装配置全流程(三)——UMI环境搭建
  • 基于javaweb的茶园茶农文化交流平台的设计与实现(源码+L文+ppt)
  • JVM 调优篇1 类的加载器与加载过程
  • 老古董Lisp实用主义入门教程(8):挠痒痒先生建网站记
  • C#通过ACE OLEDB驱动程序访问 Access和 Excel
  • 逻辑代数的基本规则
  • (Java入门)学生管理系统
  • 记忆化搜索【下】
  • 【笔记】你不知道的JS读书笔记——Promise
  • 345-反转字符串中的元音字母
  • android 一些 utils
  • AngularJS指令开发(1)——参数详解
  • EventListener原理
  • go append函数以及写入
  • JS笔记四:作用域、变量(函数)提升
  • Python实现BT种子转化为磁力链接【实战】
  • Spring框架之我见(三)——IOC、AOP
  • vue 配置sass、scss全局变量
  • 安装python包到指定虚拟环境
  • 代理模式
  • 二维平面内的碰撞检测【一】
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端路由实现-history
  • 日剧·日综资源集合(建议收藏)
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 学习JavaScript数据结构与算法 — 树
  • 一个完整Java Web项目背后的密码
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $forceUpdate()函数
  • (1)(1.11) SiK Radio v2(一)
  • (9)目标检测_SSD的原理
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)LINQ之路
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ******之网络***——物理***
  • .NET : 在VS2008中计算代码度量值
  • .NET Core 项目指定SDK版本
  • .NET DataGridView数据绑定说明