基于NVIDIA显卡的硬编解码

基于NVIDIA显卡的硬编解码的一点心得 (完结) 1.硬解码软编码方法:大体流程,先用ffmpeg来读取视频文件的包,接着开启两个线程,一个用于硬解码,一个用于软编码,然后将读取的包传给解码器,编码出的frame download到内存,然后做scale处理,将scale后的帧和编码参数一起传给编码函数,最终生成pkt包,将其写入文件。由于CUVID中CuvideoSource不支持rtsp视频流数据,不能由rtsp地址创建VideoSource 阅读详情



1.硬解码软编码方法:大体流程,先用ffmpeg来读取视频文件的包,接着开启两个线程,一个用于硬解码,一个用于软编码,然后将读取的包传给解码器,编码出的frame download到内存,然后做scale处理,将scale后的帧和编码参数一起传给编码函数,最终生成pkt包,将其写入文件。由于CUVID中CuvideoSource不支持rtsp视频流数据,不能由rtsp地址创建VideoSource,所以用ffmpeg来解析rtsp视频流。
解码与编码之间维护一个队列,队列长度定为20(因为解码速度快于编码速度,数据被覆盖,丢帧)。

2.软解码软编码方法:目前只是用ffmpeg自带的sample功能,没有经过设计,暂时应用sample进行测试。

3.编解码结构
硬解软编:   read(ffmpeg) ---> decoder(NVIDIA) ---> |  Queue(20)  | ---> encoder(ffmpeg)
软解软编:   read(ffmpeg) ---> decoder(ffmpeg) ---> encoder(ffmpeg)

硬解软编基本步骤:
a.利用FFmpeg解析rtsp视频流
b.创建VideoParser
c.利用FFmpeg读取数据包(AVpacket)
d.将数据包传输到VideoParser(AVpacket ---> CUVIDSOURCEDATAPACKET)
e.VideoParser解码数据包

伪代码如下图所示
#include <nvcuvid.h>
#include <cuviddec.h>

//Called when the decoder encounters a video format change or initial sequence header
int CUDAAPI HandleVideoSequence(void * UserData, CUVIDEOFORMAT* pFormat)
{
    cuvidCreateDecoder();
}
//Called by the video parser to decode a single picture
int CUDAAPI HandlePictureDecode(void *UserData, CUVIDPICPARAMS* pPicParams)
{
    cuvidDecodePicture();
}
//Called by the video parser to display a video frame
int CUDAAPI HandlePicutureDisplay(void *UserData, CUVIDPARSERDISPINFO *pPicParams)
{
    cuvidMapVideoFrame();
    cuvidUnmapVideoFrame();
    download_frame(frame);
    queue.enqueue(frame);
}
// new thread read loop, read all frame
void read_loop()
{
    while(av_read_frame(ifmt_ctx,pkt) > 0)
    {
        CUVIDSOURCEDATAPACKET pkt;
        pkt.flags = 0;
        pkt.payload_size = pkt.size;
        pkt.payload = pkt.data;
        cuvidParseVideoData(cuParser, &pkt);
    }
}
//encode thread
void encode_frame()
{
    queue.dequeue(temp_frame);
    scale_frame(temp_frame);
    encode(temp_frame);
    write_to_file();
}
int main()
{
    //set video parser paramters. create video parser
    //decode frame packet
    cuvidCreateVideoParser();
    //FFmpeg open rstp strea, read packet data
    ...
    thread(read_loop);
    thread(encode_frame);
    //destroy resources
    cuvidDestroyDecoder();
    cuvidDestroyVideoParser();
}

4.目前测试的多路是通过开启多个线程来进行的,下面是测试结果:
               
 路数            硬解软编                          软解软编 
          Fps   CPU(%) MEM(%)    Fps  CPU(%) MEM(%)
  1      362      80.8         1.3         344   86.1             0.7
  5        81      92.5     1.3*5            72   92.5         0.7*5
 10    40.5     92.5   1.3*10            36   92.5       0.7*10
 20    20.6     92.5   1.3*20            18   92.5       0.7*20
注释:上面CPU占用率92.5%,CPU空闲都是0,基本CPU在满负荷运行。
需要说明的是,现在测试视频是电影的一个片段10000帧数据,可能运动比较多,如果变成直播可能运动较少,编码会更快。
当硬解码软编码时,如果帧率25fps的时候支持16路,当软解码软编码时,如果帧率25fps的时候支持14路。

5.测试环境以及参数
CPU:  Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz 
MEM:  8G
OS:   ubuntu 12.04
Video:tears640x480p24_1000.y4m(10000frames,rate=1000)
Param:Fps:25,gop:10,bframe:1,rate:40,level 3.1





链接:http://blog.youkuaiyun.com/u010264950/article/details/40888517




