【并行计算与CUDA开发】基于NVIDIA显卡的硬编解码的一点心得 (完结)
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
【并行计算与CUDA开发】基于NVIDIA显卡的硬编解码的一点心得 (完结)的更多相关文章
- 【并行计算与CUDA开发】英伟达硬件加速编解码
硬件加速 并行计算 OpenCL OpenCL API VS SDK 英伟达硬件编解码方案 基于 OpenCL 的 API 自己写一个编解码器 使用 SDK 中的编解码接口 使用编码器对于 OpenC ...
- 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---DXVA
前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...
- 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---CUVID
问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解 ...
- (中级篇 NettyNIO编解码开发)第八章-Google Protobuf 编解码-2
8.1.2 Protobuf编解码开发 Protobuf的类库使用比较简单,下面我们就通过对SubscrjbeReqProto进行编解码来介绍Protobuf的使用. 8-1 Protob ...
- (中级篇 NettyNIO编解码开发)第八章-Google Protobuf 编解码-1
Google的Protobuf在业界非常流行,很多商业项目选择Protobuf作为编解码框架,这里一起回顾一下Protobuf 的优点.(1)在谷歌内部长期使用,产品成熟度高:(2)跨语言,支持 ...
- 【并行计算-CUDA开发】 NVIDIA Jetson TX1
概述 NVIDIA Jetson TX1是计算机视觉系统的SoM(system-on-module)解决方案.它组合了最新的NVIDIAMaxwell GPU架构,其具有ARM Cortex-A57 ...
- 【ARM-Linux开发】【CUDA开发】NVIDIA TEGRA X1:LINUX驱动程序包多媒体用户指南
NVIDIA TEGRA X1:LINUX驱动程序包多媒体用户指南 转载请注明作者和出处:http://blog.csdn.net/u011475210 嵌入式平台:NVIDIA Jetson TX1 ...
- 【ARM-Linux开发】【CUDA开发】NVIDIA Jetson TX2 进阶:Nsight Eclipse Edition
嵌入式平台:NVIDIA Jetson TX2 嵌入式系统:Ubuntu16.04 虚拟机系统:Ubuntu14.04 一.NSight简介 Jetpack开发工具为人工智能提供了一整套软件架构,包括 ...
- 【计算机视觉】【并行计算与CUDA开发】GPU硬编码
一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. 1 int main(int arg ...
随机推荐
- vue.js 常用指令用法
v-if v-if指令可以完全根据表达式的值在DOM中生成或移除一个元素. 如果v-if表达式赋值为false,那么对应的元素就会从DOM中移除: 否则,对应元素的一个克隆将被重新插入DOM中,代码如 ...
- locale与C字符编码
ref: https://www.cnblogs.com/gatsby123/p/11150472.html Unicode 字符集 代码点 与编码表中的某个字符对应的代码值.在Unicode标准中, ...
- 【新词发现】基于SNS的文本数据挖掘、短语挖掘
互联网时代的社会语言学:基于SNS的文本数据挖掘 python实现 https://github.com/jtyoui/Jtyoui/tree/master/jtyoui/word 这是一个无监督训 ...
- Spring Boot教程(七)通过springboot 去创建和提交一个表单
创建工程 涉及了 web,加上spring-boot-starter-web和spring-boot-starter-thymeleaf的起步依赖. <dependencies> < ...
- Elasticsearch的java客户端JEST的操作
准备 把Elasticsearch安装好 安装百度上有很多资料. 导入必要的包 <parent> <groupId>org.springframework.boot</g ...
- fsLayuiPlugin附件上传使用说明
fsLayuiPlugin 是一个基于layui的快速开发插件,支持数据表格增删改查操作,提供通用的组件,通过配置html实现数据请求,减少前端js重复开发的工作. GitHub下载 码云下载 测试环 ...
- mysql数据库的还原及常见问题解决
例如:需要还原的数据库脚本文件为test.sql,脚本中已包含数据库的创建,test.sql所在目录为/home 1.常用source命令 进入mysql数据库控制台,如mysql -uroot -p ...
- getBoundingClientRect使用指南
getBoundingClientRect使用指南 author: @TiffanysBear 主要介绍getBoundingClientRect的基本属性,以及具体的使用场景和一些需要注意的问题. ...
- 感知机和BP神经网络
一.感知机 1.感知机的概念 感知机是用于二分类的线性分类模型,其输入是实例的特征向量,输出是实例的类别,类别取+1和-1二个值,+1代表正类,-1代表负类.感知机对应于输入空间(特征空间)中将实例分 ...
- 黑马vue---37-38、vue实例的生命周期
黑马vue---37-38.vue实例的生命周期 一.总结 一句话总结: created:实例已经在内存中创建OK,此时 data 和 methods 已经创建OK,此时还没有开始 编译模板 moun ...