你要的FFmpeg高级技巧全在这里

2020-09-23 11:52:02 21点赞 89收藏 30评论

大家好,我是波导终结者。

上一期的效率私房分享了几个FFmpeg私房技巧,虽然不像烂大街的什么UP主推荐一样热度高还给首页,但是来交流、有硬需求的小伙伴还是不少的,今天就来解答一下,上期几个小伙伴的需求。

全网唯一独家干货,你到墙外也找不到的,先收藏点赞关注再看,不过份吧?

PS:那些说“私房”就该有那种玩艺儿没有就要举报的再出来跳跳?


显卡编码原来这么简单

你要的FFmpeg高级技巧全在这里

上回有位朋友说到GPU加速,也即显卡编码。因为上期主要是分享重封装,所以并没有用到显卡编码。而强行将1080P视频转换成level 3.0的代码,我在评论里也解释过了,显卡编码是奔着高规格高质量高速度去的,谁给你转level 3.0?直接报错好吗,不信你自己试试。

你要的FFmpeg高级技巧全在这里

所以这里,把profile改成了high,level 改成4.1是比较正常的规格。FFmpeg内置的264编码器也不止一个,但这里还是沿用libx264,因为其他的也不见得比它好。其实大部分代码还是沿用上次强转level 3.0的。

你要的FFmpeg高级技巧全在这里

2倍多的速度,CPU很努力了,换多好的CPU,就有多快呗。

你要的FFmpeg高级技巧全在这里

那怎么样用显卡编码呢?很简单,把编码器换成h264_nvenc就行了。不过要注意的是,显卡编码器的参数一般是要比CPU编码来得少的,所以有的参数无效,甚至有的参数会报错,每个人需求不同,我就不细分了,只能具体情况具体分析。

你要的FFmpeg高级技巧全在这里

想要知道显卡编码是不是成功了,很简单,跑一遍呗。14.6x的瞬时速度,整个转下来差不多是15x的速度,你说显卡编码成功了没?你上好的显卡,它就能更快,你给我寄张3080来,我让它飙到百倍以上~

其实我上次没分享,一个是因为这个太简单了呀,改一下不就好了,网上也能查得到。另一个就是,之所以用FFmpeg写脚本,一般是要完成那些GUI工具完不成的事情,比如需求特殊等等。而如果只是要用显卡编码的话,现在满地的工具都可以实现,当然,讽刺的是,它们99%都是封装的FFmpeg。

你要的FFmpeg高级技巧全在这里

目前我用的最顺手,也比较稳定的,就是ShanaEncoder,你直接选带NVENC的就是显卡编码。

再重复一次,写脚本是为了那些比较特殊、没办法用现成GUI工具做的需求,你如果只是普通转码,免费开源基于FFmpeg的工具满地都是。


mkv重封装成mp4也不难

你要的FFmpeg高级技巧全在这里

这位朋友的需求,是将MKV重封装成MP4,这个说难不难,说易不易。

说它易吧,如果只是封装了一个音频和视频的MKV,那就是换个壳而已,网上有现成的脚本。

说它难吧,对MKV有点了解的朋友应该会知道,它算是一个比较特殊的容器格式,从原理上来讲,它更接近于压缩包,所以可以放进几乎任何内容,音频视频,字幕图片,文本甚至其他文件……所以,对MKV的支持才会是最难的。

这里,我直接拿一个复杂点的MKV文件,来跟大家分享一下,MKV文件怎么快速重封装成MP4文件。

你要的FFmpeg高级技巧全在这里

之前收藏的数码宝贝第一部,1080P,H265编码,三音轨(日配原声,台配国语,粤配雷猴),简繁双字幕,封装在一个MKV文件里。

你用GUI工具打开,当然可以把里面的内容一个个提出来,但是如果几十集都要这样手动提,然后再去怎么样整合的话,那还不整死人了。这里我就教大家怎么样把要的东西提出来。

首先你要找到要的东西,第一当然是视频,第二,我要国配,字幕不要,然后直接封装成MP4格式。MP4不支持内嵌的外挂式字幕,如果要字幕只能通过转码把字幕压到视频上,这里略过。

找到要的东西之后,记下它们的ID,就是 mkvextract:0,这里的0,记住从0开始。我要的视频ID是0,音频ID是4,记下来。

你要的FFmpeg高级技巧全在这里

如果你没有这种专业工具,手头有个播放器,别太烂或者国产全家桶只给广告不给功能的,应该都有查看视频信息的功能。拉下一来,找到这个ID就对了,这里它是从1开始的,写到脚本里要减1。唉,编程里的下标这个东西,不解释了啊。

你要的FFmpeg高级技巧全在这里

接下来就是见证奇迹的时刻啦,三连一波先走起来~

关键代码部分我都给你标红了,-map 0:0,第一个0指的是输入文件,因为ffmpeg可以接受多个输入(下一节就会讲到),你要指定具体是哪个文件,只有一个的话那肯定全是0。第二个0就是我刚才叫大家记下的,0就是我们视频的轨道,对吧。

所以后面的-map 0:4也就好理解了,音频轨道,不用我再多说了吧。

你要的FFmpeg高级技巧全在这里

我一直说重封装,重封装,而不是转码,看了这张图就知道为什么了。重封装的速度极快,就是一瞬间的事情,快到我根本来不及截图,只能把屏幕录下来,再到录像里暂停。

2.15e+03倍是多少倍来着……

你要的FFmpeg高级技巧全在这里

这个方法既可以解决部分设备不支持MKV的问题,剔除了不必要的音轨又可以节省空间,同时我写给你们的都是批量处理的代码,目录下所有符合条件的文件一次性就全部弄好了。

