找回密码
 立即注册
快捷导航

[辅助工具] FFmpeg 指南:视频、音频、图片它全能批量编辑。

[复制链接]
seek 2024-10-4 10:04:26 | 显示全部楼层

FFmpeg 指南:视频、音频、图片它全能批量编辑。

作为一款开源的免费应用,FFmpeg 功能的丰富程度和便利性,让它俘获了一大批命令行用户。

在官方没有提供任何图形界面的情况下,了解核心使用场景、掌握基本的命令参数,会提高处理任务的效率。

· · ·

一、FFmpeg 基础


1. 名字从何而来

FFmpeg 这个名字不太好念,长得也有点奇怪。

FF 指的是 Fast Forwardmpeg 则是 Moving Picture Experts Group

2. 命令格式

ffmpeg {全局参数} {输入文件参数} -i {输入文件} {输出文件参数} {输出文件}

3. 基本命令参数

命令 简介 备注
-i 设置输入文件 input
-f 设置输出格式 format
-c copy 直接复制,不经过重新编码(这样比较快)
-c:v 设置视频编码器 相当于 -vcodec,是 -codec:v 的简写
-c:a 设置音频编码器 相当于 -acodec,是 -codec:a 的简写
-c:s 设置字幕编码器 相当于 -scodec,是 -codec:s 的简写
-b:v 设置输出视频的比特率 bit
-b:a 设置输出音频的比特率 bit
-ss 设置开始时间
-t 设置持续时间 单位为秒
-to 设置结束时间
-vf 创建和设置过滤图,并用它来过滤流
-vf scale= 设置输出视频的宽度和高度
-vf setsar= 设置过滤器输出视频的样本纵横比
-vf subtitles= 设置字幕
-loop 1 无限循环
-shortest 让生成的视频最短化
-vn 去除视频流 video not
-an 去除音频流 audio not
-ar 设置音频码率 audio rate
-ac 设置声道数 1:单声道;2:立体声;转换单声道的 TVrip 可以用 1(节省一半容量)
-frames:v 设置要输出的视频帧数 缩写:-vframes;相当于 -filter:v
-crf 质量控制 参数的设置范围是 0~50,数值越小代表清晰度越高,建议值域为 18~28。

备注:

关于 crf 的值:

量化器标度的范围是 0-51:其中 0 是无损,23 是默认值,51 是最坏的。较低的值表示较高的质量,主观上合理的范围是 18-28。

将 18 视为视觉无损或接近无损:它应该与输入看起来相同或几乎相同,但在技术上并非无损。

范围是指数级的,因此增加 CRF 值 +6 大约是比特率的一半,而 -6 大约是比特率的两倍。

一般用法是选择仍能提供可接受质量的最高 CRF 值。如果输出看起来不错,则尝试更高的值,如果看起来很差,则选择较低的值。

· · ·

二、FFmpeg 实例:截取


1. 视频截取

ffmpeg -i input_1.mp4 -ss 00:02:25 -to 00:05:34 -c copy output_1.mp4

ffmpeg -i input_1.mp4 -ss 00:02:25 -t 00:02:00 -c copy output_2.mp4

FFmpeg 截视频默认采用关键帧,所以输出的时间和设置的时间,可能有若干秒的误差。

2. 音频截取

ffmpeg -i input_1.mp3 -ss 00:02:24.5 -to 00:05:38 -c copy output_1.mp3

ffmpeg -i input_1.mp3 -ss 00:02:24.5 -t 00:02:00 -c copy output_2.mp3

3. 音频视频的淡入淡出

// 淡入淡出
ffmpeg -i input_1.flac -af "afade=t=in:st=1:d=2,afade=t=out:st=131:d=2" output_0.flac

// 淡入
ffmpeg -i input_1.flac -af "afade=t=in:st=0:d=3" output_1.flac

// 淡出
ffmpeg -i input_1.flac -af "afade=t=out:st=131:d=2" output_2.flac

· · ·

三、FFmpeg 实例:提取


1. 从视频提取音频

提取 mp3 格式:

// 推荐
ffmpeg -i input_1.mp4 output_3.mp3

ffmpeg -i input_1.mp4 -acodec libmp3lame output_1.mp3

ffmpeg -i input_1.mp4 -f mp3 -vn output_2.mp3

ffmpeg -i input_1.mp4 -f mp3 -ar 16000 output_4.mp3

提取 m4a 格式:

ffmpeg -i input_1.mp4 -acodec copy -vn output_1.m4a

提取 aac 格式:

ffmpeg -i input_1.mp4 -acodec copy -vn output_1.aac

提取 wav 格式:

ffmpeg -i input_1.mp4 -ac 1 -ar 16000 -f wav output_1.wav

ffmpeg -i input_1.mp4 -acodec pcm_s16le -f s16le -ac 1 -ar 16000 -f wav output_2.wav

2. 视频提取的某一帧

// 推荐
ffmpeg -i input_1.mp4 -ss 00:00:01 -frames:v 1 output_1.png

如果时间戳不靠前,提取速度会比较慢。这时直接用 PotPlayer 的图像截取会更快。

3. 视频提取封面

// 推荐
ffmpeg -i input_1.mp4 -map 0:v -map -0:V -c copy output_1.png

如果报错信息是:Output file #0 does not contain any stream,说明视频未附有封面。

没封面的视频,在文件浏览器看到的,只是解码器读到的关键帧缩略图。

· · ·

四、FFmpeg 实例:添加


1. 视频加硬字幕

// 推荐
ffmpeg -i input_1.mp4 -vf subtitles=input_1.ass -c:a copy output_1.mp4

直接复制音频可以防止音频被压缩。

2. 视频加软字幕

