音视频开发流程(音视频开发教程)

网友投稿 1152 2022-12-22

本篇文章给大家谈谈音视频开发流程,以及音视频开发教程对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享音视频开发流程的知识,其中也会对音视频开发教程进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

搞定音视频H264,厂长给我来开门,学会音视频开发薪资最低上涨150%

首先了解编码器、容器、采样率等。其余的如图像、视频分辨率;画面更新fps、压缩(视频、音频、帧压缩等)

编解码器(codec)指的是-一个能够对一个信号或者-一个数据流进行变换的设备或者程序。这里指的变换既包括将信号或者数据流进行编码(通常是为了传输、存储或者加密)或者提取得到一个编码流的操作,也包括为了观察或者处理从这个编码流中恢复适合观察或操作的形式的操作。编解码器经常用在视频会议和流媒体等应用中。

很多多媒体数据流需要同时包含音频数据和视频数据,这时通常会加入一些用于音频和视频数据同步的元数据,例如字幕。这 三种数据流可能会被不同的程序,进程或者硬件处理,但是当它们传输或者存储的时候,这三种数据通常是被封装在一起的。通常这种封装是通过视频文件格式来实现的,例如常见的*.mpg, *.avi, *.mov, * .mp4, *.rm, *.ogg or *.tta.这些格式中有些只能使用某些编解器,而更多可以以容器的方式使用各种编解码器。

采样率(也称为采样速度或者采样频率)定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样频率的倒数叫作采样周期或采样时间,它是采样之间的时间间隔。注意不要将采样率与比特率(bitrate, 亦称一位速率II )相混淆。

视频文件可被感知的有两个方面: 视频 和 音频 ,一个完整的视频文件中,可能包含着不同场景的多个子视频,不同的多个子音频。

我们将这些 视频码流 、 音频码流 进行封装格式数据,形成我们常见的MP4、MKV、AVI文件,就可以在网络上进行传输了。

当我们拿到一个视频文件时,我们可以通过支持该格式的视频播放软件进行播放,播放主要包括如下步骤:

在文件编码这块主要由两个目的,其一是形成统一的数据形式,以 便于存储和传输 ,第二是为了 删除冗余数据 。

试想一下,一个1080P 30帧,32bit色彩 时长为1秒的视频文件,如果按每一帧画面进行存储的话,数据大小将会达到:

32bit * 30 * 1080 * 1920 ≈ 237MB的空间,除非有特殊的需求,这种方式存储、传输视频显然是不可接受的。

如果我们采取编码算法,例如MPEG4、H.264等等算法对视频文件进行去冗余,压缩后,那么实际上得到的文件大小会大大降低。

前面说到,编码的主要目的是为了压缩,各种编码方式都是为了让视频体积小,核心的思想就是:去除冗余信息,冗余信息主要包括:

例如这样一张视频截图,在背景色全部是黑色的情况下,我们实际上没有必要按照视频大小(1124*772)存储黑色,我们可以将存储黑色的像素点抽离出来记录,只存储其他像素点的颜色即可。

简单地说就是帧A和帧B是前后帧的关系,并且两个帧之间画面变化相对较小,那么帧B就完全没有必要存储一个完整的画面帧,记录变化即可。

人眼难以感知到或者说不敏感的部分图像数据可以压缩存储。

例如,对于图像的编码和解码处理时,由于压缩或量比截断引入了噪声而使图像发生了一些变化,如果这些变化不能为视觉所感知,则仍认为图像足够好。

事实上人类视觉系统一般的分辨能力约为26灰度等级,而一般图像量化采用28灰度等级,这类冗余我们称为视觉冗余。

也称编码冗余, 人们用于表达某一信息所需要的比特位数 总 比理论上表示该信息所需要的最小比特数 来的大,这之间的差距就成为信息熵冗余。

将音频三元组(采样率,采样大小和通道数)的值转成另外一-组值;
例如:将44100/16/2转成48000/16/2

《音视频入门到精通解析全套教学》

