FFMPEG重编码视频入门过程中的想法
最近在Hao4K上看到有人发布了老版四大名著的分享,但是是阿里云盘的,那时候群晖还没把阿里云盘同步绑上,开始一点点搬运,然后就研究怎么把阿里云盘同步到群晖。网上教程一大堆,选了一个看起来还不错的,就用了。就开始了大规模搬运的过程。搬完了才发现群晖存储池报警了,我是一个轻微的强迫症患者,看到报警就难受,但是还没钱换硬盘,只能研究压缩现有的视频,看来看去,发现了ffmpeg是个神奇的东西,基本上所有媒体文件他都能处理,但是是个命令行工具,也有很多GUI界面,像Shana encoder、Axiom等,但是总是感觉不舒服,不是自己控制的就有点不舒服,又开始了在网上找教程的过程,不能说千辛万苦吧,至少走了挺多弯路。
最开始只是想找个能够批量处理的方法,没想很多,只想把H264的视频转成H265(HEVC)好缩小体积,然后就发现还分CPU解码编码,GPU解码编码,网上的说法是同参数CPU处理的效果要比GPU好,同时CPU处理要比GPU满,我不理解为什么相同参数还会有不同,试过之后也没太看出来大区别,可能是我的原视频比较老,本来就很闹心。
由于当时配电脑的时候中了AMD的毒,CPU显卡都是A家的,而显然FFMPEG对N卡支持更好,又开始细究A卡到底能干啥,最后妥协了,只能用CPU解码,GPU编码,肯定要慢,幸亏我只是干这一点活,不然会疯的。
在网上随便找了一个bat脚本就开始跑,也没太看脚本内容,也看不太懂,然后就发现有部分视频跑完效果不行,又把Axiom打开研究格式、硬解、软解、画面大小、quality、CRF、字幕、音轨等等等等,终于调出来一个适合我的脚本。
跟大家简单分享一下我现在用的一个随时调整的脚本
@echo off
::在下方设置要处理的视频或音频格式,这里列出了一些主要的视频格式
set Ext=*.avi,*.mp4,*.wmv,*.flv,*.mkv,*.rmvb,*.rm,*.3gp,*.ts
md output
echo 开始视频转换
::在下方设置输出格式,这里输出为mp4,可自行更改
for %%a in (%Ext%) do (
echo 正在转换:%%a
ffmpeg -hwaccel d3d11va -i "%%a" -c:v hevc_amf -quality balanced -crf 18 -map 0:v? -attach 1.jpg -metadata:s:t mimetype=IMAGE/jpeg -c:a copy -map 0:a? -c:s copy -map 0:s? -f Matroska -threads 12 "output%%~na.mkv" -y
)
echo 转换完成
pause
简单说明一下我的操作和想法
set Ext=【这句话不太懂啥意思,就是在网上找的脚本原带的,我又把一些小姐姐的格式加上了】
md output【创建一个叫“output”的文件夹】
for···【这句也不用太管】
重点是ffmpeg开始这个
-hwaccel d3d11va【这句是从Axiom里抄的,是利用Direct3D 11解码视频】
-i 【输入文件】
-c:v【处理视频轨道(我是这么理解的,有错误的话希望评论区大佬指出来)】
hevc_amf【用amd显卡硬件编码(N卡的在网上随便一搜有的是,A卡的不好搜,从gui软件上抄的),需要用软件编解码的,可以直接用“libx265”,只是速度太慢,一般都不会超过1.5倍】
-quality balanced【质量速度平衡,对我来讲,老片子和小姐姐,用“balanced”就可以了,没再进行调试,有需求的可以自行调试,还有quality和speed,这个选项跟上一个命令有关,由于上一个选的是hevc_amf,这个才只有balanced,具体的可以参看Axiom的选项】
-crf 18【网上说,这个一般用19-28,HEVC转码默认28,这个数值是从0-51中选整数,数值越大,质量越差,也有说法是选18一般就是看不太出来了,我就选了18,可以自己调试】
-map 0:v?【map指的是选择输入视频轨道,具体轨道号可以通过在视频所在文件夹打开cmd或者powershell,利用“ffmpeg -i 输入文件名”查看,输出轨道号见下图,图中stream #0:0就是轨道号,第一个0指的是第一个文件,第二个0指的是第一个轨道,0:0就是第一个文件第一个轨道,0:1是第一个文件第二个轨道。相对应如果有两个文件输入,就是1:0指第二个文件第一个轨道-map中的0指的就是第一个文件,v指的是所有视频轨道,?指没有这类轨道就不选】
-c:a copy -map 0:a?和-c:s copy -map 0:s?【跟上面类似,选择音频(a)、字幕(s)轨道,直接复制,这里我没做处理,有需求的可以自己研究,另外还有一个附件轨道(t),在下面细说】
-f Matroska【输出格式为mkv,也可调成mp4等等,自选】
剩下的除了mkv这个后缀名需要根据-f参数修改外照抄即可
-attach 1.jpg【添加本文件夹内的“1.jpg”文件为附件】
-metadata:s:t【“-metadata:s”是从ffmpeg的说明里抄来的,具体意思不懂,“:t”是把这个元数据赋值到附件轨道,“t”指的就是附件】
mimetype=IMAGE/jpeg【是这个文件的mimetype值,我是将文件放到MKVToolNix附件栏里查到的,也可以添加字幕的字体,具体的可以自己查看ffmpeg的文档】
另外如果输入文件本身就有附件,想复制过去,可以直接使用“-map 0:t?”命令,同样复制章节和元数据使用“-map_chapters 0”和“-map_metadata 0”,上述的“0”都是指第一个输入文件
其余的参数需要调整的就需要自己查看ffmpeg的文档了,我嫌麻烦就没太调试
总的来说就是输入一个文件(-i),选择轨道(-map),处理轨道(-c),输出这么一个流程,其余各种参数,各种编解码器等等等等都可以自定义,还是需要更细致的研究才能搞懂。
上述11、12、13项是我自己摸索的,网上没找到相关教程,从ffmpeg的文档之查到一些蛛丝马迹编进去的,暂时还能运行,但是只是在mkv里运行过,mp4好像不太行,输出mp4时把附件识别为一个视频轨道,
这时候我就用的ffmpeg文档上说的命令
ffmpeg -i in.mp4 -i IMAGE -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out.mp4
根据说明的解释,这个命令是添加封面或缩略图
引用原文机翻,是如下说的,“但不是所有的复用器都支持嵌入的缩略图,那些支持的复用器只支持几种格式,如JPEG或PNG。”
也可以实现,具体原因和原理没太懂,希望有懂的大佬,可以讲解一下。
本文只是说明和记录一下近期转码视频的一点点心得,不是什么教程之类的,有需要可以参考,这个脚本就是可以使用,具体效果因人而异,具体参数看个人喜好,有不对的地方,希望各位大佬不吝赐教,万分感谢!
ffmpeg官网:http://ffmpeg.org/
ffmpeg文档:http://ffmpeg.org/ffmpeg.html
ffmpeg下载:http://ffmpeg.org/download.html
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
