音视频高手:Clang交叉编译最新FFmpeg,FFmpeg引入AndroidStudio,音视频格式封装原理,H264编码基础编码标准

1,808 阅读20分钟

本次的音视频高手进阶将进行多个章节的分享(具体看我写多少),争取让小白都能看懂,由于篇幅原因,一次无法完全整合成一篇文章,所以分几次发表,如有需要完整PDF文档,可去我主页简介联系我拿PDF版本

FFmpeg 编译过程

环境准备

ffmpeg.org/releases/ff…

dl.google.com/android/rep…

1 准备资料

1.准备环境(linux,mac)建议不要在windows上编译,很麻烦,还需要去搭建环境,可以安装虚拟机编译。以下选择用mac系统进行编译。 2.下载ffmpeg源码,我编译的是4.2.1版本的ffmpeg

2.下载ndk,建议下载最新版的ndk 本文使用的r20c版本

2 ndk 环境配置

打开终端使用命令:vim /etc/profile 即可打开环境变量配置,到这一步应该没问题。

3 编写脚本文件

脚本的作用就是把ffmpeg源码打包成我们需要的.so文件,供我们的Android项目调用。

新建一个在ffmpeg文件夹下新建android_build.sh文件。

#!/bin/bash
export NDK=/root/ndk/android-ndk-r20
# 当前系统
export HOST_TAG=linux-x86_64
# 支持的 Android CUP 架构
# export ARCH=aarch64
# export CPU=armv8-a
export ARCH=armv7a
export CPU=armv7-a
# 支持的 Android 最低系统版本
export MIN=21
export ANDROID_NDK_PLATFORM=android-21
​
export PREFIX=$(pwd)/android/$CPUexport MIN_PLATFORM=$NDK/platforms/android-$MIN
export SYSROOT=$NDK/sysroot
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
export AS=$TOOLCHAIN/bin/arm-linux-androideabi-as
export CC=$TOOLCHAIN/bin/$ARCH-linux-androideabi$MIN-clang
echo "-----------------------------"
echo $CC
export CXX=$TOOLCHAIN/bin/$ARCH-linux-androideabi$MIN-clang++
export LD=$TOOLCHAIN/bin/arm-linux-androideabi-ld
export NM=$TOOLCHAIN/bin/arm-linux-androideabi-nm
export RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
export STRIP=$TOOLCHAIN/bin/arm-linux-androideabi-strip
​
OPTIMIZE_CFLAGS="-DANDROID -I$NDK/sysroot/usr/include/arm-linux-androideabi/"
ADDI_LDFLAGS="-Wl,-rpath-link=$MIN_PLATFORM/arch-arm/usr/lib -L$MIN_PLATFORM/arch-arm/usr/lib -nostdlib"
​
sed  -i "" "s/SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'/SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'/" configure
sed  -i "" "s/LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)\/$(LIBNAME)"'/LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)\/$(LIBNAME)"'/" configure
sed  -i "" "s/SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'/SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'/" configure
sed  -i "" "s/SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'/SLIB_INSTALL_LINKS='$(SLIBNAME)'/" configure
sed -i -e 's/#define getenv(x) NULL//*#define getenv(x) NULL*//g' config.h
# sed  -i "" "s/SHFLAGS='-shared -Wl,-soname,$(SLIBNAME)'/SHFLAGS='-shared -soname $(SLIBNAME)'/" configure
# sed  -i "" "s/-Wl//g" configure
​
./configure \
--prefix=$PREFIX \
--ar=$AR \
--as=$AS \
--cc=$CC \
--cxx=$CXX \
--nm=$NM \
--ranlib=$RANLIB \
--strip=$STRIP \
--arch=$ARCH \
--target-os=android \
--enable-cross-compile \
--disable-asm \
--enable-shared \
--disable-static \
--disable-ffprobe \
--disable-ffplay \
--disable-ffmpeg \
--disable-debug \
--disable-symver \
--disable-stripping \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS"\
--extra-ldflags="$ADDI_LDFLAGS"
​
sed  -i "" "s/#define HAVE_TRUNC 0/#define HAVE_TRUNC 1/" config.h
sed  -i "" "s/#define HAVE_TRUNCF 0/#define HAVE_TRUNCF 1/" config.h
sed  -i "" "s/#define HAVE_RINT 0/#define HAVE_RINT 1/" config.h
sed  -i "" "s/#define HAVE_LRINT 0/#define HAVE_LRINT 1/" config.h
sed  -i "" "s/#define HAVE_LRINTF 0/#define HAVE_LRINTF 1/" config.h
sed  -i "" "s/#define HAVE_ROUND 0/#define HAVE_ROUND 1/" config.h
sed  -i "" "s/#define HAVE_ROUNDF 0/#define HAVE_ROUNDF 1/" config.h
sed  -i "" "s/#define HAVE_CBRT 0/#define HAVE_CBRT 1/" config.h
sed  -i "" "s/#define HAVE_CBRTF 0/#define HAVE_CBRTF 1/" config.h
sed  -i "" "s/#define HAVE_COPYSIGN 0/#define HAVE_COPYSIGN 1/" config.h
sed  -i "" "s/#define HAVE_ERF 0/#define HAVE_ERF 1/" config.h
sed  -i "" "s/#define HAVE_HYPOT 0/#define HAVE_HYPOT 1/" config.h
sed  -i "" "s/#define HAVE_ISNAN 0/#define HAVE_ISNAN 1/" config.h
sed  -i "" "s/#define HAVE_ISFINITE 0/#define HAVE_ISFINITE 1/" config.h
sed  -i "" "s/#define HAVE_INET_ATON 0/#define HAVE_INET_ATON 1/" config.h
sed  -i "" "s/#define getenv(x) NULL/\/\/ #define getenv(x) NULL/" config.h
​

