视频软编码与硬编码
视频软编码与硬编码
在Android系统下视频编码有硬编和软编两种方式。顾名思义,硬编是通过手机提供的硬件模块进行编码;软编就是通过软件程序进行编码。硬编的好处是编码快,不占用CPU资源。缺点是Android机型比较多,坑也比较多。软编正好与硬编相反,优点是无论什么机型都一样处理。缺点则是占用大量CPU资源。
硬编码、软编码有什么区别,归纳如下。
一、软编码和硬编码如何区分
软编码:使用CPU进行编码
硬编码:使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等
二、软编码和硬编码比较
软编码:实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点。
硬编码:性能高,低码率下通常质量低于硬编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码。
三、目前的主流GPU加速平台
Intel、AMD、NVIDIA
四、目前主流的GPU平台开发框架
CUDA:NVIDIA的封闭编程框架,通过框架可以调用GPU计算资源。
AMD APP:AMD为自己的GPU提出的一套通用并行编程框架,标准开放,通过在CPU、GPU同时支持OpenCL框架,进行计算力融合。
OpenCL:开放计算语言,为异构平台编写程序的该框架,异构平台可包含CPU、GPU以及其他计算处理器,目标是使相同的运算能支持不同平台硬件加速。
Inel QuickSync:集成于Intel显卡中的专用视频编解码模块。
Intel视频硬编码
Intel二代Core i3/i5/i7处理器,支持了Intel Quick Sync技术(英特尔高速视频同步技术),利用CPU进行硬件编码,能大幅度提高编码效率,理想情况相比传统的软件编码提高N倍,同时也远远超过NVIDIA CUDA或者AMD Stream显卡硬件编码的速度。英特尔高速视频同步技术支持AVC(H.264)、VC1、MPEG2三种主流的编码格式,基本主流手持设备都支持这些编码,所以说这项技术对于常“压片”的用户来说,是非常实用的。
Intel提供了开发包media-sdk(http://software.intel.com/en-us/vcsource/tools/media-sdk),包含一些头文件,库文件跟例子,其中sample_encode用于开发硬编码。
例子的的编译需要C++编译器(http://software.intel.com/zh-cn/c-compilers/),编译器可以集成到vc2005以上的版本。
Android下视频H264编码
在移动端通过Camera采集到视频数据后,不会直接发送出去。因为采集后的视频数据量非常大,比如 1280x720 分辨率的一帧数据,就有可能达到6M大小(码率越高,图像越清晰)。这6M数据如果送到网上传输,会给网络带来非常大的负担。
另外,人眼对图像的识别是有限的。拿手机屏幕来说,1K屏与2K屏对于人眼来说是看不出来区别的,视频也是同样的道理。视频的压缩编码技术,通过对视频的有损压缩,减少数据大小。
视频缩码最常用的是 H264,H265,VP8, VP9等。
编码结构与方式
下图是视频编码的结构,结构很清楚。
编码结构图
介绍一下硬件编码。
如何获取Camera中采集到的数据
从Camera获取视频数据有两种方式,一种是通过向Camera设置预览Callback来读取原始数据;另一种高效的方式是通过MediaCodec的Surface获取数据。而第二种更高效,更灵活。很容易从网上找到第一种获取数据的方式,这里介绍第二种方式。
从Camera获取数据的基本方法如下:
1. 创建 EGL 环境(如果使用 GLSurfaceView则可省略该步骤)。
2. 构建 OpenGL ES程序,将原始数据渲染到Surface中。
3. 生成纹理,并打开Camera预览。
4. 创建编码器,将编码器中的Surface与EGL关联。
5. Camera捕获数据后,调用 EGL的swapBuffer方法,就可以拿到数据了。
视频编码
视频编码,就是一个死循环不断的从编码器中查询编码状态。如果编码状态大于0, 则说明已经有编好的数据了。
参考连接:
https://cloud.tencent.com/developer/article/1608313?from=information.detail.linux%E4%B8%8B%E7%9A%84h264%E7%A1%AC%E7%BC%96%E7%A0%81
http://blog.csdn.net/charleslei/article/details/44599041