freeswitch媒体协商的三种配置方案 概述 在企业级VOIP通信中,语音质量是重要的关注点,而语音质量的好坏和媒体编解码有重要的关系。 freeswitch作为一款免费开源的软交换平台,支持多种不同的编解码格式,具体详情本文不多描述。 而不同的终端也会支持多种不同的编解码格式,在呼叫创建过程中就需要编解码的协商。 编解码的协商过程是很容易让人困惑的,即使是对SIP和SDP很熟悉的人也一样。 那么,freeswitch在软交换的过程中,是如何控制A/B路之间媒体的协商过程?如何配置出我们想要的协商方案?不同方案都有什么优缺点?... 阅读详情

相关推荐

NVIDIA显卡对视频硬编解码支持方数的说明

NVENC Support Matrix BOARD FAMILY CHIP # OF CHIPS # OF NVENC /CHIP Total # of NVENC Max # of concurrent sessions H.264 (AVCHD) YUV 4:2:0 H.264 (AVCHD) YUV 4:4:4 H.264 (A...

风清扬的博客 2万+

Nvidia硬解码总结

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33775572的博客 5293

英伟达硬件编码NVENC资源整理

英伟达硬件编码NVENC资源整理

曹健的博客 3875

基于NVIDIA显卡的硬编解码的一点心得

前提:小编只是个研究了2个月的NVIDIA硬b

Fighting for freedom! 1万+

避坑指南:Ubuntu下Intel显卡GStreamer硬编解码插件安装,我踩过的雷你别再踩

本文详细介绍了在Ubuntu系统中为Intel显卡配置GStreamer硬编解码插件的避坑指南,包括驱动选择、环境变量配置、依赖安装及性能优化等关键步骤。特别针对i965和iHD驱动的差异提供实用建议,帮助开发者高效解决常见问题,提升多媒体处理效率。

weixin_33725515的博客 193

FFmpeg+NVIDIA硬编解码实战:从驱动安装到CUDA加速全流程指南

本文详细介绍了如何通过FFmpeg和NVIDIA硬件加速实现高效视频编解码的全流程,包括驱动安装、CUDA配置、NV Codec Headers安装以及FFmpeg编译优化。通过CUDA加速,可显著提升视频处理效率,适用于4K视频转码、直播推流等高性能场景。

weixin_28327051的博客 116

NVIDIA显卡H.264/H.265硬编解码参考文档

NVIDIA显卡H.264/H.265硬编解码参考文档 去发现同类优质开源项目:https://gitcode.com/ 此资源文件为NVIDIA显卡H.264/H.265硬编解码的详细参考文档。本文档旨在为开发者提供详尽的指导,帮助理解和运用NVIDIA显卡的硬编解码功能。 文档内容涵盖了H.264和H.265编解码的基本概念、技术特点、API使用方法以及性能优化策略等,旨在帮助开发者充分利用N...

gitblog_06764的博客 339

Qt之cuda硬解码

一.效果 下图是CUDA解码后,显存数据直接用D3D9渲染后的效果和CPU占用情况。 测试视频:盛世中华(封装格式webm,分辨率4K) CPU:Intel Core i7-8700 3.20GHz GPU:NVIDIA GeForce GTX 1050 与dxva2硬解码做个相比,CUDA硬解码CPU占用更低,GPU占用则低得多。 二.windows开发环境搭建 1.安装CUDA Toolkit CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CU

草上爬的博客 5894

【并行计算与CUDA开发】基于NVIDIA显卡的硬编解码的一点心得 (完结)

原文:基于NVIDIA显卡的硬编解码的一点心得 (完结) 1.硬解码软编码方法:大体流程,先用ffmpeg来读取视频文件的包,接着开启两个线程,一个用于硬解码,一个用于软编码,然后将读取的包传给解码器,编码出的frame download到内存,然后做scale处理,将scale后的帧和编码参数一起传给编码函数,最终生成pkt包,将其写入文件。由于CUVID中CuvideoSource不支持

ZhangPY的专栏 3628

【ffmpeg+cuda实现硬编解码】

最近在搞一个项目,我需要向AI提供视频帧数,本来一开始摄像头是H.264的编码,我直接复制流推到AI层去推理,然后需要将事件回溯成30秒的视频截取。结果摄像头换成了HEVC编码,截取的视频不能在网页直接播放(需要JS实现调用硬解码)。一开始的方案是ffmpeg直接将HEVC转成H.264结果因为事务巨多CPU占用量过大,导致影响到了推理,因为本身选用的模型+杂七杂八的业务逻辑也要占用大量的CPU资源,所以经过研究把ffmpeg和nvcodec结合起来来平衡设备性能,算是解决了这个问题吧。这两个是前提条件,我

jiexijihe945的博客 7229

ffmpeg最简单方式支持nvidia硬编解码