复制上面的脚本代码到我们新建的文件中,打开终端,到ffmpeg文件下使用命令就可以进行编译

sh build.sh

1. 新建项目

1. 首先新建一个工程,并且勾选 Include C++ Support 即可得到一个基于CMake的模板工程。
2. 将编译FFmpeg生成的头文件和动态库分别拷贝到app/src/main/jniLibs app/src/main/cpp/include目录下
3. 配置build.gradle

在app目录下的build.gradle文件中,android节点下的defaultConfig节点下添加

   defaultConfig {
        applicationId "com.project.ffmpegplayer"
        minSdkVersion 15
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
                abiFilters 'armeabi-v7a'
            }
        }
​
        sourceSets {
            main {
                jniLibs.srcDirs = ['src/main/jniLibs']
            }
        }
    }
4. 配置CMakeLists.txt文件
cmake_minimum_required(VERSION 3.4.1)
include_directories(include)
add_library(
             native-lib
             SHARED
             native-lib.cpp )
​
#添加libavcodec.so
add_library( avcodec
        SHARED
        IMPORTED)
set_target_properties( avcodec
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../../main/jniLibs/${ANDROID_ABI}/libavcodec.so)
​
#添加libavdevice.so
add_library(avdevice
        SHARED
        IMPORTED)
set_target_properties( avdevice
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../../main/jniLibs/${ANDROID_ABI}/libavdevice.so)
​
add_library( avfilter
        SHARED
        IMPORTED)
set_target_properties( avfilter
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../../main/jniLibs/${ANDROID_ABI}/libavfilter.so)
​
add_library( avformat
        SHARED
        IMPORTED)
set_target_properties( avformat
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../../main/jniLibs/${ANDROID_ABI}/libavformat.so)
​
add_library( avutil
        SHARED
        IMPORTED)
set_target_properties( avutil
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../../main/jniLibs/${ANDROID_ABI}/libavutil.so)
​
add_library( swresample
        SHARED
        IMPORTED)
set_target_properties( swresample
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../../main/jniLibs/${ANDROID_ABI}/libswresample.so)
​
add_library( swscale
        SHARED
        IMPORTED)