帧内预测是根据帧内已经编码的样本,为当前的样本计算出一个预测值,用当前样本值减去预测值得到一个残差值,目的就是为了减少传输的数据量。

rgb 8bit位深,3通道(不含透明度),一个pix占用3Bytes

常见电影_fps=60; 视频直播_fps=15

实时:i+p;转码:大量b帧,为减小存储

与帧相似程度极高达到95%6以上编码成B像是程度7096编码成P帧。如何编码不需要程序员来实现,已经由x264这个工具帮我们做了
图片

视频帧就行编码。大致的流程分为三步:

VTCompressionSessionCreate 创建编码对象参数详解:

VTCompressionSessionEncodeFrame 编码函数参数详解:

本篇就介绍了音视频的编码原理,及部分解析。更多H264以及H265编码,以及ffmpeg 实现。可以前往 《音视频入门到精通解析全套教学》 学习;里面内容解析了从入门到精通的详细教学。以及FFmpeg的实战笔录。

Android -- 音视频基础知识

帧,是视频的一个基本概念,表示一张画面,如上面的翻页动画书中的一页,就是一帧。一个视频就是由许许多多帧组成的。

帧率,即单位时间内帧的数量,单位为:帧/秒 或fps(frames per second)。一秒内包含多少张图片,图片越多,画面越顺滑,过渡越自然。 帧率的一般以下几个典型值:

24/25 fps:1秒 24/25 帧,一般的电影帧率。

30/60 fps:1秒 30/60 帧,游戏的帧率,30帧可以接受,60帧会感觉更加流畅逼真。

85 fps以上人眼基本无法察觉出来了,所以更高的帧率在视频里没有太大意义。

这里我们只讲常用到的两种色彩空间。

RGB的颜色模式应该是我们最熟悉的一种,在现在的电子设备中应用广泛。通过R G B三种基础色,可以混合出所有的颜色。

这里着重讲一下YUV,这种色彩空间并不是我们熟悉的。这是一种亮度与色度分离的色彩格式。

早期的电视都是黑白的,即只有亮度值,即Y。有了彩色电视以后,加入了UV两种色度,形成现在的YUV,也叫YCbCr。

Y:亮度,就是灰度值。除了表示亮度信号外,还含有较多的绿色通道量。

U:蓝色通道与亮度的差值。

V:红色通道与亮度的差值。

音频数据的承载方式最常用的是 脉冲编码调制 ,即 PCM 。

在自然界中,声音是连续不断的,是一种模拟信号,那怎样才能把声音保存下来呢?那就是把声音数字化,即转换为数字信号。

我们知道声音是一种波,有自己的振幅和频率,那么要保存声音,就要保存声音在各个时间点上的振幅。

而数字信号并不能连续保存所有时间点的振幅,事实上,并不需要保存连续的信号,就可以还原到人耳可接受的声音。

根据奈奎斯特采样定理:为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍。

根据以上分析,PCM的采集步骤分为以下步骤:

采样率,即采样的频率。

上面提到,采样率要大于原声波频率的2倍,人耳能听到的最高频率为20kHz,所以为了满足人耳的听觉要求,采样率至少为40kHz,通常为44.1kHz,更高的通常为48kHz。

采样位数,涉及到上面提到的振幅量化。波形振幅在模拟信号上也是连续的样本值,而在数字信号中,信号一般是不连续的,所以模拟信号量化以后,只能取一个近似的整数值,为了记录这些振幅值,采样器会采用一个固定的位数来记录这些振幅值,通常有8位、16位、32位。

位数越多,记录的值越准确,还原度越高。

最后就是编码了。由于数字信号是由0,1组成的,因此,需要将幅度值转换为一系列0和1进行存储,也就是编码,最后得到的数据就是数字信号:一串0和1组成的数据。

整个过程如下:

声道数,是指支持能不同发声(注意是不同声音)的音响的个数。 单声道:1个声道
双声道:2个声道
立体声道:默认为2个声道
立体声道(4声道):4个声道

码率,是指一个数据流中每秒钟能通过的信息量,单位bps(bit per second)

码率 = 采样率 * 采样位数 * 声道数

这里的编码和上面音频中提到的编码不是同个概念,而是指压缩编码。

我们知道,在计算机的世界中,一切都是0和1组成的,音频和视频数据也不例外。由于音视频的数据量庞大,如果按照裸流数据存储的话,那将需要耗费非常大的存储空间,也不利于传送。而音视频中,其实包含了大量0和1的重复数据,因此可以通过一定的算法来压缩这些0和1的数据。

特别在视频中,由于画面是逐渐过渡的,因此整个视频中,包含了大量画面/像素的重复,这正好提供了非常大的压缩空间。

因此,编码可以大大减小音视频数据的大小,让音视频更容易存储和传送。

视频编码格式有很多,比如H26x系列和MPEG系列的编码,这些编码格式都是为了适应时代发展而出现的。

其中,H26x(1/2/3/4/5)系列由ITU(International Telecommunication Union)国际电传视讯联盟主导

MPEG(1/2/3/4)系列由MPEG(Moving Picture Experts Group, ISO旗下的组织)主导。

当然,他们也有联合制定的编码标准,那就是现在主流的编码格式H264,当然还有下一代更先进的压缩编码标准H265。

H264是目前最主流的视频编码标准,所以我们后续的文章中主要以该编码格式为基准。

H264由ITU和MPEG共同定制,属于MPEG-4第十部分内容。

我们已经知道,视频是由一帧一帧画面构成的,但是在视频的数据中,并不是真正按照一帧一帧原始数据保存下来的(如果这样,压缩编码就没有意义了)。

H264会根据一段时间内,画面的变化情况,选取一帧画面作为完整编码,下一帧只记录与上一帧完整数据的差别,是一个动态压缩的过程。

在H264中,三种类型的帧数据分别为

I帧:帧内编码帧。就是一个完整帧。

P帧:前向预测编码帧。是一个非完整帧,通过参考前面的I帧或P帧生成。

B帧:双向预测内插编码帧。参考前后图像帧编码生成。B帧依赖其前最近的一个I帧或P帧及其后最近的一个P帧。

全称:Group of picture。指一组变化不大的视频帧。

GOP的第一帧成为关键帧:IDR

IDR都是I帧,可以防止一帧解码出错,导致后面所有帧解码出错的问题。当解码器在解码到IDR的时候,会将之前的参考帧清空,重新开始一个新的序列,这样,即便前面一帧解码出现重大错误,也不会蔓延到后面的数据中。

DTS全称:Decoding Time Stamp。标示读入内存中数据流在什么时候开始送入解码器中进行解码。也就是解码顺序的时间戳。

PTS全称:Presentation Time Stamp。用于标示解码后的视频帧什么时候被显示出来。

前面我们介绍了RGB和YUV两种图像色彩空间。H264采用的是YUV。

YUV存储方式分为两大类:planar 和 packed。

planar如下:

packed如下:

上面说过,由于人眼对色度敏感度低,所以可以通过省略一些色度信息,即亮度共用一些色度信息,进而节省存储空间。因此,planar又区分了以下几种格式:YUV444、 YUV422、YUV420。

YUV 4:4:4采样,每一个Y对应一组UV分量。

YUV 4:2:2采样,每两个Y共用一组UV分量。

YUV 4:2:0采样,每四个Y共用一组UV分量。

其中,最常用的就是YUV420。

YUV420属于planar存储方式,但是又分两种类型:

YUV420P:三平面存储。数据组成为YYYYYYYYUUVV(如I420)或YYYYYYYYVVUU(如YV12)。

YUV420SP:两平面存储。分为两种类型YYYYYYYYUVUV(如NV12)或YYYYYYYYVUVU(如NV21)

原始的PCM音频数据也是非常大的数据量,因此也需要对其进行压缩编码。

