视频编解码基本知识

视频编解码流程

视频编解码基本知识_第1张图片
具体见>http://blog.csdn.net/leixiaohua1020/article/details/18893769

这里结合项目实例来展开。
项目简单介绍:uvc摄像头采集mjpeg格式视频,经ffmpeg转码为h264保存到本地。

视频采集

常用的uvc摄像头采集格式有:yuv422、mjpeg等,分辨率越高,图片越清晰,帧率越高,视频越流畅(帧率25或30就够了,由于人眼会保留图像1/24s,所以更高的分辨率,效果并不会提高),但是代价是文件变大,或码流变大。

视频传输或保存(编码)

主要考虑的是文件或码流大小。由于人眼的极限,相邻帧信息冗余,采用某种算法来降低码流成为可能,主要编码格式有mjpeg、h264、h265。这里使用的是h264。
h264有专用的软件和硬件编解码器。这里没有硬件编码器。而常用的软件编码器是x264,使用开源软件是ffmpeg(1. ffmepg是一个开源、功能强大的工具,可以作为内核视频播放器,视频转码工具. 2. ffmpeg是一个编解码库,功能丰富,其自带H.264解码功能,但是要实现H.264编码需要集成X264将其作为编码器。)
下面是软件h264编解码效率对比
解码速度:ffmpeg > IPP simple player > x264 decoder > t264 decoder > jm86 decoder
以ffmpeg的编码速度为基准,假设为100fps,则:
IPP simple player:90fps
x264 decoder:50fps
t264 decoder:30fps
jm86 decoder:3fps
具体见http://blog.csdn.net/lqhed/article/details/51812301
h264编解码会占用大量的内存和cpu资源,因此硬件编码器,cpu处理器,内存资源变得很重要。

播放(解码、数据转换)

图像处理基本都是基于rgb数据。以h264为例,解码数据为yuv420p,需要进行yuv420p–>rgb转换,而rgb数据有真彩:rgb24,rgb32,非真彩:rgb16等(根据lcd驱动决定转换格式,linux系统fbset查看底层rgb模式)
yuv和rgb互转:

Y = 0.299 R + 0.587 G + 0.114 B
U = - 0.1687 R - 0.3313 G + 0.5 B + 128
V = 0.5 R - 0.4187 G - 0.0813 B + 128
反过来,RGB 也可以直接从YUV (256级别) 计算:cr(u),cb(v)。
R = Y + 1.402 (Cr-128)
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)

而浮点数运算效率很低,也常采用查表法,以空间换时间,使用neon也能提高转换效率,因为neon是simd,一个时钟周期可以从内存读取全部操作数。
当然第三方软件经过算法优化,效率会很大提高,下面是第三方软件效率对比:

转换效率分析
测试序列:1920*1080
测试环境:OpenCV2.4.8, FFmpeg2.0, YUV2RGB v0.03

Method Time(ms)
YV12ToBGR24_Native 83.7263
YV12ToBGR24_Table 54.2376
YV12ToBGR24_OpenCV 26.0529
YV12ToBGR24_FFmpeg 3.41499
YV12ToBGR24_Pinknoise 14.1215

由上述表格可以看出,基于FFmpeg的格式转换效率最高,而这里使用ffmepg转换。
具体见:http://blog.csdn.net/lg1259156776/article/details/53071961

你可能感兴趣的:(视频采集,视频,摄像头,ffmpeg)