set_target_properties( swscale
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../../main/jniLibs/${ANDROID_ABI}/libswscale.so)
​
​
find_library(
              log-lib
              log )
target_link_libraries(
                       native-lib
                        avcodec
                        avdevice
                        avfilter
                        avformat
                        avutil
                        swresample
                        swscale
                       ${log-lib} )
5 编写测试代码(头文件一定要用extern 包含住)
#include <jni.h>
#include <string>
extern  "C"
{
#include "include/libavcodec/avcodec.h"
#include "include/libavformat/avformat.h"
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_project_ffmpegplayer_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    avformat_version();
    return env->NewStringUTF(avcodec_configuration());
}

视频解码基础01-封裝格式

我们播放的视频文件一般都是用一种封装格式封装起来的,封装格式的作用是什么呢?一般视频文件里不光有视频,还有音频,封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式,看有哪些视频流和哪些音频流,此时的音频流和视频流都还是压缩数据,不能直接用于显示的,这就需要解码。下面是播放一个视频文件时的流程图。

二、视频文件封装格式

封装格式(也叫容器),就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者大家把它当成一个放视频轨和音频轨的文件夹也可以。说得通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗,或者一个锅,用来盛放饭菜的容器。 下面是几种常用的 视频文件后缀类型 与其相对应的 封装格式

视频文件格式视频封装格式
.aviAVI(Audio Video Interleaved)
.wmv、.asfWMV(Windows Media Video)
.mpg、.mpeg、.vob、.dat、.3gp、.mp4MPEG(Moving Picture Experts Group)
.mkvMatroska
.rm、.rmvbReal Video
.movQuickTime File Format
.flvFlash Video

三、 音视频编码方式简介

1、视频编码方式
  • 视频编码的作用: 将视频像素数据(RGB,YUV 等)压缩成视频码流,从而降低视频的数据量。
名称推出机构推出时间目前使用领域
HEVC(H.265)MPEG/ITU-T2013研发中
H.264MPEG/ITU-T2003各个领域
MPEG4MPEG2001不温不火
MPEG2MPEG1994数字电视
VP9Google2013研发中
VP8Google2008不普及
VC-1Microsoft Inc.2006微软平台

四, 音频编码方式

音频编码的作用: 将音频采样数据(PCM 等)压缩成音频码流,从而降低音频的数据量。 常用的音频编码方式有以下几种:

名称推出机构推出时间目前使用领域
AACMPEG1997各个领域(新)
MP3MPEG1993各个领域(旧)
WMVMicrosoft Inc.1999微软平台
AC-3Dolby Inc.1992电影
1 MP3

MP3,英文全称 MPEG-1 or MPEG-2 Audio Layer III,是曾经非常流行的一种数字音频编码和有损压缩格式,它被设计来大幅降低音频数据量。它是在 1991 年,由位于德国埃尔朗根的研究组织 Fraunhofer-Gesellschaft 的一组工程师发明和标准化的。MP3 的普及,曾对音乐产业造成极大的冲击与影响。

2 AAC

AAC,英文全称 Advanced Audio Coding,是由 Fraunhofer IIS、杜比实验室、AT&TSony 等公司共同开发,在 1997 年推出的基于 MPEG-2 的音频编码技术。2000 年,MPEG-4 标准出现后,AAC 重新集成了其特性,加入了 SBR 技术和 PS 技术,为了区别于传统的 MPEG-2 AAC 又称为 MPEG-4 AACAACMP3 有更高的压缩比,同样大小的音频文件,AAC 的音质更高。

3 WMA

WMA,英文全称 Windows Media Audio,由微软公司开发的一种数字音频压缩格式,本身包括有损和无损压缩格式。

H264编码基础06 -- 编码标准之战

一个视频标准的普及其实是商业利益博弈的结果。

想预测未来,就回顾历史。先来看看H.265前任,H.264从标准化到现在普及的过程。

H.264的发展

在20年前国际上主流制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准有H.261、H.263、H.263+、H.264等,另一个是“国际标准化组织(ISO)”它制定的标准有MPEG-1、MPEG-2、MPEG-4等。