// 推荐
ffmpeg -i input_1.mp4 -i input_1.ass -c copy -c:s mov_text output_1.mp4

3. 视频加封面

// 推荐
ffmpeg -i input_1.mp4 -i input_1.png -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic 
output_1.mp4

4. 音频加封面

// 推荐
ffmpeg -i input_1.mp3 -i input_1.png -map 0 -map 1 -c copy -disposition:v:0 attached_pic output_1.mp3

· · ·

五、FFmpeg 实例:转码


1. dvd / iso 直转 mp4

ffmpeg -i input_1.iso -preset superfast -vf yadif -crf 18 output_1.mp4

2. vob 格式转 mkv

ffmpeg -i input_1.vob -preset superfast -crf 18 -c:a ac3 -c:s copy -map 0:1 -map 0:2 output_1.mkv

-c:a 是 -codec:a 的简写,冒号后面的 a 是 audio 音频的简写,s 是 subtitle 的简写。

这个参数用来指定视频、音频、字幕所采用的编码器,copy 表示沿用源视频的编码器。

0:0 是 DVD 的菜单,0:1 是视频部分,0:2 和 0:3 是音频部分,0:4 和 0:5 是字幕。

3. vob 格式转 mp4

// 码率约 2000,推荐
ffmpeg -i input_1.vob -preset superfast -crf 18 -c:a copy -map 0:1 -map 0:2 output_1.mp4

// 码率约 1500,速度太慢
ffmpeg -i input_1.vob -c:v libx264 -crf 18 -vf yadif -c:a ac3 -b:a 448k output_2.mp4

// 码率约 1000
ffmpeg -i output_1.vob -c:a copy -codec:v libx264 output_3.mp4

// 码率约 1000
ffmpeg -i input_1.vob -c:a aac -aq 100 -c:v libx264 -c:s mov_text -map 0:1 -map 0:2 
-movflags +faststart -vb 1000k -maxrate 1500k -bufsize 500k output_4.mp4

// 码率约 800
ffmpeg -i input_1.vob output_5.mp4

// 码率约 500
ffmpeg -i input_1.vob -preset superfast -crf 28 -c:a ac3 output_6.mp4

// 码率约 400
ffmpeg -i input_1.vob -vcodec mpeg4 -b:a 1200k -mbd 2 -flags +mv4 -trellis 2 -cmp 2 -subcmp 2 
-metadata title=output output_7.mp4

// 码率约 300,分辨率改变
ffmpeg -i input_1.vob -vcodec libx265 output_8.mp4

· · ·

六、FFmpeg 实例:合并


1. 无损合并 mp4

// 推荐(数量少的话)
(echo file 'input_1.mp4' & echo file 'input_2.mp4')>input_1.txt
ffmpeg -safe 0 -f concat -i input_1.txt -c copy output_1.mp4

// 转成 ts 再合并
ffmpeg -i input_1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i input_2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4

// 批量合并文件夹下的 mp4
(for %i in (*.mp4) do @echo file '%i') > list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy output_1.mp4

// 批量合并文件夹下的 mp4,包含隐藏文件
for /f "delims=" %a in ('dir /b/a-d *.mp4') do (echo file '%cd%\%a' >> list.txt)
ffmpeg -f concat -safe 0 -i list.txt -c copy output_1.mp4

2. 音频和图片合并,转成视频

// 推荐
ffmpeg -loop 1 -i input_1.jpg -i input_1.mp3 -c:v libx264 -c:a aac -b:a 330k -vf scale=1080:1080 
-shortest output_1.mp4

// 如果是无损音频格式,例如 flac,可以封装进 mkv 里
// 同样的画质,libx265 压制的视频体积更小,但对机器性能要高点,介意的可以选 libx264
ffmpeg -loop 1 -i input_1.png -i input_1.flac -c:v libx265 -c:a copy -shortest output_1.mkv

// 把图片转成不带音频的视频
ffmpeg -loop 1 -i hr-1.png -c:v libx265 -t 292 output_1.mkv

· · ·

七、FFmpeg 实例:图片压缩


1. 图片转码压缩

ffmpeg -i input.png output_1.jpg

ffmpeg -i input.png output_1.webp

ffmpeg -i input.png output_1.bmp

2. 图片压缩

ffmpeg -i input_1.png -vf palettegen=max_colors=256:stats_mode=single output_1.png

ffmpeg -i input_1.png -i tmp.png -lavfi "[0][1:v] paletteuse" -pix_fmt pal8 output_1.png

3. 图片长宽像素减半

// 推荐
ffmpeg -i input.png -vf "scale=iw/2:ih/2" output.png

· · ·

总结


FFmpeg 基本能满足我对视频、音频的处理需求,部分图片需求也是用它处理。

学完之后最划算的地方,就是能够迅速处理大批量的任务。

比如上百张图片的格式转换、压缩、去水印、加水印等等。

比如时常需要做无损合并视频,FFmpeg 支持的格式很多,写个脚本能一直复用,还能和其他任务一起做成流水线,这样效率就更高了。

最后,要说有什么不满意的地方,就是跑出来的成品偶尔会有些小问题。

比如无损合并视频之后,时间轴可能会出现偏差,特别是几分钟的小视频,出问题的概率更高。当然也可能因为源视频有问题。

· · ·

相关


提示

本文中所有的 input. 和 output. 都是文件名示例,在使用命令时,需要替换成实际的文件名或者路径名。

参考链接

[官网] FFmpeg 官方英文文档

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

温馨提示

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

Archiver|手机版|小黑屋|DLSite

GMT+8, 2024-10-18 18:27

Powered by Discuz! X3.5 and PHP8

快速回复 返回顶部 返回列表