用ffmpeg gpu进行转码失败,求解答

Note: 此文章首发于我的个人博客zhi-hua.wang ,开放转载但需附上出处。

FFMPEG 是一款开源的视频处理软件,再利用FFMPEG转码的过程中踩了很多坑,在这里列举一些常用的 FFMPEG 命令防止忘记。

以下所有的命令的输入都是《The.Mandalorian.S01E01.INTERNAL.HDR.2160p.WEB.H265-DEFLATE.mkv》这部影片,这部影片有很多特殊的地方,所以给我带来了不少困扰。它也驱使我学习了关于视频的很多知识,以下是它的一些基本参数:

bt2020nc 。为了节省篇幅,以下均以input.mkv代表这个视频源文件。而且由于配备了gtx1070显卡以及安装了最新的驱动,所有的操作都是尽量利用GPU进行硬件加速。

告诉ffmpeg使用cuvid加速,并且把视频的数据保留在显存而不是内存上。由于版权问题ffmpeg不自带scale_npp滤镜,需要自己编译。为了方便我选择manjaro系统,直接安装AUR上的ffmpeg-full包。这个过程也很心酸,可以专门写一篇文章了,这里就不展开了。关于ffmpeg转码的文章在互联网上有很多,尤其是英伟达官网的《ffmpeg

运行以上命令却报错了。原来scale_npp滤镜很娇气,无法处理10bit的视频,因此尝试失败。

输入以上命令,发现咋只有48fps呢?那岂不是要十几分钟?太慢了!

突然发现了scale_cuda这个宝藏,它能接受10bit输入。而且scale_cuda在ffmpeg的编译版中自带!这就好办了,赶紧敲下以下命令:

所有任务都转到GPU上运行了,性能得到巨大提升。通过观察发现此时的瓶颈变为了GPU解码。GPU解码器的占用率高局100%,而编码器只占用了不到20%。

经过长时间的试错,发现之前的错误通过在scale_cuda滤镜后添加hwdownload,format=p010le就可以解决了,至于为啥我也不知道 。-hwaccel_output_format cuda目前可以不加,只不过会警告你以后不加就会报错了。

这一条与上一条没多大的区别,只是把scale_cuda改为了resize。resize这个参数是我从英伟达官网上的一篇pdf上了解到的,它说用resize性能好一些。至于好不好我不知道,我只知道resize更易读与打出来。

之前的转码都是恒定码率模式,很不科学。hevc_nvenc没有crf参数,这可咋办呢?好在找到了替代方案。通过将-rc:v 设置为vbr或者vbr_hq,从而启用VBR模式,然后设置-cq:v-qmin-qmax。这里最好把它们设置成一个数值,否则没有多大意义。这个数值接类似于crf参数。

经过前面这么多的折腾,视频已经压制好了。可是越看越不对劲。为啥我压的视频看起来灰蒙蒙的呢?经过深入调查发现是由于HDR导致的。这个视频本身是HDR的,而转换过程中ffmpeg并没有保留HDR有关的元数据(这应该是个BUG),又没进行颜色的转换。所以播放器把这个HDR视频当作SDR来处理,就会导致画面发灰。解决办法有两种,一是将其转为SDR,这需要tonemap滤镜(似乎scale滤镜也可以)。另一种是保留元数据,让播放器能够正常处理。这里选择第一种。由于tonemap是运行在cpu上的,效率低,所以我改用它的硬件加速版:tonemap_opencl

注意下面的命令我只在linux上测试成功过,win10会报错,我也不知道为什么。