1990世界上第一个视频压缩标准是H.261(ITU),

1993MEPG-1(ISO)

1995 H.263(ITU),

1996 MPEG-2(ISO)

1998年由VCEG发起。H.264最早的名子叫H.26L.(ITU)

1999年10月H.26L第一份草案被接收。(ITU)

2001年12月经过评估发现,H.26L编码技术基本能够满足MPEG的标准需求,因此MPEG中的成员和VCEG中的成员组成了一个新的小组,叫做Joint Video Team(JVT),来推动和管理H.26L的最后标准化开发。

2003年5月H.264发布。

2005年开发出了H.264的更高级应用标准MVC (multiple view coding) 和 SVC (scalable video coding) 版本。

到2017年,H265又名(HEVC) 发布。

H.264/MPEG-4 AVC的成功的原因之一是在于是两个标准化组织的合作或者是妥协的结果。

二 一个视频标准能普及还在于他的对手

H.264和他的朋友们

1 VP8

2 AV1

3 AVS (Audio Video Coding Standard) by China.

4 VP9

2.1 WMV

WMV(Windows Media Video)是微软推出的一种流媒体格式,它是在“同门”的ASF(Advanced Stream Format)格式升级延伸来得。在同等视频质量下,WMV格式的文件可以边下载边播放,因此很适合在网上播放和传输。

WMV(Windows Media Video)不仅仅基于微软公司的自有技术开发的。从第七版(WMV1)开始,微软公司开始使用它自己非标准MPEG-4Part2。但是,由于WMV第九版已经是SMPTE的一个独立标准(421M,也称为VC-1),所以WMV的发展已经不象MPEG-4,它是一个它自己专有的编解码技术。VC-1专利共享的企业有16家(2006年4月),微软公司也是MPEG-4AVC/H.264专利共享企业中的一家。

微软的WMV还是很有影响力的。可是由于微软本身的局限性其WMV的应用发展并不顺利。

1)WMV是微软的产品它必定要依赖着Windows,Windows意味着解码部分也要有PC,起码要有PC机的主板。这就增加了机顶盒的造价,从而影响了视频广播点播的普及。

2)WMV技术的视频传输延迟较大。

WMV-HD,基于WMV9标准,是微软开发的视频压缩技术系列中的其中一个版本,一般采用.wmv为后缀的HDTV文件就是采用的WMV-HD压缩的。VC-1从压缩比上来看,H.264的压缩比率更高一些,VC-1的熵编码采用的是自适应变长编码。

2.2 VP8

VP8来自On2 的WebM, VPX(VP6,VP7,VP8,VP9),这个编码设计用于web视频。

2010年2月,Google以1.246亿美元完成了对On2 Technologies的收购。在完成收购之后的第三个月举办的GoogleI/O开发者大会上,Google开放了其拥有的VP8视频编码技术源代码并免费提供给所有开发者使用。

Google目前在Android, Chrome浏览器、YouTube网站等服务中使用VPX技术。

WebRTC(Web Real Time Communication)。在2010年5月,Google以大约6820万美元收购了VoIP软件开发商Global IP Solutions公司,并因此获得了该公司拥有的WebRTC技术。

WebRTC集成VP8, VP9。

2.3 AV1

AOMedia Video 1(AV1)是一个开放,免专利的视频编码格式,针对互联网传输视频而设计。它目前由开放媒体联盟(AOMedia)所开发,该联盟由半导体企业、视频点播供应商和网页浏览器开发商等于2015年成立。它是互联网工程任务组(IETF)视频标准化工作组NetVC的主要竞争者。其目标是取代前身VP9,并与MPEG的HEVC/H.265竞争。AV1可以与HTML5网页视频和WebRTC未来版本的WebM容器格式的音频格式opus一起使用。

Alliance for Open Media (AOMedia)

