视频编解码技术-2: H.264和VP9视频编码质量评估

一、引言

在实时视频通信和流媒体应用中,视频编码器的选择对视频质量和带宽消耗有着至关重要的影响。H.264和VP9是两种广泛使用的视频编码标准,它们在不同的应用场景中各有优劣。本文选择开源H.264编码器OpenH264,对比OpenH264和VP9在实时场景下的视频质量表现,为开发者和服务提供商在选择编码器时提供依据。

 相关文章: 

视频编解码技术-1: 开源Video Codec和评估方法

神旗视讯 -- 高性能的私有化音视频系统

二、测试方法

2.1 编码参数选取

对两个编码器,我们尽量选取它们在同等条件并适合实时应用的场景下,输出视频质量最好的编码参数。一些重要的参数值如下:

编码器

版本

参数

OpenH264

2.6.0

-rc 1

-gop-size 3000

-complexity 2

VP9v1.15.0

--end-usage=cbr

--rt–threads=1

--passes=1

--kf-min-dist=3000

--kf-max-dist=3000

--cpu-used=5

2.2 测试视频素材

我们使用两个常见的视频分辨率的视频素材,分别用于测试编码器在处理简单画面和复杂画面细节下的表现。视频素材来自:

Xiph.org :: Derf's Test Media Collection

源视频

分辨率

帧率

akiyo_cif.y4m352x28830
sunflower_1080p25.y4m1920x108025

2.3 测试工具

采用开源的视频质量评估工具:

https://github.com/google/rtc-video-quality.git

该工具能够自动化地完成视频编码、解码和质量评估的过程,准确计算PSNR和SSIM值。PSNR用于衡量重建视频与原始视频之间的均方误差,值越高表示视频质量越好;SSIM则从结构相似性角度评估视频质量,范围从0到1,越接近1表示视频质量越接近原始视频。

2.4 测试流程

在6档不同的比特率下,分别使用OpenH264和VP9对CIF和1080P视频进行编码。每完成一次编码,利用评估工具计算编码后视频的PSNR和SSIM值,并记录数据。将所有测试数据整理后,绘制出PSNR和SSIM随比特率变化的曲线图。

三、测试结果

3.1 CIF分辨率视频测试结果

从PSNR曲线(图1)可以看出,随着比特率的增加,OpenH264和VP9的PSNR值均上升。在各个比特率下,VP9的PSNR值略高于OpenH264。SSIM曲线(图2)也呈现类似趋势,VP9的SSIM值始终高于OpenH264,表明在CIF分辨率下,VP9编码后的视频在结构相似性上更接近原始视频。

3.2 1080P分辨率视频测试结果

在1080P分辨率下,PSNR和SSIM曲线(图3、图4)依然显示VP9在视频质量指标上优于OpenH264。随着比特率的提升,两者的视频质量都有所提高,但VP9在相同比特率下的PSNR和SSIM值均高于OpenH264。

四、结论

通过对OpenH264和VP9在不同分辨率视频、不同比特率下的测试,结果表明,在实时场景下,限制同样的比特率,VP9在视频质量方面表现优于OpenH264。无论是低分辨率的CIF视频还是高分辨率的1080P视频,VP9编码后的视频在PSNR和SSIM指标上均高于OpenH264。这意味着在相同的带宽条件下,VP9能够提供更好的视频质量,更适合对视频质量要求较高的实时应用场景。然而,实际应用中选择编码器除了视频质量外,还需考虑其他因素。下一篇我们将评估H.264和VP9在同等视频质量下的带宽消耗。

相关文章: 

视频编解码技术-1: 开源Video Codec和评估方法

神旗视讯 -- 高性能的私有化音视频系统

