FFmpeg 编译支持AV1编解码器libaom-av1
2019-03-27 本文已影响2人
smallest_one
目录
- 参考
- 编译libaom-av1
- 编译FFmpeg增加libaom-av1支持
1. 参考
- [1] trac.ffmpeg.org/wiki/Encode/AV1
- [2] aomedia.googlesource.com/aom
- [3] trac.ffmpeg.org/wiki/CompilationGuide]
2. 编译libaom-av1
2.1 下载源码
git clone https://aomedia.googlesource.com/aom
2.2 编译环境要求
- CMake >=3.5
- Perl
- 对于x86平台,推荐安装yasm或者最新版本的nasm
- 构建文档需要doxygen
- 构建单元测试需要python
- 构建Emscripten需要可移植的EMSDK,编译成js用的。
2.3 编译
$ cd path/to/aom
$ mkdir mybuild
$ cmake -B./mybuild -H. -DBUILD_SHARED_LIBS=1
$ cd mybuild
$ make
-
cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
,-B是指定的编译输出的目录CMAKE_CURRENT_BINARY_DIR
,-H是指定源码的目录CMAKE_CURRENT_SOURCE_DIR
。 -
-DBUILD_SHARED_LIBS=1
是指定生成动态库,默认是生成静态库,目前这个选项只在非windows平台可用。 - 生成的libaom.so和libaom.so.0文件就是我们需要的,它们是软链接的关系
libaom.so -> libaom.so.0
。 - 头文件在项目的aom文件夹,提取其中的.h文件。
3. 编译FFmpeg增加libaom-av1支持
3.1 编写aom.pc
参考 FFmpeg 编译支持AV1编解码器dav1d#编写dav1d.pc
3.2 编译FFmpeg
./configure --prefix=../buildout --enable-shared --disable-static --enable-libaom
# 编译后检查一下config.h中AOM是否配置成功了,如`#define CONFIG_LIBAOM 1`。
make
make install
- 生成的可执行文件在--prefix指定的文件夹。
3.3 使用libaom-av1编解码器
编码示例:把mp4文件中的h264格式转码为av1格式,使用libaom-av1编码器
$ffmpeg -i julin_5s.mp4 -c:v libaom-av1 -c:a copy -strict -2 julin_5s_av1.mp4
- AV1编码速度非常慢,目前还处于实验阶段。因此,需要指定
-strict experimental
(或别名-strict -2
)。 - 编码速度果真是慢,需要耐心等待。
打印的输出如下:
ffmpeg version N-93462-ge9c9514 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 20160609
configuration: --prefix=../buildout --enable-shared --disable-static --enable-libdav1d --enable-libaom
libavutil 56. 26.100 / 56. 26.100
libavcodec 58. 47.105 / 58. 47.105
libavformat 58. 26.101 / 58. 26.101
libavdevice 58. 7.100 / 58. 7.100
libavfilter 7. 48.100 / 7. 48.100
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'julin_5s.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
artist : yinyuetai.com
album : Yinyuetai
date : 05/25/16 09:57:09
encoder : Lavf57.71.100
comment : Yinyuetai-1TR1042
Duration: 00:00:05.02, start: 0.000000, bitrate: 1310 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1178 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> av1 (libaom-av1))
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[libaom-av1 @ 0x1859a80] v1.0.0
Output #0, mp4, to 'julin_5s_av1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
artist : yinyuetai.com
album : Yinyuetai
date : 05/25/16 09:57:09
comment : Yinyuetai-1TR1042
encoder : Lavf58.26.101
Stream #0:0(und): Video: av1 (libaom-av1) (av01 / 0x31307661), yuv420p, 1280x720, q=-1--1, 256 kb/s, 23.98 fps, 24k tbn, 23.98 tbc (default)
Metadata:
handler_name : VideoHandler
encoder : Lavc58.47.105 libaom-av1
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
frame= 19 fps=1.7 q=0.0 size= 0kB time=00:00:00.76 bitrate= 0.5kbits/s speed=
......
video:138kB audio:79kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.700814%
- 这是个5s的视频,转码前后的视频前后大小为804K->221K,但视频的质量要差了很多,没有配置什么具体的参数。
- 我目前在使用的VLC media player(3.0.6)和PotPlayer(1.7.17508)都已经支持AV1的视频格式,内部通过ffmpeg使用的libaom-av1解码器进行解码。
解码示例:使用libaom-av1编码器把mp4文件中的av1视频格式解码为yuv的原始数据
ffmpeg -c:v libaom-av1 -i julin_5s_av1.mp4 -f rawvideo julin_5s_av1_yuv
打印的输出如下:
ffmpeg version N-93462-ge9c9514 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 20160609
configuration: --prefix=../buildout --enable-shared --disable-static --enable-libdav1d --enable-libaom
libavutil 56. 26.100 / 56. 26.100
libavcodec 58. 47.105 / 58. 47.105
libavformat 58. 26.101 / 58. 26.101
libavdevice 58. 7.100 / 58. 7.100
libavfilter 7. 48.100 / 7. 48.100
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
[libaom-av1 @ 0x1d4ae40] v1.0.0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'julin_5s_av1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
artist : yinyuetai.com
album : Yinyuetai
date : 05/25/16 09:57:09
encoder : Lavf58.26.101
comment : Yinyuetai-1TR1042
Duration: 00:00:05.02, start: 0.000000, bitrate: 359 kb/s
Stream #0:0(und): Video: av1 (Main) (av01 / 0x31307661), yuv420p(tv, progressive), 1280x720, 225 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 24k tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
File 'julin_5s_av1_yuv' already exists. Overwrite ? [y/N] y
[libaom-av1 @ 0x1d5b180] v1.0.0
Stream mapping:
Stream #0:0 -> #0:0 (av1 (libaom-av1) -> rawvideo (native))
Press [q] to stop, [?] for help
Output #0, rawvideo, to 'julin_5s_av1_yuv':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
artist : yinyuetai.com
album : Yinyuetai
date : 05/25/16 09:57:09
comment : Yinyuetai-1TR1042
encoder : Lavf58.26.101
Stream #0:0(und): Video: rawvideo (I420 / 0x30323449), yuv420p, 1280x720, q=2-31, 265155 kb/s, 23.98 fps, 23.98 tbn, 23.98 tbc (default)
Metadata:
handler_name : VideoHandler
encoder : Lavc58.47.105 rawvideo
frame= 25 fps=0.0 q=-0.0 size= 33536kB time=00:00:01.04 bitrate=263474.4kbits/s spe
frame= 49 fps= 49 q=-0.0 size= 66048kB time=00:00:02.04 bitrate=264746.8kbits/s spe
frame= 78 fps= 52 q=-0.0 size= 105216kB time=00:00:03.25 bitrate=264944.1kbits/s spe
frame= 109 fps= 54 q=-0.0 size= 146944kB time=00:00:04.54 bitrate=264784.5kbits/s spe
frame= 120 fps= 56 q=-0.0 Lsize= 162000kB time=00:00:05.00 bitrate=265155.6kbits/s speed=2.33x
video:162000kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%