最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案。似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对之前所作的一些工作做一些总结和分享,省的时间长了自己也忘记了,也希望后来者能少走弯路,并找到适合自己的最佳方案。

背景:

项目需要在指定的linux服务器上对视频源进行转码存储,以节省存储空间。操作系统必须是Linux,用来硬加速转码的GPU是nViDIA的GT440。

方案1:

由于nViDIA的CUDA SDK中提供了现成的硬加速encoder和decoder,最简单、性能最有保障的方式就是调用CUDA中的编解码API进行转码。国内比较有名的MediaCoder就是这么搞的,当然它只用了CUDA的encoder,解码还是用CPU来做的。但问题是,安装了CUDA SDK之后才发现,CUDA提供的编解码API只有windows的版本,没有Linux的版本。于是,只能退而求其次地尝试在Linux下安装Windows虚拟机试一下。

首先,试了一下Wine,安装好Wine之后,尝试安装N卡的windows驱动,提示如下错误:

接着,又尝试了在VisualBox中安装Windows,再安装N卡驱动,提示找不到N卡硬件,如图:

据说MediaCoder支持Linux的方式,就是让MediaCoder在Wine下面运行的,但是不知道为什么我的环境下连驱动都装不上。所以方案1对我来说,基本上属于死路一条。

方案2:

用ffmpeg进行转码。因为发现ffmpeg自带了VDPAU和VAAPI的硬加速解码模块,所以想是不是通过参数设置就可以让ffmpeg通过GPU来硬加速解码。但是ffmpeg的说明文档关于硬加速这块的描述不是很清楚,只能自己结合网上的零星文章做参考,慢慢摸索前进。

首先,编译ffmpeg,确认configure的时候它的几个decoders(h264_vdpau,mpeg4_vdpau,...)和hwaccels(h264_vaapi,mpeg4_vaapi,...)都是enable的。但是编译好ffmpeg之后,通过设置强制解码codec,比如h264_vdpau,运行ffmpeg时,会报一个PIX_FMT_XXX的错误,意思是解码之后的格式不对,不能继续用于编码。

然后,下载了mplayer-vaapi-20110127hwdecode-demos,经过各种磨难之后,终于都编译通过。经过测试,发现它们都可以利用vdpau和vaapi进行硬加速解码,于是认为ffmpeg也应该可以利用vdpau和vaapi进行硬加速解码。但又折腾了很久,找了很多资料,最后终于在ffmpeg-user上看到一个老外给别人的回帖,明确说了ffmpeg不能用vdpau和vaapi来转码,ffmpeg提供vdpau和vaapi的硬加速decoder,目的是为了给类似mplayer的应用来进行硬加速的视频播放,当时就崩溃了!!!

最后,硬加速decode不行,咱就整encode吧。网上找到一个用OpenCL来硬加速的x264版本,x264demo。又经历了各种磨难,终于将它编译通过并和ffmpeg集成在一起了,期间还修复了x264若干bug。但是最后测试的结果,令人大失所望。虽然使用OpenCL方式加速之后,确实比原版x264快了20%-30%,但问题是:一、转出来的视频根本没法用,存在大面积的花屏,本人对H.264编码的算法不甚了解,故这个大bug只能先放着了;二、H.264的编码算法还是蛮复杂的,因此x264编码的效率比普通的mpeg编码慢了10倍左右。这样的话,用x264+OpenCL的方式对我来说就完全没有必要了。

方案3:

用VLC+VAAPI进行硬加速转码。因为VAAPI的机制是在各个厂家提供的driver层上进行了统一的接口封装,对于N卡,其底层调用的是VDPAU,因此硬件加速仅限于解码部分,编码还是用的软编码。前面说到ffmpeg无法利用VDPAU进行转码,是因为VDPAU解码出来的格式不是YUV的,我想VLC应该是对VDPAU解码出来的东东进行了进一步的加工,然后进行的编码。测试下来的结果显示,VLC硬加速转码的时候确实用到了GPU,但实际转码的时间和CPU占用率并未得到很大的改善。

方案4:

纯硬件加速方案,即利用成熟的DSP芯片进行转码。该方案可以根据需要,将多块硬编解码芯片集成在一起,实现多路视频的同编同解。好处是,利用成熟芯片,不用太关心编解码的具体算法,方案可大可小,甚至可以用来做云转码。可问题是,该方案不符合我的项目需求,哎,只能先放一放了。

