milky

【ffmpeg简单上手】视频处理
视频编解码这块过于深奥,相关内容其他地方讲的更好,这里直接从实际应用开始同上一篇帖子提到,ffmpeg可以对不同格...
扫描右侧二维码阅读全文
10
2021/02

【ffmpeg简单上手】视频处理

视频编解码这块过于深奥,相关内容其他地方讲的更好,这里直接从实际应用开始

同上一篇帖子提到,ffmpeg可以对不同格式的媒体文件进行转换,以下将一个mkv转换为mp4为例

ffmpeg -i input.mkv output.mp4

一段最简单的代码,将input.mkv这个文件转成output.mp4,而事实上已经重新编码。以ffmpeg默认的模式即色彩空间不变,由源文件HEVC(265)
转为AVC(264),色深依然保持源文件的10bit,码率控制为crf 23。
指定一个编码器

ffmpeg -i input.mp4 -c:v libx264 output.mp4

码率控制
一般我们不会直接使用默认的编码模式,为了控制体积和质量,可以手动配置码率
使用恒定码率(不推荐)

ffmpeg -i input.mp4 -b:v 2000k output.mp4

使用固定速率系数 crf,范围0~51,建议在17~23之间

  
ffmpeg -i input.mp4 -crf 23 output.mp4

编码速度

ffmpeg -i input.mp4 -preset slower output.mp4

preset:ultrafast/superfast/veryfast/faster/fast/medium/slow/slower/veryslow/placebo
设置帧率 设置帧率为60帧

ffmpeg –i input.mp4 –r 60 output.mp4

播放速率不变

ffmpeg –r 60 –i input.mp4 output.mp4

播放速率增加
设定时间/切割视频

ffmpeg –i input.mp4 -ss 00:00:01 -to 00:01:00 output.mp4

从第一秒开始到第一分结束,格式为时/分/秒

ffmpeg –i input.mp4 -ss 00:00:01 -t 10 output.mp4

从第1秒开始,持续10秒钟

ffmpeg –i input.mp4 -ss 00:00:01 -t 10 output.mp4
复制代码

指定色彩空间为 yuv420p,自动转10bit为8bit

ffmpeg -i input.mp4 -pix_fmt yuv420p output.mp4
复制代码

8bit转10bit

ffmpeg -i input.mp4 -pix_fmt yuv420p10le output.mp4
复制代码

编码等级profile & level profile分为基线-主流-高级,对应的等级从1.0到5.1,等级越高压缩率越高,支持的参数也越多

ffmpeg -i input.mp4 -c:v libx264 -profile:v high -level 5.1 output.mp4
复制代码

预设

ffmpeg -i input.mp4 -tune animation output.mp4
复制代码

-tune:animation动画/film电影/stillimage静态图像/fastdecode快速编码/zerolatency低延迟
设定分辨率 设定分辨率为1920*1080

ffmpeg –i input.mp4 -s 1920*1080 output.mp4
复制代码

ffmpeg –i input.mp4 -vf scale=1920:1080 output.mp4
复制代码

等比例缩放

ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4
复制代码
缩放为原视频一半大小

ffmpeg -i input.mp4 -vf scale=iw0.9:ih0.9 output.mp4
复制代码
缩放为原视频90%
固定宽/高缩放

ffmpeg -i input.mp4 -vf scale=1920:-1 output.mp4
复制代码
固定宽度为1920

ffmpeg -i input.mp4 -vf scale=-1:1080 output.mp4
复制代码
固定高度为1080
指定视频流

ffmpeg -i input.mp4 -c:v copy -c:a copy output.mkv
复制代码
这个很有用,可以无损封装为其他格式

ffmpeg -i input.mp4 -c:v copy -an copy output.mkv
复制代码
仅保留视频,剔除音频,对应-vn剔除视频,-sn剔除字幕
选择流

ffmpeg -i input.mkv -map 0:v -map 0:a -c:v copy -c:a copy output.mkv
复制代码
选择第一个文件的音视频进行混流

实例(另存为bat)
将目录内所有mp4文件使用X264编码|预设为动画|等级high5.1|速度为更慢|crf18|音频编码为aac|质量为6|输出为源文件名mp4保存至 完成 文件夹

for %%a in ("*.mp4") do ffmpeg -i "%%~a" -c:v libx264 -tune animation -profile:v high -level 5.1 -preset slower -crf 18 -c:a aac -q:a 6 "完成/%%~na.mp4"
复制代码

为目录内所有的mp4文件,匹配与文件名相同的ass字幕,封装为mkv

for %%a in ("*.mp4") do ffmpeg -i "%%~a" -f ass -i "%%~na.ass" -map 0:v -map 0:a -map 1:s -c:v copy -c:a copy -c:s mov_text "完成/%%~na.mkv"
复制代码

把目录内所有的mp4/mkv文件从第1秒开始截取1分钟,并固定宽为720像素等比例缩放,另存为文件名_new在当前目录
for %%a in (".mp4" and ".mkv") do ffmpeg -i "%%~a" -c:v libx264 -ss 00:00:01 -to 00:01:00 -vf scale=-1:720 "%%~na_new.mp4"
复制代码

硬编码
目前芯片对硬编码的支持越来越完善,硬编码有着软编码无可比拟的性能,当然在质量上有所下降。
以qsv(Quick Sync Video) 为例,只要把编码器替换成h264/h265_qsv,并转换色彩空间为nv12,即可支持大部分的参数(当然不支持crf了)
我现在用的这个脚本,两天完成了超过500G的视频内容,节约了部分硬盘空间,同时带来更好的兼容性
你问我为啥不换资源,部分资源确实很难找

for %%a in (".mkv") do ffmpeg -i "%%~a" -filter_complex "subtitles='D:/文件/临时/%%~na.ass'" -pix_fmt nv12 -c:v h264_qsv -preset slower -s 19201080 -q:v 19 -c:a aac -q:a 6 "完成/%%~na.mp4"
复制代码

追加一段硬编码 没错就是用GPU 前提是需要GPU支持。比较多的是Intel QSV和Nvidia NVENC,QSV门槛低大部分处理器都支持(甚至某n3450)
NV的比较蛋疼,得自行确认,我手上这块940m并不支持,所以无法给出更多建议。
for %%a in (".mkv" and ".mp4") do ffmpeg -i "%%~a" -pix_fmt nv12 -c:v h264_qsv -preset slower -q:v 18 -c:a aac -q:a 6 "完成/%%~na.mp4"
复制代码
输出至 完成 这个文件夹,你也可以改成其他名称。
for %%a in (".mkv" and ".mp4") do ffmpeg -i "%%~a" -pix_fmt nv12 -c:v h264_nvenc -preset slower -q:v 18 -c:a aac -q:a 6 "完成/%%~na.mp4"
复制代码
NV用这个,理论上也可以。。如果可以使用 -pix_fmt yuv420p 颜色空间那更好,尝试一下。

Last modification:February 10th, 2021 at 09:22 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment