计算机技术领域中,『音视频技术』应该说算是较复杂的小门类。较复杂的东西有个简单的入门指引,或者有前辈带路是很重要的。

前阵子,因为项目中急需音视频技术,虽然网上资料看似很丰富,但对初学者来说,很多资料都是『硬入门』,一上来就摆弄一大堆具体的技术概念点(SPS,PPS,H264,HEAV…),让初学者一直处于半懂不懂的摸索怀疑状态。

更好的方式,假设称为『软入门』,应该是先简单理解到音视频的根本组成原理(即动画原理),再把具体而庞杂的技术点往上拼建,让新同学明白循序渐进,明白枝干的主次,对于他们未来的深入学习将是事半功倍的。

A、简单理解,音视频原理

很多人小时候,应该玩过个小游戏,在笔记本上连续几页绘制一只动物前后迈脚,然后快速翻页,就有了如下图 pic-0的效果。这个过程就蕴含着,(视频)动画原理。音视频原理也是基于此。如再在翻页的时候,你学一声马叫”嘶…..”。不用怀疑,这个声音就是一段音频中采样的PCM了。至于为啥叫PCM,下面这几张图,结合几句说明应该足够解惑了。

pic-0

图. pic-0

音视频的简单原理,就是一段序列播放的图片,再同步播放相应的序列音频采样片。如同 图pic-0到pic-3中所揭示的,里面就包含三个关键元素。

  • 1、YUV图片:从H264、HEAV等编码的二进制数据中,解码出来的序列图片叫YUV图片,本质上跟常见的jpg、png一样。因为视频中的序列图片实在太多了,考虑到效率和历史原因等,视频中解码出来的图片帧为YUV。显卡的主要工作内容就是处理这些图形数据。
  • 2、PCM音频:从mp3、aac等编码的二进制数据中,解码出来的序列音频采样点叫PCM音频数据,可以理解每一片PCM音频波形就是一个单位的声音。了解PCM格式的信息可以见PCM百科
  • 3、音画同步:将序列图片帧连续渲染到计算机图层,同时根据同步参数DTS、PTS来同步播放音频帧,这就是视频的播放过程了。请坚信,那些你未来接触到的奇怪音视频术语都是围绕这个简单过程的。

图. pic-1

图. pic-2

图. pic-3(动画能实现,基于两点基础,a、人眼和人脑的视觉缓存效应,b、计算机带来的图画运算速度)


B、音视频技术,常见的概念

音视频技术中一些专业的概念,跟我们平时交流中用到的一些词汇有一定区分。

  • 1、视频格式:我们经常看到的视频格式mp4、avi、mkv。在技术概念中,叫『视频封装格式』,简称视频格式,里面包含了封装视频文件所需要的视频信息、音频信息和相关的配置信息(比如:视频和音频的关联信息、如何解码等等)。
  • 2、编解码方式(视频):视频编解码的过程是指对数字视频进行压缩或解压缩的一个过程。常见的视频编解码方式有,H.26X(H.264,H.265等),MPEG等。这里需要留意到,不同的视频封装格式,其实里面使用的编解码方式很多是可能一样的,封装格式是不同厂家的包装。这就好比,多个雪糕厂家生产一个口味的雪糕,外面的包装都是不一样的。
  • 3、编解码方式(视频):常用的音频编解码方式有 AAC、MP3、WMA等。

图. pic-4

以下的概念就慢慢专业一些,可以逐步消化,用百科词条等来辅助理解。

C、视频解码:实现“H.264->YUV”

视频解码的过程,就是将以某种编码方式(H264)进行编码的二进制数据,解码成YUV图片的过程,即“H.264->YUV”。 最广泛使用的莫过于FFmpeg这个开源的编解码套件,里面广泛涵盖了常见的编解码方式,还有封装格式(视频格式)。

针对到常用的H264编码方式,里面就涉及到一些具体的编码技术。

  • 1、一帧图像、颜色模型:具体就涉及帧编码,场编码,RGB三原色颜色模型,YUV颜色模型,常用的有 YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1 和 YCbCr 4:4:4 这些YUV子分类颜色模型。 详细的介绍参考针对性的资料,这里就只做入门简述了。 《帧和场的概念》 《视频帧的类型》

  • 2、H264码流格式: 码流里面就是装载着编码后的视频数据的结构载体。其它编码方式的码流格式也是类似 图pic-5的结构,里面就包括了一些编解码的参数集等关键信息。 详细的介绍可以了解。 《H.264码流结构解析》 《IDR、CRA、BLA、RASL、RADL、Gop》

    图. pic-5(码流格式,即码流内数据组织方式)

  • 3、帧内预测和帧间预测:因为视频的图像序列很有连续性,所以为了最大可能提高编码压缩效率,就有了『帧内预测和帧间预测』这种技术思路。简单来说帧内预测就是压缩单帧的大小,帧间预测就是根据A帧来预测B帧的变化,从而压缩了B帧。详细资料再多可自己参考,《帧内预测和帧间预测的比较》

    图. pic-6(直观看出哪类帧柱形图比较高,帧预测关键标记在在动画『变动』区域)

  • 4、流媒体协议:除了本地视频的播放,我们经常用到的就是视频的在线播放(点播、直播)。需要在线播放就需要使用到流媒体协议的支持,常见的流媒体协议有RTMP、HLS、Http-flv、RTSP等。《流媒体协议综述》

