必须要掌握的音视频编码、解码基础!

一、音视频为什么要编码?

音视频编码技术在音视频领域有着举足轻重的地位,这是由于音视频原始数据量较大,在传输的过程中如果不进行编码的话,则无法进行传输。比方说,一张普通的图片的大小大概是1-2M,假设我们传输的帧率是30帧,则相当于一秒钟三十张2M的图片,那这个传输量是不得了的。所以此时我们就要引入视频编码技术进行压缩处理,目前常见的视频压缩技术有H264/H265两种压缩技术(这方面我们后面再慢慢介绍),音频编码技术是AAC,这两种压缩格式可以使得每一帧数据的大小能够压缩100-200倍,这使得传输效率大大提高。

二.音视频编码总体框图

9922e1f65d454dc365a845cbe8545da1.png

这框图就是音视频从采集到编码到推流的全流程,

2.1.第一步:采集摄像头、麦克风的数据:

编码的第一步基本上都是采集视频、音频的数据,并把采集到的数据送到对应的音视频编码器。视频数据送到H264/H265编码器,音频数据送到AAC编码器,编码处理过后分别送到视频编码队列和音频编码队列。

2.2.第二步:音视频编码数据封装:

从视频编码队列和音频编码队列拿出数据,并进行音视频的封装,所谓的音视频封装相当于把视频裸流和音频裸流合并在一起成为一个既有视频也有音频的复合流。常见的复合流有flv封装复合流、mpegts封装复合流(这两种具体的区别,在后面会说到)。

2.3.第三步:把复合流推送到对应的流媒体服务器:

把复合流拿到之后,就每一帧音频和视频数据往对应的流媒体服务器发送数据(这里要注意:不同的流媒体协议,用不同的封装格式。比方说RTMP用的是FLV格式,SRT/RTSP用的是mpegts复合流格式)。

三.什么是音视频解码:

音视频解码,顾名思义就是把已经压缩过后的音视频(视频:H264/H265,音频:AAC、MP3)数据还原成原始数据(视频原始数据:YUV,音频原始数据:PCM)的过程。

1.音视频解码的大体框图:

5a8bb246195324f82d671112d0152676.png

1.1:读取流媒体地址:并进行解封装操作 先读取音视频的流媒体地址,并把流媒体获取到的音视频进行解封装处理。所谓解封装处理就相当于把flv、mpegts等复合流分割成视频裸流(H264/H265视频流)和音频裸流(AAC音频流)。并把每个裸流分别存放到不同的队列,视频裸流存放到VideoPacket Queue,音频裸流存放到Audio Queue。(注:这里的队列名称都是自己命名的)

1.2:把队列的裸流数据取出来,进行每一帧的解码操作 把视频裸流队列和音频裸流队列的数据取出来,并一帧一帧送到解码器进行视频解码和音频解码。并把解码后的数据分别进入视频解码队列和音频解码队列。

1.3:从解码队列拿数据,并进行音视频同步处理 把第二步解码队列的音视频拿出来,分别进行音视频同步的算法处理。目前的话音视频同步,基本上都是基于音频作为参考时钟,而视频基于音频的节奏进行同步操作。音视频同步处理后,音视频基本上可以做到声音和画面完全同步了。

1.4:把音视频同步过后的数据分别播放出来 经过音视频同步处理后,视频数据(YUV数据)就直接送到SDL或者drm显示出来。而音频数据(PCM)则直接送到alsa框架进行音频播放。

四.音视频解码的难点:

音视频解码总体来说还是比较难的,其中最大的一个难点就是音视频同步的算法控制。很多音视频的初学者,对音视频的节奏总是把握不好。所以经常会出现视频比音频快十几个毫秒或者音频比视频快个十几个毫秒,这都会导致音视频不同步的重要原因。关于这部分如何控制好,还需要多去看看源代码才能更好地解决。

最后:

