因为项目原因接触使用 ffmpeg,当时是使用 c# 调用f fmpeg,通过指令对视频进行转码。指令的方式比较容易上手,但是如果涉及到复杂点的音视频二次开发,如果没有对音视频相关概念有一定的了解的话,感觉很难理解代码的含义和逻辑。由于兴趣最近开始摸索学习 ffmpeg API 的相关使用。
1、相关概念理解
1.1多媒体文件的基本概念
-
多媒体文件就是一个容器
-
在容器中有很多流(Stream/Track)
-
每种流是由不同的编码器编码的
-
从流中读出的数据称为包
-
在一个包中包含着一个或多个帧
1.2音频的量化编码
-
模拟信号到数字信号的转换过程(连续 ->离散、不连续的过程才能被计算机使用
-
模拟信号->采样->量化->编码->数字信号
-
量化的基本概念: 采样大小:一个采样用多少个 bit 存放,常用的是 16bit
-
采样率:也就是采样频率(1秒采样次数),一般采样率有 8kHz、16kHz、32kHz、44.1kHz、48kHz 等,采样频率越高,声音的还原就越真实越自然,当然数据量就越大
-
声道数:为了播放声音时能够还原真实的声场,在录制声音时在前后左右几个不同的方位同时获取声音,每个方位的声音就是一个声道。声道数是声音录制时的音源数量或回放时相应的扬声器数量,有单声道、双声道、多声道
-
码率:也叫比特率,是指每秒传送的bit数。单位为 bps(Bit Per Second),比特率越高,每秒传送数据就越多,音质就越好。
码率计算公式:
码率 = 采样率 * 采样大小 * 声道数
比如采样率44.1kHz,采样大小为16bit,双声道PCM编码的WAV文件:
码率=44.1hHz*16bit*2=1411.2kbit/s。
录制1分钟的音乐的大小为(1411.2 * 1000 * 60) / 8 / 1024 / 1024 = 10.09M。
1.3时间基
-
time_base 是用来度量时间的,比如 time_base = {1,40}, 它的意思是将 1 秒分成 40 段,那么每段就是 1/40 秒,在 FFmpeg 中函数 av_q2d(time_base) 就是用来计算一段的时间的,计算结果就是 1/40 秒。比如一个视频中某一帧的 pts 是 800,也就是说有 800 段,那么它表示多少秒呢,pts av_q2d(time_base)=800(1/40)=20s,也就是说要在第 20 秒的时候播放这一帧 时间基的转换。不同格式时间基的不同。
-
PTS 是渲染用的时间戳。DTS 是解码时间戳。 音频的 PTS:以 AAC 音频为例,一个 AAC 原始帧包含一段时间内1024个采样及相关数据,也就是说一帧有 1024 个样本,如果采样率为 44.1kHz ( 1 秒采集 44100 个样本),所以 aac 音频 1 秒有 44100/1024 帧,每一帧的持续时间是 1024/44100 秒,由此可以计算出每一帧的 pts。
-
转换公式
timestamp(秒) = pts * av_q2d(st->time_base)//计算该帧在视频音频中的位置 time(秒) = st->duration * av_q2d(st->time_base)//计算视频音频中的长度 st 为AVStream流指针 时间基转换公式 timestamp(ffmpeg内部时间戳) = AV_TIME_BASE * time(秒) time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg内部时间戳)//timestamp就算是PTS/DTS
2、环境配置
2.1相关下载
进入官网 分别下载 Dev 和 Shared 压缩包。下载注意平台的选择对