该联盟的主要目标是创建和交付下一代技术开放视频压缩格式和编解码器,这些视频压缩格式对互联网上的流媒体媒体进行了优化,包括商业和非商业内容,包括用户生成内容。联盟目前正在开发一种名为AV1的新型视频格式。来自芯片工业(AMD,ARM,英特尔,Nvidia)的联盟成员将确保硬件友好的设计。AOMedia计划在2017年底前完成其格式(AV1)的第一个版本。关于bitstream规范的工作将在2018年继续进行。AV1是专门为实时应用程序设计的,比当前生成的视频格式(h.264)的典型使用场景更能解决问题。

该联盟的设计目标是提供下一代视频格式,包括以下的特点。

0.l Interoperable and open;(可互操作和开放的)

0.l Optimized for the Internet;(针对互联网做优化)

0.l Scalable to any modern device at any bandwidth;(可拓展到任意带宽下的任何现代设备)

0.l Designed with a low computational footprint and optimized for hardware;(计算量低,针对硬件做优化)

0.l Capable of consistent, highest-quality, real-time video delivery;(能够实现持续的的高质量实时视频的传输)

0.l Flexible for both commercial and non-commercial content, including user-generated content.(适用于商业的和非商业的内容,包括用户生成的内容)

联盟包括

img

img

创始成员: Amazon, Apple, ARM, Cisco, Facebook, Google, IBM, Intel, Microsoft, Mozilla, Netflix vidia

一般会员: Argon Design, Ateme, BBC Research & Development, Bitmovin,Broadcom, Chips&Media, Hulu, Ittiam, NGCodec, Polycom, Realtek, Sigma Designs, Socionext, VeriSilicon, VideoLAN, Vidyo, Xilinx

谷歌、微软、思科、Mozilla,分别有VPx、WMV/MPEG/VC-1、Thor、Daala等编码算法,这为AV1提供了直接的技术支撑。

谷歌、火狐、微软、苹果,把控着浏览器95%的市场份额,所以AV1要能在浏览器上就实现直接播放。

AMD、Intel、NVIDIA、ARM、XILINX:PC端和移动端的硬件芯片厂商齐聚,让AV1硬件加速成为可能,从X86到GPU到ARM到FPGA。

视频内容提供商有谷歌的YouTube、Netflix、亚马逊的Prime、Ateme,又提供OTT盒子,又有世界最大的IPTV运营商,另外还有音视频应用类成员Vidy、Polycom。

HEVC/H265因为版税这次有点犯众怒,组成AOMedia就是信号,大家原来各自开发的编解码器对抗不了HEVC/H265? 那就联合起来。

当然,推动HEVC的组织在这一过程中并不会坐视不管。他们已经开始威胁要对AV1发起专利诉讼,而开放媒体联盟AOMedia将不遗余力地确保它不会发生。他们正在对AV1进行广泛的法律代码审查,以确保它不会侵犯MPEG LA、HEVC Advance和Velos Media,以及Technicolor等所拥有的任何专利。这种形式的代码复查对VP8和VP9非常成功,这两种方式都能在所有法律挑战中存活下来。MPEG LA对VP8和VP9的行动被认为可能没有任何法律基础,反而纯粹是反竞争。美国司法部正在调查MPEG LA的行动,直到他们同意放弃诉讼,并允许谷歌允许将MPEG LA的专利池授权给VP8或VP9的任何用户。虽然我们可能会看到类似的阻止AV1的尝试,但谷歌大幅扩大了专利池,支持codec的公司数量大幅增加(这要归功于开放媒体联盟),这两家公司都应该在很长一段时间内确保它们能得到处理。

2.6 AVS

AVS是中国具备自主知识产权的第二代信源编码标准,是《信息技术先进音视频编码》系列标准的简称,其包括系统、视频、音频、数字版权管理等四个主要技术标准和符合性测试等支撑标准。

AVS从其出生之日就不是一个简单的市场化行为,这决定了行政力量是AVS的主要推动力。2002年6月,“数字音视频编解码技术标准工作组”(简称AVS工作组)由国家信息产业部科学技术司批准成立,挂靠单位为中国科学院计算技术研究所。工作组的任务是:面向我国的信息产业需求,联合国内企业和科研机构,制(修)订数字音视频的压缩、解压缩、处理和表示等共性技术标准,为数字音视频设备与系统提供高效经济的编解码技术,服务于高分辨率数字广播、高密度激光数字存储媒体、无线宽带多媒体通讯、互联网宽带流媒体等重大信息产业应用。

