原文:基于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显卡的硬编解码的一点心得 (完结)的更多相关文章

  1. 【并行计算与CUDA开发】英伟达硬件加速编解码

    硬件加速 并行计算 OpenCL OpenCL API VS SDK 英伟达硬件编解码方案 基于 OpenCL 的 API 自己写一个编解码器 使用 SDK 中的编解码接口 使用编码器对于 OpenC ...

  2. 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---DXVA

    前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...

  3. 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---CUVID

    问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解 ...

  4. (中级篇 NettyNIO编解码开发)第八章-Google Protobuf 编解码-2

    8.1.2    Protobuf编解码开发 Protobuf的类库使用比较简单,下面我们就通过对SubscrjbeReqProto进行编解码来介绍Protobuf的使用. 8-1    Protob ...

  5. (中级篇 NettyNIO编解码开发)第八章-Google Protobuf 编解码-1

    Google的Protobuf在业界非常流行,很多商业项目选择Protobuf作为编解码框架,这里一起回顾一下Protobuf    的优点.(1)在谷歌内部长期使用,产品成熟度高:(2)跨语言,支持 ...

  6. 【并行计算-CUDA开发】 NVIDIA Jetson TX1

    概述 NVIDIA Jetson TX1是计算机视觉系统的SoM(system-on-module)解决方案.它组合了最新的NVIDIAMaxwell GPU架构,其具有ARM Cortex-A57 ...

  7. 【ARM-Linux开发】【CUDA开发】NVIDIA TEGRA X1:LINUX驱动程序包多媒体用户指南

    NVIDIA TEGRA X1:LINUX驱动程序包多媒体用户指南 转载请注明作者和出处:http://blog.csdn.net/u011475210 嵌入式平台:NVIDIA Jetson TX1 ...

  8. 【ARM-Linux开发】【CUDA开发】NVIDIA Jetson TX2 进阶:Nsight Eclipse Edition

    嵌入式平台:NVIDIA Jetson TX2 嵌入式系统:Ubuntu16.04 虚拟机系统:Ubuntu14.04 一.NSight简介 Jetpack开发工具为人工智能提供了一整套软件架构,包括 ...

  9. 【计算机视觉】【并行计算与CUDA开发】GPU硬编码

    一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. 1 int main(int arg ...

随机推荐

  1. Codeforces Round #551 (Div. 2) F. Serval and Bonus Problem (DP/FFT)

    yyb大佬的博客 这线段期望好神啊... 还有O(nlogn)FFTO(nlogn)FFTO(nlogn)FFT的做法 Freopen大佬的博客 本蒟蒻只会O(n2)O(n^2)O(n2) CODE ...

  2. java-十五周作业

    题目1:编写一个应用程序,输入用户名和密码,访问test数据库中t_login表(字段包括id.username.password),验证登录是否成功. 题目2:在上一题基础上,当登录成功后,将t_u ...

  3. HDU 6125 - Free from square | 2017 Multi-University Training Contest 7

    思路来自这里 - - /* HDU 6125 - Free from square [ 分组,状压,DP ] | 2017 Multi-University Training Contest 7 题意 ...

  4. 爬取前尘无忧python职位信息并保存到mongo数据库

    1.re实现 import re,os import requests from requests.exceptions import RequestException MAX_PAGE = 10 # ...

  5. keepalived+lvs+nginx高可用

    环境说明: IP地址 部署应用 192.168.10.100 VIP0 192.168.10.101 VIP1 192.168.10.17 keepalived+lvs 192.168.10.16 k ...

  6. 034_非交互自动生成 SSH 密钥文件

    #!/bin/bash#-t 指定 SSH 密钥的算法为 RSA 算法;-N 设置密钥的密码为空;-f 指定生成的密钥文件存放在哪里 rm -rf ~/.ssh/{known_hosts,id_rsa ...

  7. [转]vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess

    三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,Cr ...

  8. anaconda安装和配置和基本使用

    conda是个商业化公司,所以没有授权不能随便建立其镜像.虽说说的是发邮件询问基本上就能够拿到授权,然而现实是国内的各大开源镜像站都拿不到. 这个事情最近有进展了. 清华大学的镜像源已经拿到授权了 ( ...

  9. 内存管理3- @property 参数详解

    @property ----------------- Create two classes: Book & Student ------------------- book.m #impor ...

  10. ROS Topic 常用指令

    rostopic list rosnode list一樣,就是列出目前運行中的topic有哪些. rostopic echo <topic_name> 接下來這個指令比較重要啦,就是去監聽 ...