世界上最快的VP9视频解码器 As before , I was very excited when Google released VP9 – for one, because I was one of the people involved in creating it back when I worked for Google (I no longer do). How good is it, and how much better can it be? To evaluate that question, Clément Bœsch and I set out to write a VP9 decoder from scratch for FFmpeg. The goals never changed from the original ffvp8 situation (community-developed, fast, free from the beginning). We also wanted to answer new questions: how does a well-written decoder compare, speed-wise, with a well-written decoder for other codecs? TLDR (see rest of post for details): as a codec, VP9 is quite impressive – it beats x264 in many cases. However, the encoder is slow, very slow. At higher speed settings, the quality gain melts away. This seems to be similar to what people report about HEVC (using e.g. x265 as an encoder). single-threaded decoding speed of libvpx isn’t great. FFvp9 beats it by 25-50% on a variety of machines. FFvp9 is somewhat slower than ffvp8, and somewhat faster than ffh264 decoding speed (for files encoded to matching SSIM scores). Multi-threading performance in libvpx is deplorable, it gains virtually nothing from its loopfilter-mt algorithm. FFvp9 multi-threading gains nearly as much as ffh264/ffvp8 multithreading, but there’s a cap (material-, settings- and resolution-dependent, we found it to be around 3 threads in one of our clips although it’s typically higher) after which further threads don’t cause any more gain. The codec itself To start, we did some tests on the encoder itself. The direct goal here was to identify bitrates at which encodings would give matching SSIM-scores so we could do same-quality decoder performance measurements. However, as such, it also allows us to compare encoder performance in itself. We used settings very close to recommended settings forVP8,VP9andx264, optimized for SSIM as a metric. As source clips, we chose Sintel (1920×1080 CGI content, source ), a 2-minute clip from Tears of Steel (1920×800 cinematic content, source ), and a 3-minute clip from Enter the Void (1920×818 high-grain/noise content,screenshot). For each, we encoded at various bitrates and plotted effective bitrate versus SSIM . sintel_ssimtos_ssimetv_ssim You’ll notice that in most cases, VP9 can indeed beat x264, but, there’s some big caveats: VP9 encoding (using libvpx) is horrendously slow – like, 50x slower than VP8/x264 encoding. This means that encoding a 3-minute 1080p clip takes several days on a high-end machine. Higher –cpu-used=X parameters make the quality gains melt away. libvpx’ VP9 encodes miss the target bitrates by a long shot (100% off) for the ETV clip, possibly because of our use of –aq-mode=1. libvpx tends to slowly crumble at higher bitrates for hard content – again, look at the ETV clip, where x264 shows some serious mature killer instinct at the high bitrate end of things. Overall, these results are promising, although the lack-of-speed is a serious issue. Decoder performance For decoding performance measurements, we chose (Sintel)500 (VP9), 1200 (VP8) and 700 (x264) kbps (SSIM=19.8); Tears of Steel4.0 (VP9), 7.9 (VP8) and 6.3 (x264) mbps (SSIM=19.2); and Enter the Void 9.7 (VP9), 16.6 (VP8) and 10.7 (x264) mbps (SSIM=16.2). We used FFmpeg to decode each of these files, either using the built-in decoder (to compare between codecs), or using libvpx-vp9 (to compare ffvp9 versus libvpx). Decoding time was measured in seconds using “time ffmpeg -threads 1 [-c:v libvpx-vp9] -i $file -f null -v 0 -nostats – 2>&1 | grep user”, with this FFmpeg and this libvpx revision (downloaded on Feb 20th, 2014). sintel_archs tos_archsetv_archs A few notes on ffvp9 vs. libvpx-vp9 performance: ffvp9 beats libvpx consistently by 25-50%. In practice, this means that typical middle- to high-end hardware will be able to playback 4K content using ffvp9, but not using libvpx. Low-end hardware will struggle to playback even 720p content using libvpx (but do so fine using ffvp9). on Haswell, the difference is significantly smaller than on sandybridge, likely because libvpx has some AVX2 optimizations (e.g. for MC and loop filtering), whereas ffvp9 doesn’t have that yet; this means this difference might grow over time as ffvp9 gets AVX2 optimizations also. on the Atom, the differences are significantly smaller than on other systems; the reason for this is likely that we haven’t done any significant work on Atom-performance yet. Atom has unusually large latencies between GPRs and XMM registers, which means you need to take special care in ordering your instructions to prevent unnecessary halts – we haven’t done anything in that area yet (for ffvp9). Some users may find that ffvp9 is a lot slower than advertised on 32bit; this is correct, most of our SIMD only works on 64bit machines. If you have 32bit software, port it to 64bit. Can’t port it? Ditch it. Nobody owns 32bit x86 hardware anymore these days. So how does VP9 decoding performance compare to that of other codecs? There’s basically two ways to measure this: same-bitrate (e.g. a 500kbps VP8 file vs. a 500kbps VP9 file, where the VP9 file likely looks much better), or same-quality (e.g. a VP8 file with SSIM=19.2 vs. a VP9 file with SSIM=19.2, where the VP9 file likely has a much lower bitrate). We did same-quality measurements, and found: ffvp9 tends to beat ffh264 by a tiny bit (10%), except on Atom (which is likely because ffh264 has received more Atom-specific attention than ffvp9). ffvp9 tends to be quite a bit slower than ffvp8 (15%), although the massive bitrate differences in Enter the Void actually makes it win for that clip (by about 15%, except on Atom). Given that Google promised VP9 would be no more than 40% more complex than VP8, it seems they kept that promise. we did some same-bitrate comparisons, and found that x264 and ffvp9 are essentially identical in that scenario (with x264 having slightly lower SSIM scores); vp8 tends to be about 50% faster, but looks significantly worse. Multithreading One of the killer-features in FFmpeg is frame-level multithreading, which allows multiple cores to decode different video frames in parallel. Libvpx also supports multithreading. So which is better?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值