视频GPU硬解码方案对比

声明:文章仅作知识整理、分享,如有侵权请联系作者删除博文,谢谢!

        实时视频处理中,紧靠CPU进行视频解码速度慢/占用CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈。需要进行GPU解码高清视频,降低解码所占用CPU资源,加速解码过程。

以下来自网络测试结果:【视频解码性能对比】opencv + cuvid + gpu vs. ffmpeg + cpu - ahfuzhang - 博客园

        视频大小:1168856 字节 画面尺寸:480*848 帧数:275 opencv + cuvid + tesla P4, 解码性能:1426.84 fps ffmpeg 4.0 API + [Intel(R) Xeon(R) Gold 6133 CPU @ 2.50GHz] ,解码性能:206.46 fps GPU解码是CPU解码的6.9倍。

注意:

        1. GPU解码丢了两帧;

        2. 如果使用cuda stream流水线技术,理论上性能还会再提升。

        大部分摘抄自:【GPU编解码】GPU硬解码---CUVID - 一点心青 - 博客园

1、OpenCV中的硬解码

        OpenCV2.4.6之后,已实现利用GPU进行读取视频,由cv::gpu::VideoReader_GPU完成。阅读OpenCV中VideoReader_GPU源码,可发现其底层实现是借助于视频解码库CUVID。其示例程序如下。

int main(int argc, const char* argv[])
{
    if (argc != 2)
        return -1;
    const std::string fname(argv[1]);
    cv::namedWindow("GPU", cv::WINDOW_OPENGL);
    cv::gpu::setGlDevice();

    cv::gpu::GpuMat d_frame;
    cv::gpu::VideoReader_GPU d_reader(fname);
    d_reader.dumpFormat(std::cout);
    for (;;)
    {
        if (!d_reader.read(d_frame))
            break;
        //....
        cv::imshow("GPU", d_frame);
        if (cv::waitKey(3) > 0)
            break;
    }
    return 0;
}

2、视频解码库CUVID

CUVID是基于CUDA的视频解码库,利用CUVID进行解码,主要包括以下四个步骤:

        1)解析视频数据文件

        2)在GPU端解码

        3)转换解码后的数据(YUV420、NV12 ---> RGBA)

        4)将RGBA数据显示出来

        下图为利用CUVID解码的伪代码示意图,其中VideoSource用来解析视频数据文件,VideoParser用来解码数据。

        VideoSource的回调函数HandleVideoData(),当VideoSource的状态设置为Started时,开始解析视频文件,并创建VideoParser,解码数据。

VideoParser的回调函数:

        HandleVideoSequence() 创建解码器或重设解码器

        HandlePictureDecode() 解码每帧视频数据

        HandlePictureDisplay() 转换,处理,显示解码后的数据

        OpenCV中VideoReader_GPU可以方便地利用GPU读取视频文件,加速解码过程,但OpenCV中VideoReader_GPU无法读取rtsp视频流数据。

        这是因为CUVID中CuvideoSource不支持rtsp视频流数据,不能由rtsp地址创建VideoSource。

3、jetson-TX1/TX2上原生CUDA SAMPLE实现GPU解码

        demo路径:/usr/src/jetson_multimedia_api/samples

        每个SAMPLE实现一独立的功能。底层仍是CUVID实现,因为CUVID中CuvideoSource不支持rtsp视频流数据,所以,rtsp的网络流媒体文件需先按流协议解码,之后在对码流硬解码。

4、CUVID解码rtsp视频流

基本思路:跳过VideoSource模块,利用其他方式解析视频数据文件。

基本步骤:

        1.利用FFmpeg解析rtsp视频流

        2.创建VideoParser

        3.利用FFmpeg读取数据包(AVpacket)

        4.将数据包传输到VideoParser(AVpacket ---> CUVIDSOURCEDATAPACKET)

        5.VideoParser解码数据包

其示例伪代码如下图所示:

5、FFPEG+CUVID+OPENCV主流做法

ffmpeg专题——ffmpeg实现视频播放,存储,H264编、解码,RTSP推流,RTSP解码 - 知乎

该专栏主要涉及ffmpeg的视频编解码操作。由浅入深,完成ffmpeg的学习。包括以下内容:

1、ffmpeg环境搭建

2、ffmpeg实现将视频存储为图片jpg

3、ffmpeg播放视频

4、FFMPEG+SDL2 实现播放器功能

5、ffmpeg解码H264文件并实时播放

6、ffmpeg将视频编码为H264格式

7、ffmpeg实现H264压缩并且推流至RTSP

8、FFMPEG实现RTSP中H264数据流解码 并且实时播放

里面提供源码可以直接下载运行!

https://edu.csdn.net/lecturer/4645?spm=1002.2001.3001.4144

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jingbo1801

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值