三.ffmpeg 集成av1

这篇具有很好参考价值的文章主要介绍了三.ffmpeg 集成av1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

copy from zhujiamin
一、介绍

FFmpeg4.2支持AV1、AVS2等视频编码格式,但本身并不包含解码器,需要自己集成。集成的编解码器要避开GPL开源协议(–enable-gpl),因此不能用x264、AVS2等编解码器

我在研究FFmpeg升级时,寻找能提升多媒体系统表现力的新特性,发现FFmpeg支持的基于BSD协议的dav1d解码器比较有价值,能大幅度提高AV1软解码性能,没有代码开源的风险,并且能持续迭代更新

三.ffmpeg 集成av1
AV1是由AOM(Alliance for Open Media,开放媒体联盟)制定的一个开源、免版权费的视频编码格式,目标是解决H265昂贵的专利费用和复杂的专利授权问题并成为新一代领先的免版权费的编码标准。AV1是google制定的VP9标准的继任者,也是H265强有力的竞争者

目前youtube、nextflix,以及国内的爱奇艺都在推广AV1编码视频

google从Android Q开始提供了gav1软解码器,最高支持1080P,播放高码率视频容易卡顿

FFmpeg支持libaom和libdav1d两种解码器
–enable-libaom enable AV1 video encoding/decoding via libaom [no]
–enable-libdav1d enable AV1 decoding via libdav1d [no]

三.ffmpeg 集成av1
dav1d由VideoLAN,VLC和FFmpeg联合开发,项目由AOM联盟赞助,和libaom相比,dav1d性能普遍提升100%,最高提升400%

二、编译

1.下载源码:git clone https://code.videolan.org/videolan/dav1d.git

2.dav1d用meson和ninja编译,不是常见的Makefile。安装meson(版本>=0.47)、Ninja、nasm (版本>=2.13.02) 安装参考mesonbuild.com/Quick-guide

由于公司的研发编译环境没有安装meson,我是在ubuntu虚拟机上编译的

3.交叉编译:FFmpeg配置–enable-libdav1d后,libavcodec.so会依赖libdav1d.so,meson默认用linux系统环境编译,而libavcodec.so是用ndk环境编译,会有各种依赖的系统库定义报错,因此dav1d也要用相同ndk编译,需要编写交叉编译文件,以编译arm64库为例:
三.ffmpeg 集成av1
4.执行编译命令,生成libdav1d.so

meson build --buildtype release --cross-file=cross_file_64.txt && ninja -C build
三.ffmpeg 集成av1
编译后的源码目录如图,cross_file_32.txt、cross_file_64.txt是自己写的交叉编译文件,build目录是编译生成的,libdav1d.so在build/src目录下:
三.ffmpeg 集成av1
三.ffmpeg 集成av1
由于dav1d的meson.build脚本有版本信息,因此会生成带版本号的so

三.ffmpeg 集成av1
三.ffmpeg 集成av1

三、FFmpeg集成dav1d

1.放置libdav1d.so和头文件

在FFmpeg目录创建extend/dav1d/目录存放so和头文件,头文件在dav1d源码include目录中
三.ffmpeg 集成av1
三.ffmpeg 集成av1

2.FFmpeg编译集成dav1d

FFmpeg默认通过.pc文件获取扩展项的头文件和库路径,要求编译环境安装了pkg-config,不便于共同维护

研究configure文件后,注释掉libdav1d的pkg_config检查,并通过–extra-cflags、–extra-ldflags、–extra-libs配置dav1d的头文件、库路径和库名称
三.ffmpeg 集成av1
三.ffmpeg 集成av1
三.ffmpeg 集成av1
用readelf -d libavcodec.so查看它依赖了libdav1d.so.4这个库,于是将其cp到prebuilt目录,预编译到system和vendor,并在代码中添加OMX.ffmpeg.av1.decoder
三.ffmpeg 集成av1三.ffmpeg 集成av1
三.ffmpeg 集成av1
三.ffmpeg 集成av1
三.ffmpeg 集成av1
FFmpeg集成dav1d,在动态库依赖层面的结构如图:
三.ffmpeg 集成av1
由于dav1d解码库是集成在FFmpeg中的,只要掌握FFmpeg编译、dav1d编译、FFmpeg集成dav1d的方法即可,Android大版本升级时没有额外的适配移植工作量

