硬解码与软解码的选择

前言

事物都有两面性,软解码和硬解码的并存,存在即合理,没有哪个最好,以后两者都会更好,而对于如何选择,根据项目需要。

在上篇《快速集成一个视频直播功能》 中提到,“确定需求后进行了一堆调研,最后在B站的 ijkplayer 与 Google 的 ExoPlayer 中做出了选择”,当时毅然决然的选择 ExoPlayer 原因有很多,如有兴趣,可关注我的gitchat接下来要分享的内容,微信扫描二维码便可以进入报名,《如何更加安全、高效地选择开源项目》 ,会详细介绍如何更好的选择一个第三方开源。

不多说,本篇先抛开稳定性、集成性、兼容性、健全性之余讨论,只做硬解码与软解码的分析,这也是当时选择 ExoPlayer 的重要原因之一。

区别

举个例子,CPU 相当于公司的 CEO ,GPU相当于公司技术总监、产品经理之类,来了一个需求,如果采用软解码,那就是让 CEO 去画原型,去一线写代码,这期间还要忙着各种大小的事物处理,如果采用硬解码,那就是CEO 朝技术总监、产品经理发指令,让他们去完成一件事,并且定期查询完成的程度。

  • 硬解码:就是调用GPU的专门模块进行解码,由显卡核心GPU来对视频进行解码工作。
  • 软解码:通过软件让CPU来对视频进行解码处理。

视频的编解码是一个很消耗性能的操作,最简单的例子就是前几年玩游戏的时候,经常手机发烫,有些配置差一点的手机,看个视频手机就发烧发热。

优缺点

网上看到一句话,“硬解码是将原来全部交由CPU来处理的视频数据的一部分交由GPU来做,而GPU的并行运算能力要远远高于CPU,这样可以大大的降低对CPU的负载,CPU的占用率较低了之后就可以同时运行一些其他的程序了。”

如果仅仅是上述这样,那是不是用GPU就是有绝对优势?那么诸如ijkplayer等第三方的优势又何在呢?ijkplayer只是大名鼎鼎的FFmpeg的一个fork而已,FFmpeg的fork现在也多的泛滥,良莠不齐。

下面说下两者优缺点:

这里写图片描述

上面对比中一个是功耗一个是总功耗,这个也很容易理解,GPU的电路更复杂,并行运算能力要远远高于CPU,于是耗电量就更高,GPU功耗大,但运行速度提升更多,功耗 = 功率 * 时间,所以就算功率乘个4,但是时间除以个10,总耗能还是降低。

选择

对于硬解码和软解码的选择,这个真心说不上哪个更好,根据项目的需要,现在几乎所有的设备都支持硬解码和软解码,仅支持一种的Android移动设备已经属于古董级的,我是没见到过,之前更多的人愿意选择软解码,更大的原因是因为硬件解码支持的格式较少,而软解码对于格式是不受限制的。

现在随着硬件的不断提高,解码技术的不断成熟和完善,我是更倾向硬解码,但硬件提升的同时,CPU也在不断的优化和提高,现在也不需要像之前那样尽可能节省CPU,现在处于性能过剩的时代,CPU已经很难处于负荷状态,选择软解码或者硬解码都是没有谁对谁错,刚刚图上已经贴出和标记两者的优点,根据项目需要选择。

当时选择硬解码的ExoPlayer,是因为只需要播放m3u8格式的视频,画面上没有那么高的追求,对于这样的需求,硬解码更符合公司的口味和用户的体验,至少可以节省更多的电量。

友情推荐:

这里写图片描述

你可能感兴趣的:(多媒体)