【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案
最近一直在研究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-20110127和hwdecode-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对视频进行硬件加速转码的方案的更多相关文章
- 【iOS开发-74】解决方式:Xcode6下利用preference保存数据,终于的plist文件在哪里?
(1)现象:普通情况下.储存数据以一个沙盒为单位,preference数据存在在沙盒路径下Library/Preferences里面,可是Xcode6里找来找去根本什么都没有. watermark/2 ...
- 【视频开发】【CUDA开发】FFMPEG硬件加速-nvidia方案
1.目标 <1>显卡性能参数: <2>方案可行性: 2.平台信息 2.1.查看当前显卡信息 命令: lspci |grep VGA 信息: 01:00.0 VGA com ...
- FLV视频在IIS6.0下不能播放 处理的方法
FLV视频在IIS6.0下不能播放 Flash视频由于其较高的压缩率和优越的下载速度,前景普遍看好,同时也为Flash课件增色不少.然而,在FLV视频播放中,却有两个头痛的问题 一.FLV视频在 ...
- 【并行计算-CUDA开发】【视频开发】ffmpeg Nvidia硬件加速总结
2017年5月25日 0. 概述 FFmpeg可通过Nvidia的GPU进行加速,其中高层接口是通过Video Codec SDK来实现GPU资源的调用.Video Codec SDK包含完整的的高性 ...
- 【ARM-Linux开发】【CUDA开发】NVIDIA TEGRA X1:LINUX驱动程序包多媒体用户指南
NVIDIA TEGRA X1:LINUX驱动程序包多媒体用户指南 转载请注明作者和出处:http://blog.csdn.net/u011475210 嵌入式平台:NVIDIA Jetson TX1 ...
- 驱动开发学习笔记. 0.06 嵌入式linux视频开发之预备知识
驱动开发读书笔记. 0.06 嵌入式linux视频开发之预备知识 由于毕业设计选择了嵌入式linux视频开发相关的项目,于是找了相关的资料,下面是一下预备知识 UVC : UVC,全称为:USB v ...
- 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel
经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...
- Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核
Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核 标签(空格分隔): Qemu ARM Linux 在上文<Qemu搭建ARM vexpress开发环 ...
- 【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 ...
随机推荐
- IntelliJ IDEA自身以及maven项目打包方式
1. Idea自身打包方式 1.1 创建Artifacts 快捷键(Ctrl+Alt+Shift+S)打开项目的Project Structure.在Artifacts创建 接着,指定main cla ...
- test20190909 Gluttony
0+0+0+0+0+0=0.毒瘤出题人. BJOI2019 勘破神机 地灾军团的军师黑袍从潜伏在精灵高层的密探手中得知了神杖的情报,他对奥术宝石中蕴含的远古神秘力量十分感兴趣.他设计夺取了数块奥术宝石 ...
- APICloud的tapmode用法
在开发的过程中,直接给元素绑定事件属性onclick会点击没反应,这时,给标签加上tapmode,就解决了问题,查了一下,原来tapmode具有加速点击事件功能,在触发事件中加入tapmode可以消除 ...
- LeetCode 923. 3Sum With Multiplicity
原题链接在这里:https://leetcode.com/problems/3sum-with-multiplicity/ 题目: Given an integer array A, and an i ...
- 【loj3123】【CTS2019】重复
题目 给出一个长度为\(n\)的串\(s\),询问有多少个长度为\(m\)的串\(t\) 满足 \(t\) 的无限循环串存在一个长度为\(n\)且比\(s\)字典序严格小的子串 $ n , m \le ...
- c博客作业—分支,结构顺序
1展现PTA总分 1 2 2本章学习类容总结 1常量和变量 常量:在运行中其值不变的量被称为常量,常量的类型通常是由书写格式决定,包括整型常量,实数型变量等等. 变量: 在运行中其值可变的量被称为变量 ...
- 通过phoenix导入数据到hbase出错记录
解决方法1 错误如下 -- ::, [hconnection-0x7b9e01aa-shared--pool11069-t114734] WARN org.apache.hadoop.hbase.ip ...
- React_03_ECMAScript6
1.ES6解构赋值 1.1.解构赋值概述 解构赋值是对赋值运算符的扩展. 它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值.在代码书写上简洁且易读,语义更加清晰明了:也方便了复杂对象中数 ...
- var a = function(){}和var a = function(){}();的区别
var a = function(){ ... ... ... } 声明方法. var a = function(){ ... ... ... }(); 声明方法并执行 demo: var u = f ...
- Java8新特性 (一)Lambda
目录 一.Lambda介绍 二.Lambda用法实例 三.Lambda变量作用域 前言: 这两天彻底的复习了一遍Java8的各种新特性,趁着热乎劲,把知识点整理成博客的形式保存一下. 一.Lambda ...