首先,咱们简略理解一下软解码 & 硬解码:
- 软解码:由 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 加强监视系统,广泛应用于智慧交通、智慧城市、智慧机场等大场景智能监控畛域。
具体阐明:http://www.openskeye.cn/web/product/ars