视频编解码这块过于深奥,相关内容其他地方讲的更好,这里直接从实际应用开始
图片应用详情见:【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 颜色空间那更好,尝试一下。
- 最新
- 最热
只看作者