前言
当前文章介绍如何在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编码的视频信息如下:
cpp
[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播放效果如下:
播放效果:
播放效果:
一、如何编译FFmpeg以支持XAVS编码
1. 下载FFmpeg源代码
-
使用Subversion(SVN)从FFmpeg官方仓库下载FFmpeg源代码:
bashsvn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
2. 下载XAVS源代码
-
从SourceForge下载XAVS源代码:
bashsvn co https://xavs.svn.sourceforge.net/svnroot/xavs/trunk xavs
3. 编译XAVS代码
-
安装XAVS并将其头文件(
.h
)和静态库文件(.a
)安装到系统目录,例如/usr/local
:bashcd xavs ./configure --enable-shared make make install
4. 配置FFmpeg
-
在配置FFmpeg时添加以下选项以启用GPL许可证和XAVS支持:
bashcd ../ffmpeg ./configure --enable-gpl --enable-libxavs
-
确保FFmpeg项目也安装到与XAVS库相同的目录,本例中为
/usr/local
:bashmake make install
5. 检查XAVS支持
-
运行以下命令来验证FFmpeg是否成功构建了AVS视频编码器:
bash./ffmpeg -formats | less
-
如果看到类似
cavsvideo raw Chinese AVS video
的输出,则表示AVS视频编码器已成功集成。
二、如何使用FFmpeg转码视频到AVS
2.1 转码命令示例
-
下面的命令展示了如何使用FFmpeg将视频转码成AVS格式:
bash./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帧):
bash
./ffmpeg -i test0.avi -g 60 -b 600k -vcodec libxavs output1.cavs
-
H.264转AVS(含B帧):
bash./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
播放效果:
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
3.4 mpc-hc增加CAVS-AVS2-AVS3解码器
链接:https://gitee.com/zhengtianbo/cavs-avs2-avs3_decoder_added_to_mpc_hc
播放效果: