首先,我们简单了解一下软解码&硬解码:
- 软解码:由CPU负责解码进行播放
优点:不受视频格式限制、画质可能略好于硬解
缺点:会占用过高的资源、对于高清视频可能没有硬解码流畅(主要看CPU的能力)。
就好比两个人一样,一个人有一个袋子,一个人只能用手,在拿东西的时候有袋子的肯定会省力一些,但是在个别情况下袋子不方便装的话可能需要手直接拿着。
- 硬解码:由使用非CPU进行解码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等来对高清视频进行解码工作,CPU占用率很低,画质效果比软解码略差一点,需要对播放器进行设置。
优点:播放流畅、低功耗
缺点:受视频格式限制、功耗大、画质可能没有软解码好
SKeyePlayerPro
直接支持软解和硬解。
只需开启视频流的时候传入不同参数即可,具体为 decodeType
参数:
LIB_EASYPLAYER_PRO_API int LIB_APICALL libEasyPlayerPro_StartPlayStream(PLAYER_HANDLE handle, int channelId, HWND hWnd,
EASYPRO_RENDER_FORMAT renderFormat, unsigned char decodeType=0/*0:软解 1:硬解*/);
因此,如果我们需要软解,则需传入 0,反之传入 1 即可。
关于软解,使用 FFmpeg 如下函数即可:
//创建ffmpeg codec,在ffmpeg中是根据codecid(aac,h264等注册的id)寻找合适的decoder,返回AVCodec对象
avcodec_find_decoder()
/*这函数创建decode的context,返回的codecContext包含解码器所需要的各种配置信息,比如
对于aac decode,context可以用来设置sample_rate,channels,profile等
对于h264 decode,context可以用来设置width,height等*/
avcodec_alloc_context3()
//用已经配置好的decoder的context,来configure解码器codec
avcodec_open2()
//初始化一个pkt用于接收待解码的数据,用demux输出的数据,填充pkt的data,设置pkt的flag(是否包含key frame等)
av_init_packet(AVPacket *pkt)()
//将填充满的pkt,发送给解码器
avcodec_send_packet()
//从解码器接收decode后的数据,填充到AVFrame中。
avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
而硬解,则需要借助 Nvidia:
//创建source,主要参数是设置视频文件路径和回调函数。source会去解析指定视频文件,并通过回调函数实现对视频数据的自定义处理。
cuvidCreateVideoSource()
//用来向parser塞数据,通过不断地塞h.264数据,parser会通过回调接口对解析出来的数据进行处理。
cuvidParseVideoData()
//该接口是用来创建decoder,通过设置一些解码参数,会返回一个decoder的句柄。这个句柄会在之后的解码接口中被使用。
cuvidCreateDecoder()
//该接口就是向解码器传递待解码的数据。需要说明一下,该接口是异步解码,不能通过该接口得到解码后的视频数据,它只是向解码器传数据而已。
cuvidDecodePicture()
Nvidia 解码需要使用 cuda
和 nvcuvid
两个库,使用的时候要加载它们,并使用其中一些接口。
关于SkeyeARS
SkeyeARS全景AR增强监视系统, 是视开科技开发的一款基于宽场景多路视频无缝拼接、视频实时增强、监视目标增强显示、目标自动跟踪、视频存储回放、远程数据传输和多通道全景视频同步显示等功能的综合视频AR增强监视系统,广泛应用于智慧交通、智慧城市、智慧机场等大场景智能监控领域。