FFmpeg编解码技术被广泛应用于直播或点播应用,网上有很多相关的资料,这些资料有的其实已经很详尽了,但是对于一些刚入行的小白来说看起来比较费时。近来有空,我就整合一下网上的资料,结合自己的经验,给大家做一个简单易懂的介绍。
首先我们来看一下编解码中常用到的结构体:
AVFormatContext:贯穿全局的基本结构体。主要用于音视频格式方面的处理。
AVStream:音频流信息
AVCodecContext:描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息
AVFrame:存储非压缩的数据(视频对应RGB/YUV像素数据,音频对应PCM采样数据)
AVPacket:存储压缩数据(视频对应H.264等码流数据,音频对应AAC/MP3等码流数据)
AVPicture:保存RGB图片信息
下面讲一下如何进行拉流并且进行解码
首先,弄清楚整个流程,有助于我们理解,大致流程如下
FFmpeg解码流程
//注册所有的编解码器
avcodec_register_all();
//初始化格式及传输协议
av_register_all();
//初始化全局网络组件
avformat_network_init();
//根据URL打开一个输入流或local视频文件并读取头部信息
avformat_open_input()
//检索视频流信息
avformat_find_stream_info()
//获取视频编码格式
avcodec_find_decoder()
//根据上面的视频格式打开编解码器
avcodec_open2()
读取数据
av_read_frame()
//将该帧解码,将h264(packet)解码成YUV(pFrame)
avcodec_decode_video2()
//yuv420p 转换成 rgb24
sws_scale()
解码的流程基本就这样,看完上文后,应该对解码有一定的了解。我根据自己的经验及网上资料写了个DEMO。项目里面对代码的注释非常的详细,特别容易理解。