tonemap_opencl的这些参数中,tonemap指定了使用的算法,可选值为nonecliplineargammareinhardhablemobius。param是用来微调这些算法的。具体的内容看ffmpeg的文档。这里最重要的是将p、t以及m都设置为了bt709。所以这个滤镜会完成以下转换:色彩原色: bt2020->bt709、传输特性:smpte2084->bt709、矩阵系数:bt2020nc->bt709 (HDR有多种不同标准,smpte2084对应的是HDR10。 经过HDR->SDR的转换,颜色终于变得正常了,不过仔细看肯定和原片有差距。可以根据画面的特色选用不同的算法和参数来进行调整,以保证画面的准确度。

9. 颜色偏差--添加HDR元数据(失败)

上一节我们将HDR转为了SDR,画面的准确度有些许丢失。那该怎么办呢?之前说到还有一种方法,那就是保留元数据。我尝试过用MKVToolNix将色彩原色、传输特性以及矩阵系数分别设置为9、16和9。然后这个视频在linux上播放正常了,但是在windows上还是灰的。我真的是很无语!!!

我在github上还找到了另外一个项目,叫做nv_hevc_hdr_patcher。但是这个项目看起来挺不好用的,我懒得折腾,所以HDR元数据添加宣告失败(怎么可能这么轻易放弃,下一节会用其它工具搞定这个问题(如果我还会继续写的话(会吗?)))

使用FFMPEG,在尽量利用硬件加速的情况下完成了视频的压制。直接转码时会丧失HDR元数据,导致发灰(见下图中间一栏)。通过tonemap可以将HDR转为SDR视频,画面的颜色得到较为准确的还原,但还是有轻微的差别。最终也没能够完成HDR元数据的添加。

直接压片,元数据丢失导致发灰
}

华为公司媒体工程部有如下中/高级岗位人才招聘进行中,请自荐和推荐相关领域感兴趣朋友。
招聘对象:在校即将博士和博士后(2016和2017年毕业的皆可)、或者社招博士,3年工作经验的硕士生,4年以上经验的本科生。
工作地点:深圳/杭州/西安
如有意向请讲简历发送到

1)负责华为VR/AR SDK系统架构设计和技术开发工作;
2)负责头部跟踪,位置定位和其他外部输入的交互开发;
3)负责图像渲染pipeline性能优化;
4)对VR系统端到端性能、时延分析和优化。
1)硕士3年以上C/C++/Java项目开发经验,或应届博士、社招博士学历。
2)有计算机图形、3D、图像、视频或AR/VR算法和系统开发项目经验;
3)有如下经验者优先:

2.VR算法中/高级工程师
1. 参与公司VR核心算法设计和项目开发。
1. 本科及以上学历,计算机、电子工程或数学专业,应届博士或者社招博士更佳。
2. 在如下领域之一有三年以上经验:
4. 良好的编程能力,C/C++, 熟悉GPU加速,有OpenCL开发经验尤佳

3.全景算法中/高级工程师
1、负责360度全景视频直播采集/拼接算法研究和优化;
2、主要研究优化全景拼接、融合算法;
3、研究鱼眼矫正算法。
1、信号处理、模式识别、图像处理及计算机视觉等相关专业背景; 硕士3年以上工作经验,应届博士或社招博士更佳。
2、精通C/C++,熟悉基本的数字图像与视频处理算法原理,熟悉OpenCV/OpenGL;
3、熟悉基于GPU的算法设计与优化和并行优化经验者优先;
4、熟悉H.264等视频编解码标准和FFMPEG者优先;
5、熟悉rtmp等流媒体传输协议者优先;
6、熟练掌握openCV图像处理函数库,了解图像拼接,边缘检测,像素插值,物体对象识别,特征提取(如SIFT算法)等进阶图像处理算法;

4.深度学习中/高级工程师
1)利用深度学习的技术进行前沿人工智能技术研发;
2)熟练掌握各种深度神经网络(CNN、RBN、RCNN、DNN等),并能够将其应用于特定场景中去
4)编码和团队协作能力强,能够独立支撑一个研究方向,勇于挑战和创新,工作主动性强

1)计算机、图像识别、自动化或者模式识别专业等相关领域的本科以上学历,博士更佳,四年以上工作经历(特别优秀者可放宽);
3)掌握机器学习/深度学习等相关知识,至少使用深度学习技术解决过一个实际问题(如:人脸识别、语音识别、车辆识别、场景识别等等);
4)具有较强的编程能力,能够书写标准的规范文档;
5)对视频检索或智能视频分析有过丰富研究经历

