ffmpeg常用命令(不定期更新)

⌚Time: 2024-05-23 16:04:00

👨‍💻Author: Jack Ge

查看视频/音频信息

ffmpeg -i input.mp4

改变视频和音频编码格式

ffmpeg -i input.mp4 -c:v libx264 -c:a aac out.mp4

改变视频封装格式(保持编码格式)

ffmpeg -i input.mp4 -c copy output.flv

截取00:00:10到00:00:15之间的视频(如果出现音画不同步的问题,将-ss参数前置或不使用copy参数)

ffmpeg -i input.mp4 -vcodec copy -acodec copy -ss 00:00:10 -to 00:00:15 output.mp4

转换视频比例为3:4

ffmpeg -i input.mp4 -aspect 3:4 output.mp4

提取wav音频

ffmpeg -i input.mp4 -f wav output.wav

提取mp3音频

ffmpeg -i input.mp4 -f mp3 output.mp3
ffmpeg -i input.mp4 -vn -c:a copy output.aac

mp3转wav

ffmpeg -i input.mp3 -f wav output.wav2

提取从00:00:10.33到00:00:15.33的音频

ffmpeg  -i  input.mp3 -ss 00:00:10.33  -to  00:00:15.33  output.mp3

提取从00:00:10.33开始,持续10s的音频

ffmpeg  -i  input.mp3 -ss 00:00:10.33  -t  00:00:10  output.mp3

设置视频帧率25

ffmpeg -i input.mp4 -r 25 output.mp4

设置视频比特率1500k

ffmpeg -i input.mp4 -b:v 1500000 output.mp4

设置音频比特率352k

ffmpeg -i input.mp3 -b:a 352000 output.wav

控制输出文件大小80MB

-fs (file size首字母缩写) 
    ffmpeg -i input.avi -fs 80M output.mp4

计算输出文件大小
    (视频码率+音频码率) * 时长 /8 = 文件大小

提取音频一个通道

ffmpeg -i input.mp3 -ac 1 output.mp3

设置音频编码格式为pcm_f32le,单通道,采样率为22050

ffmpeg -i input.wav -acodec pcm_f32le -ac 1 -ar 22050 output.wav

录制桌面视频

 ffmpeg -f gdigrab -i desktop  -f flv output.flv

视频转yuv格式

ffmpeg -i input.mp4 -pix_fmt yuv420p output.yuv

yuv格式转视频(分辨率需要与原视频格式一致)

ffmpeg -s 640x480 -pix_fmt yuv420p -i input.yuv output.mp4

调整视频大小为320x240

 ffmpeg-i input.avi -vf scale = 320:240 output.avi

合并多个视频

将多个视频文件名写入到文件

videolist.txt

file 'outcut1.flv'
file 'outcut2.flv'

运行以下命令,实现将列表中的视频合并输出outcut.flv

ffmpeg -f concat -i videolist.txt -c copy outcut.flv

或者直接使用命令合并MPEG格式视频

ffmpeg -i "concat:video1.mpg|video2.mpg" -c:v copy -c:a copy output.mpg

关于拼接的视频没有声音的问题,如果第一个视频没有声音。后续拼接的视频也会默认没有声音。


从m3u8地址http://www.aabbcc.com/video/1.mp4.m3u8下载视频

ffmpeg -headers "referer: https://xx.com/" -i http://www.aabbcc.com/video/1.mp4.m3u8 -c copy -q 0 out.mp4

-q(-qscale) 指定视频转化清晰度 数值越小越清晰,范围0.01-255


限制cpu使用率使用-threads参数设置线程数 只使用一个cpu核心转码

ffmpeg -i input.mkv -threads 1 output.mp4

视频添加音频

ffmpeg -i video.mp4 -i audio.mp3 -c copy out.mp4

或者

ffmpeg  -i video.mp4 -i audio.mp3 -c copy -map 0:v:0 -map 1:a:0 videoWithAudio.mp4

-map 0:v:0 选择了第0个输入文件,视频输入,的第0个轨道 -map 1:a:0 选择了第1个输入文件,音频输入,的第0个轨道


提取视频中的纯音频/视频

ffmpeg -i input.mp4 -vn -c:a mp3 output.mp3
ffmpeg -i input.mp4 -c:v copy -an output.mp4

-vn表示不复制视频 -an表示不复制音频 -c:v表示视频格式 copy表示直接拷贝原始格式不重新编码 -c:a表示音频格式


