1、基本概念
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了领先的音/视频编码库libavcodec等。
libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;
libavcodec:用于各种类型声音/图像编解码;
libavutil:包含一些公共的工具函数;
libswscale:用于视频场景比例缩放、色彩映射转换;
libpostproc:用于后期效果处理;
ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;
ffsever:一个 HTTP 多媒体即时广播串流服务器;
ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;
2、YUV各种格式的区别
简单来说,我们看到的图像颜色信息也可以作为模拟量来采样,图像颜色信息分为两个部分,一是亮度,一个是色度,色度又用两个分量来表示,这两个分量往往成对,且是一样的值。图像颜色信息的采样很特别,需要追行扫描,即追行扫描每个点的亮度和色度信息。上面的X:Y:Z,可以理解为扫描频率。
4:4:4 每行中亮度、色度U分量、色度V分量的采样频率一致,也就是采样点数一样多。
4:2:2 每行中亮度采样频率是色度(包括U分量和V分量)的两倍,即亮度每采样4个点,U分量和V分量采样2个点。
4:2:0 亮度依然是每行采样,而色度(包括U分量和V分量)则是隔行采样,同时相对每行采样来说,亮度采样频率是色度的两倍,但总体来说亮度采样频率是色度采样的四倍(隔行采样的原因),所以4:2:0 按上面的比例关系来说应该是4:1:1。
理清了上面的关系后,就可以解决我的一个问题。
我使用了V4L2驱动USB摄像头,通过相关函数知道了购买的摄像头支持两种格式输出,MJPEG和YUV422格式,但我还是不确定它输出的是YUV422格式还是YUV420格式,现在就可以通过每一帧图像数据的大小来判断到底是哪种格式了。设置的图像大小是640*480.
如果是YUV422输出,那么图片大小为640*480+320*480+320*480 = 614400
如果是YUV420输出,那么图片大小为640*480+320*240+320*240 = 460800
3、YUV422转YUV420
查看了几个例子,要想利用ffmpeg将YUV图像转换为h264视频,都需要将YUV422格式转为YUV420格式(如果摄像头出来的视频格式为YUV422的情况)。
下面这个github例子中有YUV422转YUV320的代码。
暂时抄这里的代码:https://github.com/jok886/ios/blob/6a50429e47be79fb73a808b2fec01c678c37e7bb/视频编解码/iOS视频软编码