2006年2月,AVS视频编码成为国家标准,获批的标准号为GB/T20090,并于2006年3月1日起实施。数字音视频编解码技术标准工作组

2019年9月16日,华为海思发布全球首颗基于AVS3.0视频标准的8K/120fps解码芯片Hi3796CV300,CPU处理能力达到4核1.6GHz,28nm工艺,助跑广电进入全8K时代。

三 版税

不同于H.264, H.265/HEVC的版税很高,虽然现在有降价但还是很高。

目前至少有四家组织或公司在收取HEVC的许可费用:老牌的专利池MPEG LA,新兴的专利池HEVC Advance和Velos Media,以及Technicolor公司。Velos Media和Technicolor暂时没有公布自己的收费政策。

MPEG LA公司是全球领先的各种标准和其他技术平台的一站式许可证提供商,从20世纪90年代开始就开创了现代专利池,上一代应用最广泛的标准H.264也是由该公司来提供许可授权的。所以对于HEVC的授权许可政策还算厚道,但也价格不菲。

img

l 0-10万套/年,免专利许可费

l 超过10万套的部分每套收取2美元的专利许可费

l 封顶费用为2500万美元

l 包含制造权、使用权和销售权

l 专利许可费从2013年5月1日开始计算

l 针对HEVC内容不再单独收取专利许可费

l 半导体芯片供应商或其他包含HEVC编码器/解码器的产品供应商可以以其获许可客户的名义支付专利许可费

四 一个视频标准能普及因为他解决的应该场景广

H.264的应用场景或设计目标。

1)视频广播 Broadcast:cable,satellites, and DSL.

2)视频存储 Storage:DVD, HD DVD,and Blu-ray.

3)视频会议 Video Conferencing:over different networks.

4)视频流,直播点播 Multimedia Streaming: live and on-demand.

5)短视频服务 Multimedia Messaging Services.

所谓普及只是H.264 /5 在视频应用的一个子场景,视频内容的存储和播放。

不想瞎扯了,还是回到问题吧。

现在限制H265发展的是什么?

1)商业利益

比如版权专利费等,各大厂站队分账(分脏)等。其实开源编码器也是有商业利益在背后的。

2)HEVC/H.265 的对手

编码器VP9等。 在2017年及以前,HEVC/H.265 的最大对手其实是H.264。

3)HEVC/H.265 的配套

H.265是针对大尺寸视频2K, 4K, 8K,多路视频,超高精度视频,3D视频等,如果对应的采集、播放和运算设备都没准备好,H.265也无用武之地。

根据CISCO的分析预测到2021年,从2016年到2021年数据视频还是以高清为主,超高清占30%左右。H.264是对应高清的,H.265对应超高清。

HEVC/H.265什么时候能普及开呢?

按H.264的发展推H.265, 预计2022到2025年

展望(下一代视屏编码格式)

2.4 H265(下一代视屏编码格式之一)

2.4.1 更好的压缩

  与H.264编解码器相比,HEVC在压缩方面提供了重大的改进。实际上,HEVC压缩视频的效率比H.264要高出两倍。使用HEVC,相同视觉质量的视频只占用一半的空间。或者,具有相同文件大小和比特率的视频可以呈现更好的质量。

  这种改进有一部分要归功于增加的宏块大小。宏块定义为用于压缩计算的图像区域,较大的宏块可以有效地压缩高分辨率的视频。H.264仅允许16×16像素的宏块,这些宏块太小,以致于无法高效地播放1080p以上的视频。HEVC则提供64 x 64像素的宏块(现在称为编码树单元或CTU),从而在更高的分辨率下实现更高的编码效率。