查看ffmpeg支持的编码/解码格式

ffmpeg configure -encoders
ffmpeg configure -decoders

将b站m4s格式视频和音频合并为mp4格式

ffmpeg -i video.m4s -c:v mpeg4 -q 0 video.mp4
ffmpeg -i audio.m4s -i video.mp4 -c copy output.mp4

或者

ffmpeg -i audio.m4s -i video.m4s -c:v libx264 -c:a copy -q 0 out.mp4

-c:v mpeg4 视频编码格式mpeg4 -q 0 输出质量 0是最高


插入空白音轨

ffmpeg -i nightsky.mp4 -f lavfi -t 1 -i anullsrc=channel_layout=stereo:sample_rate=22050 nightsky.MP4

-f lavfi 编码格式 -t 1 音轨时长 -i anullsrc=channel_layout=stereo:sample_rate=22050 插入空白音轨,采样率22050

webbp转png图片

ffmpeg -i *.webp *.png

分割视频从0-10分钟和10分钟到结束的两部分

ffmpeg -i input.mp4 -t 00:10:00 -c copy part1.mp4 -ss 00:10:00 -c copy part2.mp4

调整视频音量

ffmpeg -i in.mp4 -vcodec copy -af "volume=10dB" out.mp4
ffmpeg -i in.mp4 -vcodec copy -af "volume=-10dB" out.mp4

裁剪画面

ffmpeg -i in.mp4 -vf crop=480:300:0:280 out.mp4
crop的参数格式为w:h:x:y,
w、h为输出视频的宽和高,
x、y标记输入视频中的某点,将该点作为基准点,向右下进行裁剪得到输出视频。
    如果x y不写的话,默认居中剪切

压缩视频大小调整分辨率为720p、480p。根据我的测试,用ffmpeg使用默认配置普通转码一下手机录制的画面都会压缩到很好的大小。而且看不出画面损失。

ffmpeg -i mobilevideo.mp4 out.mp4

如果压缩分辨率。会更加的减少视频体积。我用Sony Xperia XZ2 Compact拍摄的28秒1080p视频有60.7MB,经过分辨率压缩到720p只剩下了4.27MB。而且看不出任何的画质损失。

ffmpeg -i input.mp4 -vf scale=$w:$h out.mp4
ffmpeg -i input.mp4 -vf scale=1280:720 out.mp4
ffmpeg -i input.mp4 -vf scale=640:480 out.mp4

将一张图片和音频合并成一个视频

ffmpeg -loop 1 -i a.jpg -i b.aac -shortest -c:a copy -c:v hevc_amf -r 1 out.mp4

-loop 1 循环播放图片
-shortest 参数用于指定输出文件的持续时间与输入文件的最短持续时间相等
-c:a copy 音频编码保留一样
-c:v hevc_amf 视频编码hevc_amf(可以使用GPU进行硬编码,速度加快)
-r 1 设置帧率1,因为只有1张图片,帧率越低体积越少

对音频切片

ffmpeg -i in.aac -f segment -segment_time 1200 -c copy out%03d.aac
-f segment 切片
-segment_time 1200 切片长度1200秒

给视频添加srt硬字幕

ffmpeg -i in.mp4 -vf subtitles=talk.srt  out_srt.mp4

倒放视频和里面的音频

ffmpeg -i in.mp4 -vf reverse -af areverse out.mp4

视频拆分为图片,每秒钟5张

ffmpeg -i input.mp4 -vf "fps=5" output%d.jpg

视频旋转90度

ffmpeg -i in.mp4 -vf transpose=1 out.mp4

transpose是FFmpeg中的一个视频滤镜,用于旋转和翻转视频。它有以下几个取值:

transpose=1:顺时针旋转90度。
transpose=2:逆时针旋转90度。
transpose=3:旋转180度。
transpose=0:不进行旋转,保持原始方向。


对视频指定区域模糊

ffmpeg -i input.mp4 -filter_complex "[0:v]crop=100:100:200:300,boxblur=10[fg]; [0:v][fg]overlay=200:300[out]" -map "[out]" -map 0:a out.mp4

解析:

-filter_complex 设置复杂滤镜

第一条语句就是对视频需要模糊的部分进行裁剪然后使用进行模糊处理