3.更新FFmpeg解码API

测试dav1d解码时发现有丢帧现象,每秒最高解码15帧,打印log提示废弃的解码函数会丢帧

01-01 06:44:29.139 I 1407 12739 FFMPEG : [libdav1d @ 0xe5f10c00] The deprecated avcodec_decode_* API cannot return all the frames for this decoder. Some frames will be dropped. Update your code to the new decoding API to fix this.

需要用avcodec_send_packet和avcodec_receive_frame替代avcodec_decode_video2

看源码时,发现avcodec_decode_video2源码内部也调用了avcodec_send_packet和avcodec_receive_frame

(1)avcodec_decode_video2一个函数完成了解码的输入和输出,对于capabilities支持CODEC_CAP_DELAY的解码器,可能只输入并延迟输出,最后要填空buffer获取剩余output buffer,否则丢失最后几帧;

对于不支持CODEC_CAP_DELAY的解码器,它会阻塞式地完成一帧解码

(2)avcodec_send_packet和avcodec_receive_frame从逻辑上类似于Android MediaCodec的queueInputBuffer和dequeueOutputBuffer,分别给解码器输入和输出,形式上更加灵活,最后也要送空buffer;

实测发现大部分情况下解码工作发生在avcodec_send_packet输入buffer时,少部分情况在avcodec_receive_frame输出buffer时

更新解码API:

avcodec_decode_video2和avcodec_send_packet、avcodec_receive_frame的返回值和状态判断方式不同,且SoftFFmpegVideo继承Android OMX组件,很多状态判断工作是结合OMX的状态信息完成的,因此修改解码逻辑必须加log调试观察,充分理解解码框架的流程

SoftFFmpegVideo的主体解码流程如图,inQueue和outQueue是OMX的解码器输入输出队列
三.ffmpeg 集成av1
四、dav1d解码接口简介

FFmpeg的dav1d接口文件为libdav1d.c,解码流程如图

三.ffmpeg 集成av1
作为开源库的调用者,我们通常关注解码参数设置,先看一下参数设置内容Dav1dSettings,和默认设置参数

三.ffmpeg 集成av1
三.ffmpeg 集成av1
其中影响解码性能(速度、负载)的主要是tile线程数、帧线程数,看一下在FFmpeg中是如何赋值的

(AV1标准中tile的定义与HEVC标准中tile的定义类似:是一帧图像中能被独立解码和编码的矩形区域,尽管环路滤波时可以跨越tile的边界)

(1)定义线程数threads
三.ffmpeg 集成av1

c→thread_count:是AVCodecContext的thread_count对象,调用avcodec_open2打开编解码器时传入FFmpeg

在OPPO的SoftFFmpegVideo中,thread_count的值是0,因此会通过av_cpu_count获取手机CPU核数,再乘以1.5赋值给threads

三.ffmpeg 集成av1
将thread_count设置为0传给FFmpeg时,FFmpeg都会调用av_cpu_count设置为手机CPU核数。我在8核手机调试过thread_count,设置0或8解码速度是一样的

(2)n_tile_threads和n_frame_threads的计算
三.ffmpeg 集成av1
还有一个比较有意思的参数是apply_grain,负责获取和叠加film grain(胶片颗粒)

film grain在电视和电影内容中广泛存在,它经常是创作内容的一部分,在编码过程中需要保留下来,因为film grain的随机性,导致很难用传统的压缩算法进行压缩,AV1对film grain做了专门处理

film grain在去噪音过程中会从视频中去除掉,grain参数会通过噪音视频序列和去噪视频序列的差异中获得,这些参数会和压缩视频流一起传输到解码端,解码后,film grain会被叠加到重建视。模型和整体框架如图所示
三.ffmpeg 集成av1

参考资料:http://lazybing.github.io/blog/2018/10/17/av1-film-grain-synthesis/文章来源地址https://www.toymoban.com/news/detail-423291.html

