前言:不管用哪种计算机语言,思路总是一样的,主要关注其解码部分,渲染图像的方式有很多种,看自己喜欢。
基本知识:
FFmpeg 库简介: avcodec:音视频编解码核心库;avformat:音视频容器格式的封装和解析; swscal:图像格式转换的模块;swresampel:音频重采样;
avutil:核心工具库; avfilter:音视频滤镜库 如视频加水印,音频变声;avdevice:输入输出设备库,提供设备数据的输入与输出
FFmpeg播放流程:通常情况下,视频文件如 MP4,MKV、FLV 等都属于封装格式,就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。当我们播放一个媒体文件时,通常需要经过以下几个步骤:
可以看到这个视频播放器的实现需要涉及到以下内容:
- 解封装(Demuxing):就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。例如,FLV 格式的数据,经过解封装操作后,输出 H.264 编码的视频码流和 AAC 编码的音频码流。
- 软硬件解码(Decode):就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。通过解码,将压缩编码的视频数据 H.264,MPEG2 解码成为非压缩的颜色数据,例如 YUV 等等;将压缩编码的音频数据 AAC,MP3 解码成为非压缩的音频抽样数据,例如 PCM 数据。解码分为硬编码和软编码。
- 像素格式转换:将 YUV 数据格式转换成 RGB 数据格式。
- 重采样:对音频重新采样。
- dts/pts:dts 是解码的时间戳,而 pts 是显示的时间戳。pts 用于获取当前播放进度。进度条移动需要用到
av_seek_frame
函数。 - 音视频同步:就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的音频和视频数据,并将音视频频数据送至系统的显卡和声卡播放出来(Render)。
使用到的FFmpeg API说明:
av_register_all(): 注册 FFmpeg 的所有组件,在 4.0 版本以后已经被弃用,所以实际不加也可以正常编解码音视频
avformat_alloc_context():用于初始化 AVFormatContext 对象。其原型:AVFormatContext *avformat_alloc_context(void)。因为AVFormatContext 必须初始化为 NULL 或者用avformat_alloc_context()进行初始化
avformat_open_input():打开媒体文件,并获得解封装上下文。其原型:int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options)
ps
:AVFormatContext 双重指针,函数调用成功之后将解封装上下文赋值给 ps。url
:可以是 rtsp、http 网络流地址,或者本地视频文件路径。fmt
:指定输入音视频的封装格式,一般情况下可以设置为 nullptr,则会自动探索。fmt
:强制指定 AVFormatContext 的成员 AVInputFormat,即输入音视频的封装格式。一般情况下可以设置为 NULL,这样会自动探索 AVInputFormat。options
:附加的一些选项,一般情况下可以设置为 nullptr,但有时候播放 rtsp 时需要设置下。
标签:封装,ffmpeg,AVFormatContext,解码,音视频,avformat,音频 From: https://www.cnblogs.com/fxw1/p/17229792.html