[0:v] 选定输入的第1个视频的视频流(视频流的索引从0开始计数,如果是第二个视频流表示为[1:v]

crop=100:100:200:300 是裁剪视频区域,从左上角(200,300),大小是100x100

boxblur=10 对视频模糊处理,模糊程度为10,数值越大越是模糊

[fg] 处理后的视频流名,可以是任意名字

第二条语句是输入视频上方叠加模糊后的视频合成输出。

[0:v][fg]overlay=200:300[out] fg视频流叠加在输入的第1个视频流上面,位置是(200,300),输出视频流名字是[out]

-map "[out]" -map 0:a out.mp4 选定输出视频流out和第一个视频的音频流合成视频out.mp4


对视频指定区域之外的地方模糊

ffmpeg -i input.mp4 -filter_complex "[0:v]boxblur=10[bg];[0:v]crop=100:100:200:300[fg];[bg][fg]overlay=200:300[out]" -map "[out]" -map 0:a out.mp4

原理与对视频指定区域模糊差不多,只是改变了叠加顺序,模糊后的视频作为了背景,裁剪的视频作为前景。


转码视频时保存所有音轨和字幕

用ffmpeg转码时,发现只保留了原视频默认的一条音轨和字幕轨,保留所有的音频和字母轨可以使用-map 0命令选择第一个视频的所有的轨道

>ffmpeg -i input.mkv -map 0 output.mkv

但是有的会报错,提示字幕编码只支持的类型。而0:3轨道的字幕轨不能编码

Error initializing output stream 0:3 -- Subtitle encoding currently only possible from text to text or bitmap to bitmap
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (ac3 (native) -> vorbis (libvorbis))
  Stream #0:2 -> #0:2 (ac3 (native) -> vorbis (libvorbis))
  Stream #0:3 -> #0:3 (hdmv_pgs_subtitle (pgssub) -> ass (ssa))
  Stream #0:4 -> #0:4 (hdmv_pgs_subtitle (pgssub) -> ass (ssa))
  Stream #0:5 -> #0:5 (hdmv_pgs_subtitle (pgssub) -> ass (ssa))

只需要加入-c:s copy复制原字幕轨就可以了。

>ffmpeg -i input.mkv -map 0 -c:s copy output.mkv

另外,mkv格式的容器好像比mp4支持更多的轨道类型,编码出错会少。


对于DVD里面的VOB视频一些轨道并非视频需要的内容,如果直接用ffmpeg保留所有轨道输出到视频。有可能报错。

Only audio, video, and subtitles are supported for Matroska.

这时候需要手动选择音视频轨道,选择所有的音频和视频和字幕轨道

ffmpeg -i D:\VIDEO_TS\VTS_01_1.VOB -map 0:v -map 0:a -map 0:s C:\out.mkv

如果你只想选择特定的音频轨道,可以使用 -map 0:a:0-map 0:a:1 等来指定具体的音频轨道。


提取视频的第2条音轨

ffmpeg -i input.mkv -map 0:a:1 -c:a copy track2.aac

将一条音轨合并到视频里,保留视频原来的音轨

ffmpeg -i input_video.mp4 -i new_audio.aac -map 0:v -map 0:a -map 1:a -c:v copy -c:a copy -shortest output.mp4

-map 0:v:选择原视频的所有视频流(0:v 表示第1个输入文件的所有视频流)。

-map 0:a:选择原视频的所有音频流(保留所有原始音轨)。

-map 1:a:选择新音频文件的音轨(1:a 表示第2个输入文件的音频流)。

-c:v copy -c:a copy:视频和音频均直接复制,不重新编码(速度快)。

-shortest:以最短的流(视频或新音频)时长截断输出(可选,避免不同步)。

去除视频的元数据,字幕轨,附加轨道(字体等)

ffmpeg -i input.mkv -map 0 -map -0:s -map -0:t -map_metadata -1 -c copy output.mkv

-map 0:选择所有流。
-map -0:s:排除字幕。
-map -0:t:排除附件(如 TTF 字体)。
-map_metadata -1:去除元数据。
-c copy:不重新编码,快速处理。

偏移音频,相对视频左右声道各延迟2.5s

ffmpeg -i input.mp4 -c:v copy -af "adelay=2500|2500" out.mp4

偏移音频,相对视频提前2.5s

ffmpeg -i input.mp4 -c:v copy -af "adelay=0|0, aresample=async=1:first_pts=0, atrim=start=2.5" out.mp4