zoukankan      html  css  js  c++  java
  • 视频H264编码

    一.学习背景

    5G网络作为第5代的移动通信网络,它的网络峰值传播速度可1以达到10Gbps/s.这比4G的的传输速度快数百倍.举个例子,整部超高画质电影下载可在1秒钟之内下载完成.

    当然,随着5G技术的诞生,用在智能终端分享3D电影,游戏或者超高画质节目的时代已经毫无悬念的向我们走来.

    想必大家也逐步了解,国内外的互联网公司也已经布局音视频,3D技术方面的开发者招聘和相关产品研发.目前落地推广最普遍的就是直播类项目和小视频类的项目.当然未来的方向肯定不止如此.

    那么我们现在带着问题来学习?

    • 为何编码?
    • 何为编码?

    1.1 为何编码?

    从存储角度和网络传输以及通用性 3个角度,压缩已经成了不可或缺的动作.压缩编码最基本的指标,就是压缩比. 压缩比通常都是小于1(如果等于或者大于1,是不是就失去了编码的意义了.编码的目的就是为了压缩数据体量).

    1.2 何为编码?

    编码就是按照一定的格式记录采样和量化后的数据.

    1.2.1编码中软编码和硬编码的区别?

    • 硬编码: 使用非CPU进行编码,例如使用GPU芯片处理
    • 软编码: 使用CPU来进行编码计算.

    1.2.2 软编码与硬编码的区分?

    • 软编码: 实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点。
    • 硬编码:性能高,低码率下通常质量低于硬编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码。

    读者理解:
    硬编码,就是使用GPU计算,获取数据结果,优点速度快,效率高.
    软编码,就是通过CPU来计算,获取数据结果.

    1.2.3 压缩算法

    压缩算法分为2种,有损压缩与无损压缩.

    • 无损压缩:解压后的数据可以完全复原,在常用的压缩格式中,无损压缩使用频次较低
    • 有损压缩:解压后数据不能完全复原,会丢失一部分信息.压缩比越小,丢失的信息就会越多.信号还原的失真就会越大.

    需要根据不同的场景(考虑因素包括存储设备,传输网络环境,播放设备等)选用不同的压缩编码算法.

    二. 直播APP需求剖析

    2.1 直播项目流程

    在直播项目中,一般常见有8个步骤.

    • 音视频采集
    • 视频滤镜
    • 音视频编码
    • 推流
    • 流媒体服务器处理
    • 拉流
    • 音视频解码
    • 音视频播放

    这个在开发者面试一些有意向或者目前业务中包含直播需求的公司,最为常见的面试题.不管在我们过往的工作经验是否有直播或音视频相关经验.这个一块都是你必须能了解.希望大家可以简单的了解.

    2.2 相关框架的学习与使用场景

     
     
    • 采集视频,音频
      • 使用iOS原生框架 AVFoundation.framework
    • 视频滤镜处理
      • 使用iOS原生框架 CoreImage.framework
      • 使用第三方框架 GPUImage.framework

    CoreImage 与 GPUImage 框架比较:
    在实际项目开发中,开发者更加倾向使用于GPUImage框架.
    首先它在使用性能上与iOS提供的原生框架,并没有差别;其次它的使用便利性高于iOS原生框架,最后也是最重要的GPUImage框架是开源的.而大家如果想要学习GPUImage框架,建议学习OpenGL ES,其实GPUImage的封装和思维都是基于OpenGL ES.
    GPUImage OC版本下载地址
    GPUImage Swift版本下载地址

    • 视频音频编码压缩

      • 硬编码
        • 视频: VideoToolBox框架
        • 音频: AudioToolBox 框架
      • 软编码
        • 视频: 使用FFmpeg,X264算法把视频原数据YUV/RGB编码成H264
        • 音频: 使用fdk_aac 将音频数据PCM转换成AAC
    • 推流

      • 推流: 将采集的音频.视频数据通过流媒体协议发送到流媒体服务器
      • 推流技术
        • 流媒体协议: RTMPRTSPHLSFLV
        • 视频封装格式: TSFLV
        • 音频封装格式: Mp3AAC
    • 流媒体服务器

      • 数据分发
      • 截屏
      • 实时转码
      • 内容检测
    • 拉流

      • 拉流: 从流媒体服务器中获取音频视频数据
      • 流媒体协议: RTMPRTSPHLSFLV
    • 音视频解码

      • 硬解码
        • 视频: VideoToolBox框架
        • 音频: AudioToolBox 框架
      • 软解码
        • 视频: 使用FFmpeg,X264算法解码
        • 音频: 使用fdk_aac 解码
    • 播放

      • ijkplayer 播放框架
      • kxmovie 播放框架

      ijkplayer,kxmovie 都是基于FFmpeg框架封装的

     
     
    参考来源
     
     
  • 相关阅读:
    IoC~MVC3+EF+Autofac实现松耦合的系统架构 [转载]
    Ioc容器Autofac系列 向导
    依赖注入框架Autofac的简单使用 转载
    学 Win32 汇编[30] 条件及循环伪指令: .IF、.WHILE、.REPEAT 等
    学 Win32 汇编[31] 结构与联合
    在 API 函数中使用 PChar 参数的几种方法
    关于 "高位" 与 "低位" 回复 "Lovemit" 的问题
    如何把类中的方法做参数 回复 "林Lin☆☆" 的问题
    一个拼图工具的制作思路 回复 "AlwaysBug" 的问题
    简单的 "双缓冲" 绘图的例子 回复 "TookiQ" 的问题
  • 原文地址:https://www.cnblogs.com/GJ-ios/p/15405381.html
Copyright © 2011-2022 走看看