2.4.2 改进的帧间运动预测

  视频压缩的一个主要因素是预测帧之间的运动(或其缺少)。当像素保持静止(固态背景图像)时,智能的视频编解码器可以通过引用它来节省空间,而不是再现它。通过改进的运动预测,HEVC可以提供更小的文件大小和更高的压缩质量。

2.4.3 改进的帧间预测

  视频压缩其实也受益于分析单个帧内的“移动”,从而可以更有效地压缩单帧视频。这可以通过使用数学函数而不是实际像素值来描述像素布局来实现。该功能占用的空间少于像素数据,从而缩小文件大小。然而,编解码器必须支持足够高级的数学函数才能使该技术真正发挥作用。HEVC的帧间预测功能比H.264的更详细,前者支持33个方向的运动预测,而后者只支持9个方向。

2.4.4并行处理

  HEVC使用可以独立解码于帧其余部分的单元和片段层。这意味着解码过程可以跨多个并行处理线程进行拆分,并充分利用现有标准多核处理器上更高效的解码机会。随着视频分辨率越来越高,这种提高效率需要在低端硬件上以可观看的速度对视频进行解码。

2.5 VP9(下一代视屏编码格式之一)

VP9 是由 Google 开发的开放式、无版权费的视频编码标准,在开发初期曾经被命名为 Next Gen Open Video,VP9 也被视为是 VP8 的下一代视频编码标准。 VP9 广泛用于音视频通话 Firefox, Chrome等主流浏览器和FFmpeg等视频播放器已经支持了VP9编码 。 它有一个优势,就是用VP9编码能比过去的VP8或H.264编码的视频节省一半带宽。 申请成为VP9编码的合作伙伴非常简单,没有那么多复杂授权问题,而且该编码技术为免费提供。但在过去用H.264的任何软硬件厂商都要向MPEG LA支付授权费,然后该费用由专利拥有者分配。

2.5.1 H.265、VP9 性能对比
编码质量

△ 编码质量测试

上图为 H.265 与 VP9 编码质量的对比测试,数值越小,则表示编码质量越好。从对比中我们发现 H.265、VP9 两者的差别并不大,整体平均分只差了 0.001,在实际应用中几乎不存在差异。

2.5.2 编码时间

△ 编码时间测试

在编码时间对比中,VP9 完胜 H.265,无论是 4K 视频还是 1920、1280 分辨率的视频,VP9 的编码耗时都比 H.265 短很多。

2.5.3 CPU 消耗

△ CPU 消耗测试

上图是 H.265 和 VP9 在 Dell Precision 390 工作站上播放 CPU 消耗测试,VP9 在 Firefox 上 CPU 解码效率比 Chrome 更高效。而 H.265 在 DivX 上远远比 VLC Player 高效。将两个编码标准的数据进行对比之后,H.265 的解码效率略高于 VP9 。

未来属于 H.265 还是 VP9

H.265 继承了 H.264 的视频编码标准体系,在商业应用中更加广泛,多使用于安防、军政、企业等场景中,但由于其专利持有者过多,导致其商用费用过高,在推广中面临较大阻力。

VP9 由 Google 研发,可以免费使用。在实际推广中,微软、苹果等公司不愿看到 VP9 一家独大,其他互联网厂商也不希望主流视频编码格式被垄断,因此目前在主要在 Google 自家的产品中得到支持,其他使用 VP9 的大厂并不多。

就目前而言,H.265 在企业、安防中使用较为广泛,而 VP9 因其简易、实用的解决方案以及开发免费的特性在互联网应用场景中使用较多。未来两者究竟谁会是主流的视频编码标准,这点还不好说。当然,随着视频应用场景的多样化,未来也有可能是两者并而行之,相辅相成。

更便捷的多媒体云处理

不论是 H.265 还是 VP9,都有着其优势领域,用户可以根据实际的应用场景选择使用的格式。

目前,又拍云的媒体处理已同时支持 H.265 和 VP9 视频编码标准。客户在进行音视频处理时,只需要把视频编码格式设置成 libx265 或 libvpx-vp9,即可实现视频编码成 H.265 或 VP9。