别家音频质量好?拿来用就是了

你要的FFmpeg高级技巧全在这里

FFmpeg的音频编码部分我没有仔细研究过,不过其他第三方库的质量和速度更优秀,倒是挺有可能的,音频这块人家有另外的地盘儿。

那么,如果想要用更优秀的第三方库处理音频,然后再用FFmpeg强大的功能把视频和音频合并封装成文件,可以实现吗?

你要的FFmpeg高级技巧全在这里

当然可以。

为了通用性,我强烈建议大家让音频文件和视频文件的文件名一样,这样不管有多少文件来,都是批处理点一下就搞定的事情。

这里我有一个MP4文件,AAC的音频编码,然后假设我想要MP3格式的音频,又不想用FFmpeg自带的转换,而是觉得第三方库的质量和速度更好,怎么操作呢?

很简单,先转出MP3文件来,确保文件名相同,再放到同个目录下。

你要的FFmpeg高级技巧全在这里

然后就是见证奇迹的时刻啦。

记得上一节跟大家谈过,FFmpeg可以接受多个文件输入吧,这里就分视频文件和音频文件来输入。

输入之后,利用上一节学到的MKV封装时,指定流的方式,用map指令来指定流。

先指定视频文件的0轨,一般视频0轨就是视频轨。当然如果是手动打命令封装,也不一定是0轨,具体的看文件,只不过颠倒封装顺序没啥意义就是了……

-map 1:0指定第二个文件为音频文件,因为转成了MP3,MP3只有一轨,所以还是0。前面的1其实是输入的文件顺序,第2个文件(下标都要减1,从0开始)。

你要的FFmpeg高级技巧全在这里

这么一重封装,光速完成,不录屏了,反正重封装是极快的~

可以看到,音频已经由原来的AAC变成了MPEG,播放一下,完全没有问题。

当然,不同格式的容器能接受的音频不同,如果报错那就是塞不进去,这个就要根据自己的需求尝试了。

你要的FFmpeg高级技巧全在这里

好,第二期的#波导的效率私房#就先到这里了,搜遍全宇宙都找不到的干货,不值得你关注点赞收藏一波吗?代码文件我会放到网盘里,自行取用即可。

感谢观看,我们下期再见。

展开 收起
30评论

  • 精彩
  • 最新
  • 其实用opencv和ffmpeg结合,进行视频播放以及控制是木有问题的,但还是有些小的技巧。这些代码我不能说不值钱,只是需要点小技巧。 ​​​

    校验提示文案

    提交
    这篇直接被限流,推荐里看不到了,真亏你能刷到哈哈

    校验提示文案

    提交
    你这么惨的吗,

    校验提示文案

    提交
    还有3条回复
    收起所有回复
  • 所以我觉得这玩意能做个benchmark测性能

    校验提示文案

    提交
    可以呀,无非就是GUI,外面显卡转码测试的软件全是FFmpeg核心的

    校验提示文案

    提交
    收起所有回复
  • 波导这些发知乎比较好,这里真没人看 [喜极而泣]

    校验提示文案

    提交
    报了专栏本月三篇,既然限流写完就撤

    校验提示文案

    提交
    收起所有回复
  • 正在做java调用ffmpeg, 打开值得买正好看到这一篇 [棒棒哒]

    校验提示文案

    提交
    嘿嘿,我不编程好多年了,就偶尔写写脚本

    校验提示文案

    提交
    收起所有回复
  • Shana好用是好用,就是对多线程优化不好,CPU和GPU占用都不高,我一般开两个程序窗口同时跑,也吃不满,不知道是不是内存带宽瓶颈了。开第三个窗口就会报错

    校验提示文案

    提交
    有哪里瓶颈了吧,我一直是满的

    校验提示文案

    提交
    收起所有回复
  • 看了后,眼前一亮!

    校验提示文案

    提交
    看到代码竟然不是眼前一黑

    校验提示文案

    提交
    收起所有回复
  • 大佬,最近找了点老电影,去除无用的轨之后还是很大,感觉不应该这么大,开始研究ffmpeg转码,用了shana和axiom,总是调不好参数,能简单介绍一下吗,另外ffmpeg是不是不支持新的a卡硬解,我是5600xt,每次都崩溃,现在软解呢,时间太长了

    校验提示文案

    提交
    shana就是ffmpeg核心,用它就行。视频大小理论上只和码率有关,你试试用shana压几个码率,取一个你能接受的。

    校验提示文案

    提交
    我再试试,可能是硬件问题,5600xt的显卡可能有问题

    校验提示文案

    提交
    收起所有回复
  • 大佬,最近在给手里的电视剧转码,从264转265,有一个参数crf没搞明白,转到265时这个参数设置成多少合适一些,我看网上说265默认值是28,我分别调成18和23都尝试了,可能是片源太老了,视觉效果差不太多,这个参数需要根据视频的什么参数选择

    校验提示文案

    提交
    crf就是质量,比cqp效果更好。数值越小,质量越好。这个参数的特点是完全由编码器来掌握质量和文件大小,所以比较省心,但也比较不可控。你18和23视觉效果差不多的话,再比一比文件大小,如果文件大小能接受,我是建议数值越小越好。如果很在乎硬盘占用,就反过来,文件越小越好,反正也看不出什么差别。

    校验提示文案

    提交
    也就是说数值越小能保留的原始数据越多,日后在处理就有更大空间是吗

    校验提示文案

    提交
    还有8条回复
    收起所有回复
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
89
扫一下,分享更方便,购买更轻松