D、音频解码:实现“AAC->PCM”

音频帧和视频帧处理的工艺都是类似的,差异之处就是音频采用的编码方式为AAC、MP3等,处理出来的基础单元为PCM(视频的基础单元YUV)。 需了解详细的同学,可以从百度百科词条『音频编码』开始。

图. pic-7(上手过Adobe Audition之后就会更直观明白音频文件的大致构成了)

E、移动播放器绕不开的—–>ijkPlayer架构简述

ijkPlayer播放器是一个包括iOS、Android两个平台的播放器,是Bilibili网址基于FFmpeg的简易ffplay播放器来进行开发的。相比于更有名的VLC播放器,ijkPlayer更精简,代码量更小,更方便改造。

如果你是从事手机移动播放相关的工作,你会发现,当探索过VLC的庞杂模块还有各类繁多的基于ffmpeg的小开源播放器之后,ijkPlayer可能还是绕不开的开源方案。

ijjPlayer播放流程跟ffplay使用ffmpeg播放流程一样,区别就是ijkPlayer会根据具体的iOS、Android平台来使用该平台的硬解码工具,效率要比ffmpeg的软解码高出很多。 其实ijkPlayer架构很精简,可以从这些系列资料开始,然后阅读它的代码。 《ijkplayer系列(二) —— ijkplayer初始化流程》

图. pic-8

F、直播化特性,来改造ijkPlayer播放器

如果播放器是移动类的直播需求,其实很多国内的云直播解决方案sdk,比如七牛云直播,金山云直播,都是基于ijkPlayer进行修改的,比如iOS可以通过obj-c runtime特性剖开封装类中是不是含有IJKMediaPlayer这个类。2016年大热起来各种视频直播App,所以各种直播云服务也丰富了起来,这一类直播播放一般会比较重视的特性有,a、直播的秒开,b、避免花屏和弱网卡顿,c、直播的超低延迟以保证互动效率。捡有特点的来简单说明一些。

  • 1、直播秒开。一方面需要服务器做Gop缓存(为了客户端能最快得到第一帧完整图画),一方面需要客户端预置格式信息,避免avformat_find_stream_info等这类耗时函数,还有优先解码出第一帧图像进行渲染。
  • 2、直播低延迟。服务器和客户端同时优化多级缓存中的默认时长。
  • 3、直播紧追(追踪)。金山云称之为直播追踪,实际上『直播紧追』更能代表这个技术的目的。实现的过程是,将网络累计等因素造成的过大缓冲快速播放掉,紧跟直播源时间戳,保证客户端播放进度最大程度接近视频真实发生的时间。

参考:

近来,敲敲念念了几个事,拓展了下社交认识了些新朋友,变换了一下金融交易风格,拜读了一位公号作者的宏观经济论调,品悟了一位出色主持人的三观态度,观望反思了一下事业的进程,零碎的感悟接踵而来,再匆匆而去。

有感慨、有激动、有惆怅、有膜拜、有惭愧,而过后,还是有些冗杂冲刷过后的清新隽永的。这隽永的尘埃仿佛转成了『信念建筑的公式』,使人更容易感受什么才是生活中淘出来的最真实深刻的金子。

苦难之磨砺

生活就像一场走钢线,刻骨地隐忍,节制地扩张是一种必须的品质。生活中的苦难本身是博大的,不论气宇轩昂之权贵,不论平头低眉之乞丐,都会恰到好处地光顾每一个人,把他狠狠的蹂躏一遍,有些人气势狰狞无济于事,有些人苦苦思虑挣得一斤半两,还有些人淡然不住似面若清风。

既然苦难是如此决绝,何不如以之为刃,挫灭我们多余的眷念眷恋,赢得通畅的『不动』的神气。

气韵之修为

忆往昔,人来人走,惟有意气相称交流畅快的,才会终古念念往来,即便岁月辗转,日月星辰聚落沉浮。所以,气韵悠悠归所,即是『金贵之身』。

意气之舒展

为生活、为儿女、为事业、为功名,意气舒展自在水到渠成,所以脚下的每一步就是远方既定的征程。急进亦不得,怠慢亦愚蠢。

构筑,价值之真地

