原文:基于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. SIGAI机器学习第十集 线性判别分析

    讲授LDA基本思想,寻找最佳投影矩阵,PCA与LDA的比较,LDA的实际应用 前边讲的数据降维算法PCA.流行学习都是无监督学习,计算过程中没有利用样本的标签值.对于分类问题,我们要达到的目标是提取或 ...

  2. 025_自动为其他脚本添加解释器信息#!/bin/bash

    #!/bin/bash#先使用 grep 判断对象脚本是否已经有解释器信息,如果没有则使用 sed 添加解释器以及描述信息if ! grep -q "^#!" $1; then # ...

  3. Archiva 不小心删掉了管理员权限怎么办

    Archiva 的界面和 UI 比较容易出问题. 在添加用户和为用户进行权限修改的时候,不小心连 admin 这个用户的权限都删掉了. 这个时候应该如何恢复 admin 这个用户的权限? 这个时候你可 ...

  4. 【概率论】3-3:累积分布函数(Cumulative Distribution Function)

    title: [概率论]3-3:累积分布函数(Cumulative Distribution Function) categories: Mathematic Probability keywords ...

  5. 收藏加备用。ext.xfs文件系统 文件恢复

    注意 当确认误删除文件后立刻使用各种方式阻止新数据在写入该分区了. 设置只读或umount都可以 ext2 3 4 文件系统 可以用 extundelete 这个工具来恢复. github地址: ht ...

  6. 将String类型的字符串拼接成以逗号分隔的字符输出

    package test; import java.util.ArrayList; import java.util.List; public class Tesdssss { private sta ...

  7. ZOJ 2592 Think Positive ——(xjbg)

    做法是,先求出前缀和pre.然后枚举端点i,[i+1,n]中pre最小的找出来,减去pre[i-1]大于0,这是第一个条件:第二个条件是,从i开始的后缀和和i之前的最小的一个pre相加大于0.只要满足 ...

  8. tecplot 把散点绘成曲面图【转载】

    转载自:http://blog.sina.com.cn/s/blog_a319f5ff0101q6s8.html 找了好久,终于自己研究出来,如何使用tecplot绘制曲面图了 第一步:数据的整理 如 ...

  9. jvm方法栈

    调用栈 先入后出 栈是一个只有一个口的容器,先进入栈的会落到栈底,出栈的时候最后出.最后进入栈的,在栈顶,出栈时先出. 方法调用时,需要在内存中开辟一块存储空间做为线程栈空间 每个线程都由自己的栈 调 ...

  10. CentOS7 docker开启tcp端口并进行客户端远程连接

    #docker版本:18.09.0,最好保证客户端端口和服务端端口相同 [root@Centos7 ~]# dockerd-ce -v Docker version , build 4d60db4 网 ...