因为工作内容的需要,之前写过一篇文章关于ffmpeg支持英伟达的硬编解码,那个方法比较适合定制化的ffmpeg编译,如果你仅仅使用ffmpeg进行硬件编解码的话,其实不需要这么麻烦。ffmpeg定制化编译支持cuda编解码1、同时需要ffmpeg和nvidia的支持,不同的版本可能效果不一样。2、也有可能ffmpeg早期版本就已经支持nvidia了,只不过我用的最低Ubuntu版本是18.04,所以没法确认。

jiexijihe945的博客 4309

NVIDIA显卡硬编码调研

NVIDIA显卡硬编码调研 题目描述 NVIDIA硬编解码有两种:一种是由ffmpeg二次封装的,面向一般用户;另一种是nvidia原生SDK,面向开发者。 Video Encode and Decode GPU Support Matrix | NVIDIA GPU硬编解码支持情况。一般显卡只支持2路硬编解码 NVIDIA VIDEO CODEC SDK | NVIDIA GPU硬编解码SD...

Liber-coder的博客 2884

kanbai_v76.zip_LDPC fourier_LDPC码识别_语音编解码

ldpc码的编解码实现,分数阶傅里叶变换计算方面,完整的基于HMM的语音识别系统。

突破硬件性能限制:Moonlight-Switch让Switch设备实现PC游戏串流功能

还在为Switch的硬件性能不足而无法体验3A大作发愁吗?Moonlight-Switch作为一款专为任天堂Switch平台优化的开源游戏串流工具,通过先进的视频编码技术和智能控制方案,让你能够在掌机上畅玩PC端的各类大型游戏,彻底打破硬件性能的束缚,为你带来全新的游戏体验。 ## 核心优势场景下的多平台串流解决方案 Moonlight-Switch最核心的价值在于其强大的跨平台游戏串流能力。

gitblog_00836的博客 341

利用netmq在相机应用于unity之间传输图像数据

Unity工业相机接入方案解析 本文探讨了在Unity中接入不同品牌工业相机的技术方案。研究发现: Basler相机可直接调用官方DLL(pylonc.net.dll)实现接入 海康和大恒相机因驱动DLL依赖C++组件,无法直接调用 解决方案:通过独立进程(相机应用程序)与Unity进行通信,采用NetMQ实现图像数据传输 技术实现要点: 相机端:使用PublisherSocket发布JPEG图像帧 Unity端:通过SubscriberSocket订阅图像数据 优化:设置高水位线控制缓存帧数,避免数据堆积

weixin_46450859的博客 417

UE4虚拟现实实习总结---蓝图中的常用交互事件|人物行走|物体移动|动态触发|材质改变

这周是ue4实习周,老师给我们的任务就是基于中学物理和化学实验的虚拟实验室,要有交互事件,后期可以链接vr手柄进行操作。 但是实习开始老师影都没了,全靠自己学习。感觉自己学习了不少东西,这里就来总结一下!顺便感叹一下,ue4好玩又强大! 以下主要介绍蓝图中的几种交互事件1.新建游戏角色并且进行角色行走旋转,2.如何控制物体移动旋转,3.如何控制物体材质动态变化 大家可以举一反三,作出更好的作品 1.新建游戏角色并且进行角色行走旋转 步骤 在刚刚新建的文件夹中鼠标右击新建蓝图类,然后分别创建以下:chara

weixin_43902063的博客 6120

Freeswtich 录像支持NVIDIA硬编解码方案实施过程

背景: FS一路对讲/会议(720P),开启录像后,CPU占用率达到20%,如果对讲超过10路,CPU将超负荷。为了降低CPU,利用显卡进行硬编解码。 分析原因: Fs 默认使用libx264对视频进行h264软编解码,开启录像后: 1.录像线程使用软编码将视频帧生成录像文件。 2.视频桥线程,由于开启了通道(bugs),会将视频帧软编码后,再发送给其他终端。 不开启录像时,FS不会进行编解码,开启录像后,由于要进行视频融合,进行了2次编码,导致CPU飙升。 如何解决?...

1156

Openclaw Onboarding向导全攻略——如何配置你的第一个AI助手

很多新手在成功运行 `openclaw --version` 后,面对黑底白字的终端就陷入了迷茫:“安装好了,然后呢?” 本篇我们就彻底解决这个问题,带你完整走完 `openclaw onboard` 交互式初始化配置向导的每一步,从“安装完成”到“真正能用”,只差这一个向导的距离。 本文为2026年3月最新版,适配OpenClaw v2026.2.x 稳定版,所有步骤均经过实测验证,可直接落地。

夏日清风 1917
上一篇: 负数除法与正数除法原理
下一篇: 二分查找法的递归和非递归实现
tkp2014
博客等级 码龄12年 137粉丝 241原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值