到了这里,关于三.ffmpeg 集成av1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编译FFmpeg4.3.1 、x264并移植到Android

    1、前言 FFmpeg 既是一款音视频编解码工具,同时也是一组音视频编解码开发套件。 2、准备工作 系统:Linux NDK:android-ndk-r21b-linux-x86_64.zip FFmpeg:ffmpeg-snapshot.tar.bz2 x264:x264 3、下载NDK 在linux环境中,使用命令如下:   4、下载FFmpeg 5、下载x264 6、开始编译x264 build_x264_android-v7a

    2024年01月19日
    浏览(30)
  • ffmpeg中的avs解码器综述

    最近拿了一个avs的视频流,用硬件可以解码,但是ffmpeg自带的却无法解码。 所以研究了一下,首先看ffmpeg的avs解码器: 可以看到avs有两个,第一个是avs 第二个是cavs. 我们先用avs来解码,解码的视频是通过【 avs编码器 】编码的: 结果发现有问题,尺寸本来是640 360,结果被强

    2024年02月08日
    浏览(39)
  • ffmpeg 中 av_log 是怎样工作的?

    ---------------------------------------- author: hjjdebug date:   2023年 07月 27日 星期四 14:56:38 CST descriptor: ffmpeg 中 av_log 是怎样工作的? ---------------------------------------- av_log 功能其实只是添加了颜色,LOG级别,及log上下文名称,没有添加时间,函数名称,行号等信息. 就这一点就引起了血雨腥风的

    2024年02月15日
    浏览(23)
  • FFmpeg5.0源码阅读—— av_read_frame

       摘要 :本文主要描述了FFmpeg中用于打开编解码器接口 av_read_frame 的具体调用流程,详细描述了该接口被调用时所作的具体工作。    : ffmpeg 、 av_read_frame    读者须知 :读者需要了解FFmpeg的基本使用流程,以及一些FFmpeg的基本常识,了解FFmpegIO相关的内容,

    2024年02月16日
    浏览(24)
  • FFmpeg5.0源码阅读——av_interleaved_write_frame

       摘要 :本文主要详细描述FFmpeg中封装时写packet到媒体文件的函数 av_interleaved_write_frame 的实现。    : av_interleaved_write_frame    读者须知 :读者需要熟悉ffmpeg的基本使用。    av_interleaved_write_frame 的基本调用流程图如下。   首先就是根据输入数据是否为空

    2024年02月14日
    浏览(36)
  • ffmpeg av_parser_parse2函数分析各种码流测试程序

    ffmpeg av_parser_parse2函数分析各种码流测试程序 ---------------------------------------- author: hjjdebug date: 2023年 07月 14日 星期五 16:14:05 CST date: 曾更新过... ---------------------------------------- 测试程序见后, 可编译运行(ffmpeg v4.4) 我需要一个简单的程序,实现能跟入ffmpeg 库.了解av_parser_parse2的工

    2024年02月16日
    浏览(20)
  • 音视频从入门到精通——FFmpeg之av_image_get_buffer_size函数

    函数的作用是通过指定像素格式、图像宽、图像高来计算所需的内存大小 重点说明一个参数align:此参数是设定内存对齐的对齐数,也就是按多大的字节进行内存对齐。比如设置为1,表示按1字节对齐,那么得到的结果就是与实际的内存大小一样。再比如设置为4,表示按4字节

    2023年04月15日
    浏览(32)
  • H265、VP9、AV1视频编码器性能对比

    目前在视频编解码器中,H264 已经成为绝对的主流,被大部分设备、浏览器所支持。虽然有更先进的编码器推出,但是受限于推广速度和设备支持成本,一直未能成为主流。 今年公司的目标是持续降本增效,现在将”屠刀“指向了视频业务的存储成本。视频文件存储主要两块

    2024年02月03日
    浏览(37)
  • 中兴盒子B860AV1.1-T2版刷公版固件教程

    宽带到期后,机顶盒也没有再继续使用。放在角落里闲置的机顶盒放着落了一层灰,闲来无事想着能不能改造他们。变废为宝呢? 改造思路: 目前宽带赠送的IPTV机顶盒都是基于安卓系统开发,因为有之前移动机顶盒系统刷机经验,随想可以用公版系统去替代原来的系统。安

    2024年02月02日
    浏览(27)
  • 中兴B860AV1.1-T2_开ADB免拆刷机详细教程

     中兴B860AV1.1-T2_开ADB免拆刷机详细教程 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件,运行速度提升,多出大量的存储空间; 5、去除应用安装限制; 6、支持开机自启动、

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包