系列文章:
- FFmpeg入门 - 视频播放
- FFmpeg入门 - rtmp推流
- FFmpeg入门 - Android移植
- FFmpeg入门 - 格式转换
音视频最好从可以大概直接看到东西,也更加贴近用户的播放开始学起.
音视频编解码基础
我们可以通过http、rtmp大概本地的视频文件去播放视频。这里的"视频"现实上指的是mp4、avi这种既有音频也有视频的文件格式。
如许的视频文件大概会有多条轨道比方视频轨道、音频轨道、字幕轨道等.
有些格式限定比力多,比方AVI视频轨道只能有一条,音频轨道也只能有一条.
而有些格式则比力机动,比方OGG视频的视频、音频轨道都能有多条.
像音频、视频这种数据量很大的轨道,上面的数据现实上都是通过压缩的。
视频轨道上大概是H264、H256如许压缩过的图像数据,通过解码可以还原成YUV、RGB等格式的图像数据。
音频轨道上大概是MP3、AAC如许压缩过的的音频数据,通过解码可以还原成PCM的音频裸流。
现实上使用ffmpeg去播放视频也就是根据文件的格式一步步还原出图像数据交给体现装备体现、还原出音频数据交给音频装备播放:
ffmpeg简朴入门
相识了视频的播放流程之后我们来做一个简朴的播放器现实入门一下ffmpeg。由于这篇博客是入门教程,这个播放器功能会举行简化:
- 使用ffmpeg 4.4.2版本 - 4.x的版本被使用的比力广泛,而且最新的5.x版本资料比力少
- 只解码一个视频轨道的画面举行播放 - 不须要思量音视频同步的标题
- 使用SDL2在主线程解码 - 不须要思量多线程同步标题
- 使用源码+Makefile构建 - 在MAC和Ubuntu上验证过,Windows的同砚须要本身创建下vs的工程了
使用ffmpeg去解码大概有下面的几个步调和关键函数,各人可以和上面的流程图对应一下:
剖析文件流(解协媾息争封装)
- avformat_open_input : 可以打开File、RTMP等协议的数据流,并且读取文件头剖析出视频信息,如剖析出各个轨道和时长等
- avformat_find_stream_info : 对于没有文件头的格式如MPEG大概H264裸流等,可以通过这个函数剖析前几帧得到视频的信息
创建各个轨道的解码器(分流)
- avcodec_find_decoder: 查找对应的解码器
- avcodec_alloc_context3: 创建解码器上下文
- avcodec_parameters_to_context: 设置解码所须要的参数
- avcodec_open2: 打开解码器
使用对应的解码器解码各个轨道(解码)
- av_read_frame: 从视频流读取视频数据包
- avcodec_send_packet: 发送视频数据包给解码器解码
- avcodec_receive_frame: 从解码器读取解码后的帧数据
为了几种精力在音视频部分,我拆分出了专门举行解码的VideoDecoder类和专门举行画面体现的SdlWindow类,各人重要关注VideoDecoder部分即可。
视频流剖析
由于现实解码前的剖析文件流和创建解码器代码比力固定化,我直接将代码贴出来,各人大概跟着注释看下每个步调的寄义: |