今天的分享就到这里,更多交流,可以加作者微信进行深度交流:

6565f677a67a0de6a697573780454392.png
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章,介绍了网络、多媒体的一些基础知识,使读者能够对网络及多媒体开发有一个整体的概念,为后续章节中的实例学习打下基础。 第2章,介绍了在VC++环境下运用VFW(Vedio For Windows)进行:视频捕捉的过程,读取AVI文件的方法,最后给出了一个视频捕捉的实例,分析了其中关键代码的运行原理。如果有摄像头,即可通过该程序进行拍照和摄像。.. 第3章,介绍了IP视频会议系统的实现原理及方法,最后给出了一个完整的IP视频会议系统的实现代码。 第4章,介绍了远程视频监控系统的组成及相关技术,并给出了一个完整的远程视频监控系统的具体实现代码,该系统可以很好地完成基本的远程监控功能。 第5章,介绍了MPEG-4的关键技术,通过编写一个MPEG-4的播放器,指导读者利用现有的DivX(MPEG-4)编码解码器,编写自己的播放器,体验MPEG-4带来的高品质画面与高压缩比。 第6章,介绍了MPEG-4编码过程,包括形状编码,运动估计、补偿技术和纹理编码技术,并对其中的关键算法源码进行了分析。 第7章,介绍了MPEG-4解码系统,系统的实现基于Windows 32编程技术。通过对本系统的学习,读者能够掌握MPEG-4的整个解码过程。 第8章,介绍了MP3编解码的知识,同时实现了一个功能强大的MP3播放器。 第9章,介绍了Xvid Quants Parser(XvidQP)系统的实现。 第10章,介绍了DirectShow的应用架构及大量常用实例。 .第11章,主要讲述了Directx3D程序设计的高级特征,并给出了凹凸贴图的实例工程。通过本章的学习,读者能够对D3D程序设计有比较深刻的了解,能够开发出比较复杂的应用程序,制作出绚丽的图形效果。 第12章,介绍了用DirectSound进行编程所要采取的一般步骤,讲解了通过DirectSoundSDK 9.0实现声音播放控制、音效的添加和虚拟环境下的3D声音。通过一个高级实例讲解了如何增加齐声、压缩和失真等8种标准音效。 第13章,介绍DirectX中有关DirectMusic部分的知识及常用实例。 第14章,介绍了一个863的科研项日,该项目实现了基于IBM Vio Voice的语音识别系统,同时本章还介绍了大量语音识别的相关知识。
学习Linux音视频解码的路线可以参考以下步骤: 1. 了解AVS标准:AVS是中国的第二代信源编码标准,用于数字音视频编码压缩。你可以先了解AVS的基本原理和技术特点,以及它在数字音视频产业中的应用。 2. 学习音视频解码基础知识:音视频解码是将原始音视频数据进行压缩和解压缩的过程。你可以学习音视频编码的基本概念、常用的音视频编码算法和标准。 3. 掌握Linux操作系统:Linux是一个广泛使用的开源操作系统,它在音视频领域有很多应用。你可以学习Linux的基本操作和命令,熟悉Linux环境下的开发和编程工具。 4. 学习流媒体技术:流媒体是指通过网络传输音视频数据的技术。你可以学习流媒体的基本原理、协议和常用的流媒体服务器软件。 5. 掌握音视频解码工具:Linux上有很多开源的音视频解码工具,如FFmpeg、GStreamer等。你可以学习这些工具的使用方法和参数配置,了解它们在音视频解码中的应用。 6. 实践项目:通过实践项目来巩固所学的知识。你可以选择一些开源的音视频项目,如视频播放器、音频编辑器等,进行学习和实践。 总之,学习Linux音视频解码需要掌握AVS标准、音视频解码基础知识、Linux操作系统、流媒体技术和音视频解码工具,并通过实践项目来应用所学的知识。这样就能建立起一个相对完整的学习路线。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值