【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案的更多相关文章

  1. 【iOS开发-74】解决方式:Xcode6下利用preference保存数据,终于的plist文件在哪里?

    (1)现象:普通情况下.储存数据以一个沙盒为单位,preference数据存在在沙盒路径下Library/Preferences里面,可是Xcode6里找来找去根本什么都没有. watermark/2 ...

  2. 【视频开发】【CUDA开发】FFMPEG硬件加速-nvidia方案

    1.目标 <1>显卡性能参数: <2>方案可行性: 2.平台信息 2.1.查看当前显卡信息 命令:  lspci |grep VGA  信息:  01:00.0 VGA com ...

  3. FLV视频在IIS6.0下不能播放 处理的方法

    FLV视频在IIS6.0下不能播放 Flash视频由于其较高的压缩率和优越的下载速度,前景普遍看好,同时也为Flash课件增色不少.然而,在FLV视频播放中,却有两个头痛的问题    一.FLV视频在 ...

  4. 【并行计算-CUDA开发】【视频开发】ffmpeg Nvidia硬件加速总结

    2017年5月25日 0. 概述 FFmpeg可通过Nvidia的GPU进行加速,其中高层接口是通过Video Codec SDK来实现GPU资源的调用.Video Codec SDK包含完整的的高性 ...

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

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

  6. 驱动开发学习笔记. 0.06 嵌入式linux视频开发之预备知识

    驱动开发读书笔记. 0.06  嵌入式linux视频开发之预备知识 由于毕业设计选择了嵌入式linux视频开发相关的项目,于是找了相关的资料,下面是一下预备知识 UVC : UVC,全称为:USB v ...

  7. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel

    经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...

  8. Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核

    Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核 标签(空格分隔): Qemu ARM Linux 在上文<Qemu搭建ARM vexpress开发环 ...

  9. 【Qt开发】【VS开发】【Linux开发】OpenCV、Qt-MinGw、Qt-msvc、VS2010、VS2015、Ubuntu Linux、ARM Linux中几个特别容易混淆的内容

    [Qt开发][VS开发][Linux开发]OpenCV.Qt-MinGw.Qt-msvc.VS2010.VS2015.Ubuntu Linux.ARM Linux中几个特别容易混淆的内容 标签:[Qt ...

随机推荐

  1. Vue 项目中 ESlint 配置

    前言 对于 ESlint 这一块一直存在一些疑问,今天看到一个文章内容挺好的,这里拿来了. 一.eslint 安装 1.全局安装 npm i -g eslint 全局安装的好处是,在任何项目我们都可以 ...

  2. Map遍历效率比较

    1.由来 上次博客提到了Map的四种遍历方法,其中有的只是获取了key值或者是value值,但我们应该在什么时刻选择什么样的遍历方式呢,必须通过实践的比较才能看到效率. 也看了很多文章,大家建议使用e ...

  3. 通过Python实现mysql查询数据库实例

    #coding:utf-8 ''' Created on 2017年10月25日 @author: li.liu ''' import pymysql db=pymysql.connect('loca ...

  4. JSON—去除JSON数据中的所有HTML标…

    package com.linoer.utils; import java.util.ArrayList; import java.util.List; import java.util.regex. ...

  5. 4-html图片与链接

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. 开源项目(4-2)手势识别-Keras/Theano/OpenCV实现的CNN手势识别

    https://github.com/asingh33/CNNGestureRecognizer 我提供了两种捕获模式: 二进制模式:在这里我首先将图像转换为灰度,然后应用高斯模糊效果和自适应阈值滤波 ...

  7. 【loj2552】【CTSC2018】假面

    题目 有\(n\)个敌方单位,初始生命值分别为\(m_1,\cdots,m_n\) : 假面可以释放\(Q\)个技能: $op = 0  ,  id , u , v $ 表示对\(id\)号敌人有\( ...

  8. Mac下删除自己安装的Python

    删除Python框架sudo rm -rf /Library/Frameworks/Python.framework/Versions/x.x 删除Python程序sudo rm -rf “/Appl ...

  9. NuxtJS如何利用axios异步请求

    第一种:使用nuxt 提供的 Axios插件 @nuxtjs/axios 1.安装:npm install @nuxtjs/axios -d 2.配置 nuxt.config.js exports d ...

  10. linux 安装mysql mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

    下边连接:https://www.cnblogs.com/zero-gg/p/8875598.html,大神的结晶啊,我就悄悄的留下来自己用,链接缺少的部分补充下: 1.包的下载方法:wget htt ...