SkeyeARS 8K视频播放器软解码&硬解码功能实现

发布于:2023-03-17 ⋅ 阅读:(426) ⋅ 点赞:(0)

首先,我们简单了解一下软解码&硬解码:

  • 软解码:由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 解码需要使用 cudanvcuvid 两个库,使用的时候要加载它们,并使用其中一些接口。

关于SkeyeARS

SkeyeARS全景AR增强监视系统, 是视开科技开发的一款基于宽场景多路视频无缝拼接、视频实时增强、监视目标增强显示、目标自动跟踪、视频存储回放、远程数据传输和多通道全景视频同步显示等功能的综合视频AR增强监视系统,广泛应用于智慧交通、智慧城市、智慧机场等大场景智能监控领域。

详细说明:http://www.openskeye.cn/web/product/ars


网站公告

今日签到

点亮在社区的每一天
去签到