【ffmpeg简单上手】视频处理教程

视频编解码这块过于深奥,相关内容其他地方讲的更好,这里直接从实际应用开始
图片应用详情见:【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

播放速率增加

[ad]
设定时间/切割视频

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 1920*1080 -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 颜色空间那更好,尝试一下。

© 版权声明
THE END
扫码关注微信公众号,更多精彩
点赞0打赏 分享
二月 12

本站历史上的今天