和视频编码一样,音频也有许多的编码格式,如:WAV、MP3、WMA、APE、FLAC等等,音乐发烧友应该对这些格式非常熟悉,特别是后两种无损压缩格式。

但是,我们今天的主角不是他们,而是另外一个叫AAC的压缩格式。

AAC是新一代的音频有损压缩技术,一种高压缩比的音频压缩算法。在MP4视频中的音频数据,大多数时候都是采用AAC压缩格式。

AAC格式主要分为两种:ADIF、ADTS。

ADIF:Audio Data Interchange Format。音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。这种格式常用在磁盘文件中。

ADTS:Audio Data Transport Stream。音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。

ADIF数据格式:

ADTS 一帧 数据格式(中间部分,左右省略号为前后数据帧):

AAC内部结构也不再赘述,可以参考AAC 文件解析及解码流程

细心的读者可能已经发现,前面我们介绍的各种音视频的编码格式,没有一种是我们平时使用到的视频格式,比如:mp4、rmvb、avi、mkv、mov...

没错,这些我们熟悉的视频格式,其实是包裹了音视频编码数据的容器,用来把以特定编码标准编码的视频流和音频流混在一起,成为一个文件。

例如:mp4支持H264、H265等视频编码和AAC、MP3等音频编码。

我们在一些播放器中会看到,有硬解码和软解码两种播放形式给我们选择,但是我们大部分时候并不能感觉出他们的区别,对于普通用户来说,只要能播放就行了。

那么他们内部究竟有什么区别呢?

在手机或者PC上,都会有CPU、GPU或者解码器等硬件。通常,我们的计算都是在CPU上进行的,也就是我们软件的执行芯片,而GPU主要负责画面的显示(是一种硬件加速)。

所谓软解码,就是指利用CPU的计算能力来解码,通常如果CPU的能力不是很强的时候,一则解码速度会比较慢,二则手机可能出现发热现象。但是,由于使用统一的算法,兼容性会很好。

硬解码,指的是利用手机上专门的解码芯片来加速解码。通常硬解码的解码速度会快很多,但是由于硬解码由各个厂家实现,质量参差不齐,非常容易出现兼容性问题。

MediaCodec 是Android 4.1(api 16)版本引入的编解码接口,是所有想在Android上开发音视频的开发人员绕不开的坑。

由于Android碎片化严重,虽然经过多年的发展,Android硬解已经有了很大改观,但实际上各个厂家实现不同, 还是会有一些意想不到的坑。

相对于FFmpeg,Android原生硬解码还是相对容易入门一些,所以接下来,我将会从MediaCodec入手,讲解如何实现视频的编解码,以及引入OpenGL实现对视频的编辑,最后才引入FFmpeg来实现软解,算是一个比较常规的音视频开发入门流程吧。

iOS音视频编码

iOS音视频开发涉及的方面比较广泛,一般分为采集、音视频的封装、编码、推流、拉流、解封装、解码、播放等阶段。其中音视频的编码和解码阶段是非常重要的步骤。其中编码分为硬编码和软编码,对应解码分为硬解码和软解码。

硬编码是指使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等。
硬编码一般性能高,对CPU没有压力,但是对其他硬件要求较高(如GPU等)。

软编码是指使用CPU进行编码,软编码通常使用:ffmpeg+x264。
软编码实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低。

常见的直播服务普遍采用了RTMP作为流媒体协议,FLV作为封装格式,H.264作为视频编码格式,AAC作为音频编码格式。

iOS中编码方式:
在iOS8之前,苹果并没有开放硬编码的接口,所以只能采用ffmpeg+x624进行软编码
在iOS8之后,苹果开放了接口,并且封装了VideoToolBoxAudioToolbox两个框架,分别用于对视频音频进行硬编码

关于音视频开发流程和音视频开发教程的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 音视频开发流程的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于音视频开发教程、音视频开发流程的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:天津一体化政务服务平台(天津一体化政务服务平台官网)
下一篇:关于flutter数字格式的信息
相关文章

 发表评论

暂时没有评论,来抢沙发吧~