• 音视频技术基础总结。


    音视频基础技术总结。

    误入CV 行业,突然觉得还挺有意思。像一些图像,音视频基础知识还是要补一补。于其说是总结,不如说是扫盲吧。

    只要是搞音视频的,应该没有谁没听过FFmpeg,就连我这个小白都听过。

    现在主流的第三方播放器都是基于FFmpeg开源库开发的。它几乎实现了所有的封装格式、传输协议以及音视频编解码功能,功能非常强大。不过FFmpeg比较复杂,研究透需要花费大量的时间,限于时间,从音视频基本概念入手,了解码率、帧率、视频格式、编码原理等。

    音视频基础概念

    • 码率
      码率是传输室单位时间传送的数据位数,单位是千位每秒(kbps),分为静态码率(CBR)和动态码率(VBR),静态码率的视频文件从头到尾都是恒定码率,优点运算量小,压缩快,支持设备范围广,缺点支持范围大,画质较差。动态码率没有固定的比特率,优点画面质量高,体积小,缺点算法复杂,运算量大,压缩时间长。

    • 帧率
      指每秒显示的图片数或者GPU处理时更新的次数,单位是帧每秒(FPS)。

    • 位深度
      表示像素的位数,位深度越大,位数越多,可用的颜色越多,画面也越逼真。常见的有8bit, 10 bit, 12bit。

    • 视频格式
      1)封装格式
      也就是常见的视频文件格式,把视频、音频、字幕等零散信息组装在一起。ts适合网络流媒体播放,一般用于直播,mp4只包含一条视频轨和音频轨,适合大多数的播放设备,mkv包含多条音频轨、视频轨、字幕等,适合网络分享。
      2)编码格式
      通过特定的压缩算法,将某种视频格式的文件转化为另一种视频格式的文件,常用的编码标准有H.26X系列、MPEG系列、Divx、xvid、WMD-HD和VC-1等。

    移动端使用最多的MP4视频文件,主要使用H.264AVC编码格式。优点主要如下:
    A. 低码率:具有很高的数据压缩率,有效减少用户带宽的占用。
    B. 容错能力强,提供了在不稳定网络情况下发生丢包的解决工具。
    C. 网络适应性强,能在不通的网络上传输。
    D. 提供连续、流畅的高质量图像。

    • H.264编码
      原理在一段变化不大的图像画面,先编码出完整的图像帧A,后面的图像帧B不编码全部图像,只编出与A帧的差别,这样B帧就小很多,若果变化依旧不大,随后的C帧也按照B帧的编码方式,就这样循环下去。H.264协议定义了三种帧,完整编码的帧(I帧),参考I帧,只包含差异的帧(P帧),参考前后帧编码的帧(B帧)。核心算法是帧内压缩(生产I帧的算法),帧间压缩(生成P帧和B帧的算法)。

    • 流媒体协议
      服务器与客户端之间通信遵循的规定。
      互联网视频服务通常RTMP,MMS,HTTP这类的协议,作为其流媒体的传输层协议,因为不会发生丢包。

    • 音频编码
      音频编码的主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。

    • 网络视音频平台对比
      网络视音频服务主要包括点播和直播。点播是根据用户需求播放相应的节目,大部分网站都能提供这种方式。直播在网络电视台,社交视频网站常见。

    A. 直播平台参数对比
    直播服务普遍采用了RTMP作为流媒体协议,FLV作为封装格式,H.264作为视频编码格式,AAC作为音频编码格式。
    B. 点播平台参数对比
    点播服务普遍采用了HTTP作为流媒体协议,H.264作为视频编码格式,AAC作为音频编码格式。采用HTTP优势,传输过程不会丢包,保证视频质量,大部分Web服务器支持,节约开支。

    • RTSP协议
      RTSP(Real-TimeStream Protocol )是一种基于文本的应用层协议,在语法及一些消息参数等方面,RTSP协议与HTTP协议类似。

    • Android支持的格式
      支持mp4、3gp、mkv和webm四种视频封装格式。webm格式是在mkv格式的基础上开发的新格式,包含了VP8/VP9视频轨。

    • Android实现视频编码
      主要使用硬编码和软编码两种,硬编码直接调用GPU进行编码处理,实现方式通过Android自身提供的MediaCodec类处理音视频,软编码是使用CPU进行运算,实现方式通过集成FFmpeg多媒体库处理音视频。硬编码优点是功耗低、编解码速度快,缺点是扩展性不强、兼容性差、适用于智能家居产品、手机摄像实时取景。FFmpeg优点是封装了很多格式,灵活,兼容性好、功能强大,缺点功耗大,占用CPU较多,效率低,适用于短时间拍摄。

  • 相关阅读:
    c++ socket发送数据时,sendData = char * string 导致的乱码问题
    c++ sprintf() 用法
    c++ 将float 类型转换成string 类型
    c++中 string类型 转为 char []类型
    c++ 去掉所有空格及换行符
    c++处理字符串string.find()与string::npos
    C1010 unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source
    C++ socket bind() 函数绑定错误
    windows 全局安装 composer
    VMware Tools (ubuntu系统)安装详细过程与使用
  • 原文地址:https://www.cnblogs.com/michaelcjl/p/11768000.html
Copyright © 2020-2023  润新知