人世一趟,所念、所愿、所欲、所为,未必真的有『绝对价值』的所得。而浇筑苦难之心态、强化气韵之修为,或许是种『价值真地』。研习采纳一本著作的生平&思想,沐浴之。日夜不忘与书论千古,推演之。气韵相称之好友,则畅谈结交,清水畅饮。稍有造作娇柔之浊气,则静念清空,化入清明月夜、飒爽山风。

实业&金融

在成熟的商业文明,发掘一块独特的市场,生产提供一种新商品或新服务,获取市场份额和利润。经营这份有一定风险的事业,这已经是一种最典型的商业行为模式。

但是当商业文明,从『商品工业方式』过渡向『资本工业方式』,很多的游戏规则可就不是那么想当然的遵循既有规律了。

典型而易见的,比如:

1、资本收益率将远远抛开劳动收益率:简单说就是,普通劳动人民的劳动付出得到的收益,将远远不及资本的投资游戏所得。特别这是一个处在『货币围城』的低级循环中。现象是,年轻人想着努力学习、努力工作过上幸福美好安逸的生活,简直是白日做梦,这个时代就是这种求生不能,求死不行的奇葩逻辑(墓地贵着呢,死了那不是祸害子孙,哈哈)。启发是,理解和使用金融手段将是一种主动防御行为,即便不谋求金融回报,最保守金融投资仍然是明智的。

2、极度畸形的市场波动:当代中国的怪异房价,是一种典型的人为市场化地默认房价畸形走高,却不允许走低。换另外一个角度看待,这是一种国家权贵资本主义利益行为。一方面有集中力量办大事聚焦,另一方面则创造着一种(社会主义)新奴隶制度,将国民羊群至于水深火热之中压榨。现象是,一套空中70年产权的房子需要几代人的心血供应,对于几千年以土地为根基的民族,一百年之后or之前,这都是荒谬至极的不可能。启发是,关注一下做空中国房价,做空中国股市的机制。中国政府虽然极其威权有力,但是随着时间推移,和市场化的深入,我们应该在畸形波动中自保,或者谋求巨额收入。

不过,不管金融波动风浪如何不可理喻,最根本的还是得回归实业制造和实物价值。扎实做出实业的收益率还是硬通货。可能在未来的全球金融危机中,1块钱的实业收益率会比100块的大饼金融收益率更容易受到吹捧。

对于实业产品逻辑,时代变动中也在构建新规律。现在也已经不是物质匮乏时期,是块布料就能卖出去当衣服的年代,而是更多卖品质,卖情怀,卖感受,卖xxx等的复杂原料制造。


价值社区&社区热情

最近发生的事有几个关键的感悟,

1、英国(国家社区)退欧公投:整个国家民族的社区,处在一种负向的民主行为中。基于这种负向的民主行为推动出来的英国退欧公投,不管是退是留,受伤的还是英国人们自己,还有波及整个世界金融体系稳定性。思考,哪种社区的基因才是最明智的选择?是人人平等一票的公投社区建设,还是威权独断精英社区建设。从历史看来,没有哪种是绝对好和绝对不好,表现出来的还是使用者的智慧问题。百年前,英国的超前民主意识,促使他们成就日不落帝国,而现在的英国退欧公投就像个闹剧;1967~1976十年文革,中共的精英化建设超英赶美让整个民族深受痛楚;而1979年改革开放,到现在30年后,这种精英情怀又成就了一个人类的创富奇迹。这没办法说哪一个更好,不过一个健康社区运行必须需要精英人才成长、需要交流对话、需要权重化的正向民主推进方式。

2、社区价值由数据表现:俄罗斯的MT4、MT5软件制造商MetaQuotes,基本主导了全球外汇经纪人软件份额。MetaQuotes创造了一个很意义的社区mql5.com,在上面基于交易营收表现,来营造出来的整个价值生态,是最简单的社区价值基因。

3、社区价值由参与者收益表现:一个国家社区,要给百姓安居乐业的基础,凭空地鼓吹爱国主义是愚蠢行为;一个学校学术社区得到尊重与否,要提供给学生、学者环境和学习氛围并得到成长;一个互联网的社区生命力和影响力,取决于满足使用者和参与者的哪种需求。

4、社区的人与人交流是核心: 前几天我在一个蛮理性的微信群上,好心&热心帮助别人解答,却反倒被他(小白)污蔑成卖弄。这让人心塞愤懑地想起了『斗米养恩 担米养仇』的故事;也是昨天,在一个交友群上为一位勇敢直率有态度的女孩,大为称赞,不惜扔了两个大红包来表示赞赏。回想到社会关系中的流动规律,人与人的沟通交流,同频的结识对话和互助,是一种很有价值有意义的事。站小点来说,为很多人带来独特的相识互助和感情共鸣(甚至可能是婚姻家庭的开始)。站大一点,促进了整个国家社区的血液流动,因为有效有价值的人际循环,可以带来了商业稳定繁荣的根基和社会百态的新陈代谢。