1 前言(音视频背景,略微啰嗦,但是想为想我一样刚入门的小白加深音视频开发的了解,无兴趣请跳过)
近年来,随着科技的不断发展和互联网的普及,人们越来越多地使用手机、电脑等设备观看各种类型的视频来娱乐自己,音视频开发成为了一个越来越重要的领域。从传统的有线电视到现在的在线直播和短视频应用,人们对于音视频娱乐的需求越来越高。在视频播放过程中,音视频技术是关键因素之一。通过采用摄像头和麦克风进行采集,视频和音频可以被捕捉并发送到网络上。同时,视频/声音也可以保存在本地设备上,比如手机、电脑等,并通过播放器来进行观看。
目前,音视频开发方向主要包括两个部分:一方面是基础架构,即音视频传输和处理的技术;另一方面是业务应用,即将音视频技术与各种实际应用场景结合起来,如在线教育、游戏直播、视频会议等。
其中,基础架构方面主要涉及音视频编解码、传输协议、流媒体服务器等技术。其中,视频编码是视频技术中最基本、最核心的技术之一。通过将视频数据压缩成小的数据包,可以实现高效地传输和存储。视频解码则是将已经压缩的视频数据重新还原为原始的视频图像信息的过程。这些技术的不断完善和发展,为业务应用提供了更加可靠和高效的支持。此外,视频格式也是视频技术中一个非常重要的内容。常见的视频格式包括AVI、MP4、MOV等,不同的格式适用于不同的场景和需求。比如,MP4格式适用于移动设备和在线视频播放器,而MOV格式则主要应用于Apple设备之间的视频传输。
总之,随着技术的不断进步和市场的不断扩大,音视频开发必将成为一个充满活力和机遇的领域,同时也面临着诸多挑战。在未来的发展中,音视频技术将会越来越重要,并且有望成为最受欢迎和广泛应用的技术之一。
2 音视频基础名词
PTS:PTS(Presentation Time Stamp, 显示时间戳),表示将压缩帧解码后得到的原始帧的显示时间。:
DTS:DTS(Decoding Time Stamp, 解码时间戳),表示压缩帧的解码时间。
I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含⼀幅完整的图像信息,属于帧内编码图像,不含运动⽮量,在解码时不需要参考其他帧图像。因此在I帧图像处可以切换频道,⽽不会导致图像丢失或⽆法解码。I帧图像⽤于阻⽌误差的累积和扩散。在闭合式GOP中,每个GOP的第⼀个帧⼀定是I帧,且当前GOP的数据不会参考前后GOP的数据。
P帧:P帧(Predictive-coded picture, 预测编码图像帧)是帧间编码帧,利⽤之前的I帧或P帧进⾏预测编码。
B帧:B帧(Bi-directionally predicted picture, 双向预测编码图像帧)是帧间编码帧,利⽤之前和(或)之后的I帧或P帧进⾏双向预测编码。B帧不可以作为参考帧。B帧具有更⾼的压缩率,但需要更多的缓冲时间以及更⾼的CPU占⽤率,因此B帧适合本地存储以及视频点播,⽽不适⽤对实时性要求较⾼的直播系统。
time_base:在FFmpeg中,时间基(time_base)是时间戳(timestamp)的单位,时间戳值乘以时间基,可以得到实际的时刻值(以秒等为单位)。例如,如果⼀个视频帧的dts是40,pts是160,其time_base是1/1000秒,那么可以计算出此视频帧的解码时刻是40毫秒(40/1000),显示时刻是160毫秒(160/1000)。FFmpeg中时间戳(pts/dts)的类型是int64_t类型,把⼀个time_base看作⼀个时钟脉冲,则可把dts/pts看作时钟脉冲的计数。
注意:关于时间戳:video一帧的持续时间 = 1/ fps * time_base
audio一帧的持续时间 = 1*frame_size / sample_rate * time_base
视频码率:是视频数据(包含视频⾊彩量、亮度量、像素量)每秒输出的位数。⼀般⽤的单位是kbps。
channels: 通道数目。
format:采样格式
nb_samples:采样率。 采样设备每秒抽取样本的次数
dst:DSD文件很大,按原始方式存储很占空间,DST是DSD一种无损压缩方法。压缩文件音质不变,但播放时由于要“解压”,所以会增加不少运算量,有可能导致播放卡顿。
pps:图像参数集Picture Paramater Set(PPS)。通常情况下,PPS类似于SPS,在H.264的裸码流中单独保存在一个NAL Unit中,只是PPS NAL Unit的nal_unit_type值为8;而在封装格式中,PPS通常与SPS一起,保存在视频文件的文件头中。
sps:SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。
URI: 统⼀资源标识符(Uniform Resource Identifier,URI)是⼀个⽤于标识某⼀互联⽹资源名称的字符串。
ES(Elementary Stream): 基本码流,不分段的⾳频、视频或其他信息的连续码流。
PES(Packetized Elementary Stream):分组的基本码流,将基本码流ES流根据需要分成⻓度不等的数据 包,并加上包头就形成了打包的基本码流PES流。是⽤来传输ES的⼀种数据结构。
TS(Transport Stream):传输流,是由固定⻓度的包组成,含有独⽴时间基准的⼀个或多个节⽬,适⽤于误码较多的环境,并且从流的任意⼀段开始都可以独⽴解码。在MPEG-2系统中,由视频,⾳频的ES流和 辅助数据复接⽣成的⽤于实际传输的标准信息流称为MPEG-2传送流。个⼈理解,TS流是原始的PES流 (⾳视频等)中按照⼀定的频率插⼊PSI/SI和⼀些标识符(辅助数据)信息,然后按固定⻓度打包形成的 传输流。值得注意的是,PSI/SI信息在TS流中并不是只发送⼀次,⽽是按照⼀定的频率插⼊码流,是重复发送的。
PS(Program Stream):节⽬流,PS流与TS流的区别在于,PS流的包结构是可变⻓度的,⽽TS流的包结构是固定⻓度的。