5. 图像/视频算法高级工程师
职位描述:从事流媒体、视频点播或直播、视频编解码、图像处理等算法设计与开发
1,相关领域2年以上工作经验,有图像处理、流媒体、视频点播或直播、视频编解码项目经验者优先;
3,熟练掌握C语言,掌握linux多进程多线程编程;

6. VOIP/音视频会议/音视频转码平台高级工程师
1) 从事互联网通信解决方案的开发和研究
2) 负责高并发,高性能的实时媒体转码平台设计和开发。
1)相关领域2年以上工作经验,具有嵌入式软件开发经验,有流媒体、视频点播或直播、视频编解码项目经验者优先;
2)熟练掌握C\C++语言;掌握linux多进程多线程编程;
3)熟悉ffmpeg框架,或者有DASH/HLS、MP4/TS等标准和协议软件开发经验。

7,GPU开发中/高级工程师
1.,进行CPU多核/GPU平台的并行程序设计、开发、优化
2,分析评估计算机视觉、视频算法在GPU上实现的可行性
3,开发具体算法的GPU实现并进行性能调优
1. 工作地点深圳或杭州,计算机相关专业
2. 精通并行计算方法和并行算法设计
5. 有大规模GPU集群平台搭建经验者优先
6. 有计算机视觉算法移植背景者优先
7. 良好的沟通能力和团队协作能力

}

今天下午,科校长在观摩中心以视频直播的方式为高三年级全体学生讲授语文课,信息中心提前将直播端和客户端都准备好,保障活动顺利进行。

同时,我们将活动过程全程录像,并且将视频流录制视频片段及时发布到教师群。那么流媒体视频是如何进行处理的呢,请大家往下看。

一、校园网视频直播简述

观摩中心三路摄像机信号和一路计算机屏幕高清信号首先通过视频导播台切换,再通过视频编码器编码后网络推送,输出RTMP视频流。后经Nginx服务器进行视频转发后在各班级通过客户端或浏览器读取视频流实现视频直播。

1、校园网视频流格式为“rtmp://:1935/channel/c01”,端口号使用1935,为了进行视频流处理,我们在Ubuntu系统上安装FFmpeg软件,成功配置后使用如下命令可以完成视频流录制。

指令解释:将视频流录制1分钟,同时转换为Mp4格式后保存为mymovie.mp4视频文件。

2、录制成功后的视频分辨率为视频源原始分辨率,达到高清,体积较大,不便于在微信群中发布(微信视频限制为25M),为此我们需要将视频调整分辨率,适当降低视频码率,此时我们调整为720*480、450k、Mp4视频格式,使用如下命令(命令通过Php程序代码调用,请阅读注释)

视频流此时将被调整分辨率,经测试在手机端能清晰观看。

3、最终发布前我们还可以在视频上添加水印,使用学校校徽图片,以放置在左上角举例,使用指令代码示例。

指令解释:原始视频调整分辨率到,码率876k,25帧,同时在坐标140:10的位置添加logo.png作为水印,输出为out.mp4文件,同时将处理进度输出到log文件便于实时检测。

4、此时我们就可以将处理后的文件直接在微信中发布了。如果要将视频文件发布到网页并提供点播服务,还需要对视频进行切片,以确保在主流浏览器中能流畅访问,同时能在手机浏览器中点播。视频切片指令如下

指令解释:录制视频流3分钟,同时将流以10秒钟为间隔切片为ts格式,最终生成index.m3u8索引文件用于视频发布。

5、网页视频发布。以上所有操作最终使用php函数进行封装处理,所有变量使用数据库或网页提交。校园视频网站环境使用Apache+Php+Mysql,搭建于Linux系统上,网站程序全部编写完成后只需要登录后台点击相应链接,服务器即可进行完整的视频处理。前台视频播放使用video标签调用视频完成视频点播。点播页面代码示例:

拓展阅读:FFmpge简介

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

}

我要回帖

更多关于 plex可以用gpu转码嘛 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信