【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 ...
随机推荐
- 后台返回的Json为null的字段不显示的方法
如果引入的是谷歌的gson的话,需要引入依赖: <dependency> <groupId>com.fasterxml.jackson.core</groupId> ...
- java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone.
java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized or represents more tha ...
- CF938G Shortest Path Queries 和 CF576E Painting Edges
这两道都用到了线段树分治和按秩合并可撤销并查集. Shortest Path Queries 给出一个连通带权无向图,边有边权,要求支持 q 个操作: x y d 在原图中加入一条 x 到 y 权值为 ...
- java代码操作word模板并生成PDF
这个博客自己现在没时间写,等后面有时间了,自己再写. 这中需求是在实际的项目开发中是会经常遇到的. 下面我们先从简单入手一步一步开始. 1.首先,使用word创建一个6行两列的表格. 点击插入-6行2 ...
- 【转】.NET Core 事件总线,分布式事务解决方案:CAP
[转].NET Core 事件总线,分布式事务解决方案:CAP 背景 相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用 ...
- Tensorflow细节-P290-命名空间与tensorboard上的节点
讲解几个重点知识 1.对于tf.get_variable()中的reuse,意思是,如果有名字一模一样的变量,则对这个变量继续使用,如果没有名字一模一样的变量,则创建这个变量 2.options=ru ...
- nbbnbnbnbnb
1.本章学习总结(2分) 1.1 学习内容总结 结构体的定义与赋值 结构类型定义的一般形式为: struct 结构名 { 类型名 结构成员1: 类型名 结构成员2: ... 类型名 结构成员3: }; ...
- mysql pi() 获取pi
mysql> select pi(); +----------+ | pi() | +----------+ | 3.141593 | +----------+ row in set (0.00 ...
- Apache Flink - 架构和拓扑
Flink结构: flink cli 解析本地环境配置,启动 ApplicationMaster 在 ApplicationMaster 中启动 JobManager 在 ApplicationMas ...
- 刷题记录:[CISCN2019 华北赛区 Day1 Web5]CyberPunk
目录 刷题记录:[CISCN2019 华北赛区 Day1 Web5]CyberPunk 一.知识点 1.伪协议文件读取 2.报错注入 刷题记录:[CISCN2019 华北赛区 Day1 Web5]Cy ...