ffmpeg buddy 填参数生成指令: https://evanhahn.github.io/ffmpeg-buddy/
ffmpeg常用指令
1.安装
用的系统是Ubuntu18.04,所以直接apt-get就可以了
sudo apt-get install ffmpeg
也可以到官网 http://ffmpeg.org/download.html
从这里选择操作系统,下载编译好的程序使用。
2.简介
使用 ffmpeg 命令 的基本形式是
ffmpeg [全局参数] {[输入文件参数] -i 输入文件地址} ... {[输出文件参数] 输出文件地址}
查看ffmpeg帮助
ffmpeg -h
查看媒体参数信息
ffmpeg -i video_file.mp4
ffmpeg -i audio_file.mp3
过滤文件无关的信息(ffmpe本身信息)
ffmpeg -i video_file.mp4 -hide_banner
3.音视频片段截取
-ss HH:mm:ss 起始时分秒
-t HH:mm:ss 截取时长。时分秒形式
-t 5 截取时长。多少秒
-to HH:mm:ss 结束位置。时分秒形式
视频音频的指令格式相同。
按起始时间截取
ffmpeg -i music.mp3 -ss 00:00:30 -to 00:02:00 -acodec copy music_cutout.mp3
按长度截取60秒
ffmpeg -i music.mp3 -ss 00:00:30 -to 60 -acodec copy music_cutout60s.mp3
4.音视频格式转换
支持的格式
ffmpeg -formats
查看编解码器
ffmpeg -codecs
单个输出
ffmpeg -i video.mp4 video_avi.avi
指定多个输出
ffmpeg -i audio_input.wav audio_output_1.mp3 audio_output_2.ogg
保留原始视频质量
ffmpeg -i video_input.wav -qscale 0 video_output.mp4
指定编码器
使用 -c:a (音频) 和 -c:v (视频) 来指定编码器名称。copy表示与源文件相同:
ffmpeg -i video_input.mp4 -c:v copy -c:a libvorbis video_output.avi
无损编码格式.flac转换编码
ffmpeg -i music_flac.flac -acodec libmp3lame -ar 44100 -ab 320k -ac 2 music_flac_mp3.mp3
说明:
acodec: audio Coder Decoder 音频编码解码器
libmp3lame: mp3解码器
ar: audio rate:音频采样率
44100: 设置音频的采样率44100。若不输入,默认用原音频的采样率
ab: audio bit rate 音频比特率
320k: 设置音频的比特率。若不输入,默认128K
ac: aduio channels 音频声道。若不输入声道数,默认采用源音频的声道数
5.音视频压缩
音频文件可以降低比特率(使用 -b:a 或 -ab)进行压缩:
ffmpeg -i audio_input.mp3 -ab 128k audio_output.mp3
ffmpeg -i audio_input.mp3 -b:a 192k audio_output.mp3
常用比特率: 96k, 112k, 128k, 160k, 192k, 256k, 320k。值越大文件体积就越大。
视频降低视频比特率 (通过 -b:v):
ffmpeg -i video_input.mp4 -b:v 1000k -bufsize 1000k video_output.mp4
视频的比特率和音频不同(一般要大得多)。
使用 -crf 参数 (恒定质量因子)。较小的crf 意味着较大的码率。同时使用 libx264 编码器有助于减小文件体积。如下例子,压缩的不错,质量也不会显著变化:
ffmpeg -i video_input.mp4 -c:v libx264 -crf 28 video_output.mp4
crf 设置为20 到 30 是最常见的,不过您也可以尝试一些其他的值。
降低帧率(往往让视频看起来很卡):
ffmpeg -i video_input.mp4 -r 24 video_output.mp4
-r 指示了帧率 (这里是 24)。
压缩音频降低视频文件体积,比如设置为立体声或者降低比特率:
ffmpeg -i video_input.mp4 -c:v libx264 -ac 2 -c:a aac -strict -2 -b:a 128k -crf 28 video_output.mp4
Note: -strict -2 和 -ac 2 是来处理立体声部分的。
6.音视频提取
6.1.视频中提取音频
-vn参数表示舍弃图像。
ffmpeg -i video.mp4 -vn audio.mp3
ffmpeg -i video.mp4 -vn -acodec copy video_novideo.m4a
指定音频比特率。 -ab 同 -b:a。
ffmpeg -i video.mp4 -vn -ab 128k audio.mp3
一些常见的比特率有 96k, 128k, 192k, 256k, 320k (mp3也可以使用最高的比特率)。
常用参数
-ar (采样率: 22050, 441000, 48000)
-ac (声道数)
-f (音频格式, 通常会自动识别的)
ffmpeg -i video.mov -vn -ar 44100 -ac 2 -b:a 128k -f mp3 audio.mp3
具备多个音频流/音轨的,如
Stream #0:2[0x81]:Audio:ac3,48000Hz,5.1,s16,384kb/s
Stream #0:3[0x82]:Audio:ac3,48000Hz,5.1,s16,384kb/s
Stream #0:4[0x80]:Audio:ac3,48000Hz,5.1,s16,448kb/s
针对性的单一的提取,例如提取第2条,用指令: -map 0:3
6.2.视频静音
-an舍弃音频。即单独提取视频,不含音频流。
ffmpeg -i video_input.mp4 -an -video_output.mp4
ffmpeg -i video.mp4 -vcodec copy -an video_silent.mp4
7.合并音视频
音频+视频
ffmpeg -i video_novideo.m4a -i video_silent.mp4 -c copy video_merge.mp4
多个视频合并
ffmpeg -i "concat:01.mp4|02.mp4|03.mp4" -c copy out.mp4
不同格式的音视频可以连接在一起,但不推荐不同格式连接在一起。
多视频文件合并,创建一个文本文件join.txt:
file '/home/ubuntu/Desktop/video_1.mp4'
file '/home/ubuntu/Desktop/video_2.mp4'
file '/home/ubuntu/Desktop/video_3.mp4'
ffmpeg -f concat -safe 0 -i join.txt output.mp4
8.视频与图片
8.1.截图
截取序列帧
ffmpeg -i video.mp4 -r 1 -f image2 image-%3d.png
-r 代表了帧率(每秒内导出几张图像,默认25),
-f 代表了输出格式(image2 实际上上 image2 序列的意思)。
image-%3d 文件名。%3d表示三位数字序列(000, 001, '..n'.)
截取单张
第7秒第1帧的画面
ffmpeg -i video.mp4 -ss 7 -vframes 1 video_image.jpg
截取动图
ffmpeg -i video.mp4 -ss 7.5 -to 8.5 -s 640×320 -r 15 video_gif.gif
8.2.图片合成视频
cat my_photos/* | ffmpeg -framerate 1 -f image2pipe -i - -c:v copy video.mkv
帧率 (-framerate) 设置为1,每秒显示1张图片。默认是23fps,一秒播放23张图片。
cat my_photos/* | ffmpeg -framerate 0.40 -f image2pipe -i - -i audio.wav -c copy video.mkv
使用音频文件作为输入 (-i audo_file) 并且设定copy音频编码 (-c:a copy). 你可以同时为音频和视频设定编码器,在输出文件前设置就可以了。你要计算一下音频文件的长度和图片张数,已确定合适的帧率。比如我的音频文件是22秒,图片有9张,那么帧率应该是 9 / 22 大约0.4
9.视频水印添加
ffmpeg -i video.mp4 -i qt.png -filter_complex “overlay=20:80″ video_watermark.mp4
10.其它
10.1.视频增加字幕
ffmpeg -i video.mp4 -i subtitles.srt -c:v copy -c:a copy -preset veryfast -c:s mov_text -map 0 -map 1 output.mp4
10.2.音乐文件增加封面图片
ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4
只要改一下编码设置 (-c:v 是 视频编码, -c:a 是音频编码) 和文件的名称就能用了。
10.3.读取视频信息
ffmpeg -i src.mp4
可以显示视频生成时间、分辨率、帧率等。
10.4.读取视频中的音量
ffmpeg -i input.mp4 -filter_complex "showwavespic=s=640x120" -frames:v 1 output.png
得到一张640x120像素的图片,显示整个视频的音量波形图。
11.录制
11.1.直播
本地文件rtmp流直播
ffmpeg -re -i rec.mp4 -f flv "rtmp地址"
ffmpeg -re -stream_loop -1 -fflags +genpts -i ~/dd/ss.mp4 -vcodec copy -acodec copy -strict -2 -f flv -y rtmp://demo.liveqing.com:10085/hls/mai1
ffmpeg -re -i "a.mp4" -acodec aac -ar 32000 -vcodec copy -f flv "rtmp://wst.zhihuishu.com/livepkgr/r004_1?k=097f"
rtmp固定时间推流:
ffmpeg.exe -ss 00:02:45 -re -i "a.mp4" -acodec aac -ar 32000 -vcodec copy -f flv "rtmp://wst.zhihuishu.com/livepkgr/r06_1?k=b07f"
直播视频存储到本地
ffmpeg -i http://ivi.bupt.edu.cn/hls/cctv5phd.m3u8 -c:a copy -c:v copy d:\2018ve.mp4
ffmpeg -i http://livepgc.sobeycache.com/pgc/d831b248a3f.m3u8?auth_key=15619dadf7231 -c:v copy -c:a copy d:\we1.mp4
ffmpeg -i http://livepgc.sobeycache.com/pgc/d885ff.m3u8?auth_key=1561f7231 -c:v copy -c:a copy -f mp4 d:\wenk1.mp4
-f mp4参数,实现实时转码,但是这样会增加系统开销
11.2.录音
Linux上同时使用 ALSA 和 pulseaudio 处理声音,在系统音频设置里,能看到默认的录音设备。Debian系列的发行版默认pulseaudio。 ffmpeg 可以录制两者。
在 pulseaudio, 必须强制指定(-f) alsa ,然后指定 default 作为输入t (-i default):
ffmpeg -f alsa -i default output.mp3
指定编码器以及帧率:
ffmpeg -i /dev/video0 -f alsa -i default -c:v libx264 -c:a flac -r 30 output.mkv
在录屏/录像时不直接录音,用音频文件作为声音输入:
ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 -i audio.wav -c:a copy output.mp4
如果音频文件太短可能不会保存文件。
11.3.录屏
ffmpeg -f gdigrab -i desktop rec.mp4
ffmpeg -f fbdev -framerate 10 -i /dev/fb0 rec.mp4
gdigrab :ffmpeg中的一个组件,只捕获视频。若要录屏同时录音、获取摄像头、麦克风,使用用OBS Studio软件。
-f 设定为x11grab,抓取XSERVER
-i 屏幕编号(一般都是0:0)
-s 指定屏幕分辨率。-s 参数放在-i参数之前。
ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4
按 q 或者 CTRL+C 以结束录制屏幕
自动屏幕分辨率录制:
ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 output.mp4
11.4.摄像头
linux上设备都是在/dev中的,比如 /dev/video0, /dev/video1, etc.:
ffmpeg -i /dev/video0 output.mkv
12.过滤器基本使用
https://eyehere.net/2019/the-complete-guide-for-using-ffmpeg-in-linux/
使用 过滤的基本格式是:
ffmpeg -i input.mp4 -vf "filter=setting_1=value_1:setting_2=value_2,etc" output.mp4
ffmpeg -i input.wav -af "filter=setting_1=value_1:setting_2=value_2,etc" output.wav
可以指定视频过滤器 (-vf, -filter:v的简写) 和 音频过滤器 (-af, -filter:a的简写). 过滤器的内容写到双引号里面 (“) 并且可以使用逗号(,)连接。你可以使用任意数量的过滤器(我写了个etc代表更多的,这不是做一个真实的过滤器)。过滤器不同的值使用冒号分割。
12.1.视频图像缩放
非过滤器方式
-s参数
ffmpeg -i video_input.mov -s 1024x576 video_output.mp4
使用 -c:a 来保证音频编码是正确的:
ffmpeg -i video_input.h264 -s 640x480 -c:a video_output.mov
更改长宽比
ffmpeg -i video_input.mp4 -aspect 4:3 video_output.mp4
示例:
ffmpeg -i video.mp4 -s 1920×1080 -pix_fmt yuv420p -vcodec libx264 -preset medium -profile:v high -level:v 4.1 -crf 23 -acodec aac -ar 44100 -ac 2 -b:a 128k video_avi.avi
说明:
-s 1920×1080: 缩放视频新尺寸(size)
-pix_fmt yuv420p: pixel format,用来设置视频颜色空间。参数查询:ffmpeg -pix_fmts
-vcodec libx264: video Coder Decoder,视频编码解码器
-preset medium: 编码器预设。参数:ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow,placebo
-profile:v high: 编码器配置,与压缩比有关。实时通讯-baseline,流媒体-main,超清视频-high
-level:v 4.1: 对编码器设置的具体规范和限制,权衡压缩比和画质。
-crf 23: 设置码率控制模式。constant rate factor-恒定速率因子模式。范围0~51,默认23。数值越小,画质越高。一般在8~28做出选择。
-r 30: 设置视频帧率
-acodec aac: audio Coder Decoder-音频编码解码器
-b:a 128k: 音频比特率.大多数网站限制音频比特率128k,129k
过滤器方式
设定width 和 height:
ffmpeg -i input.mp4 -vf "scale=w=800:h=600" output.mp4
带有数学运算的值:
ffmpeg -i input.mkv -vf "scale=w=1/2*in_w:h=1/2*in_h" output.mkv
尺寸w、h分别变成了输入尺寸(in_w, in_h)的1/2.
12.2.视频图像裁剪
指定裁剪的原点(默认是视频的中心)
从左上角开始裁剪 (x=0:y=0):
ffmpeg -i input.mp4 -vf "crop=w=1280:h=720:x=0:y=0" output.mp4
从视频的中心点裁剪(因为没有给x和y坐标):
ffmpeg -i input.mkv -vf "crop=w=400:h=400" output.mkv
带有数学计算的裁剪:
ffmpeg -i input.mkv -vf "crop=w=3/4*in_w:h=3/4*in_h" output.mkv
这会把视频裁剪剩下原大小的3/4 。
12.3.视频图像旋转
指定一个弧度,顺时针旋转视频。简单算法:角度*PI/180:
第一个命令将视频顺时针旋转90°:
ffmpeg -i input.avi -vf "rotate=90*PI/180"
第二个则是上下颠倒了视频(翻转了180°):
ffmpeg -i input.mp4 -vf "rotate=PI"
顺时针旋转90°
ffmpeg -i 源.mp4 -vf "transpose=1" 新.mp4
逆时针旋转90°
ffmpeg -i 源.mp4 -vf "transpose=2" 新.mp4
水平翻转
ffmpeg -i 源.mp4 -vf hflip 新.mp4
垂直翻转
ffmpeg -i 源.mp4 -vf vflip 新.mp4
逆时针旋转90°后再水平翻转
ffmpeg -i 源.mp4 -vf "transpose=3" 新.mp4
等效于:
ffmpeg -i 源.mp4 -vf "transpose=2,hflip" 新.mp4
顺时针旋转90°后再水平翻转
也可以理解为水平翻转后逆时针旋转90°
ffmpeg -i 源.mp4 -vf "transpose=0" 新.mp4
等效于:
ffmpeg -i 源.mp4 -vf "transpose=1,hflip" 新.mp4
旋转180°
直接让右旋2次
ffmpeg -i 源.mp4 -vf "transpose=1,transpose=1" 新.mp4
顺时针旋转45°
使用rotate进行旋转,不改变源图像分辨率,背景为黑色。
ffmpeg -i 源.mp4 -vf rotate=PI/4 新.mp4
【有时小米手机拍的视频】须要先顺时针转90度,再将新视频逆时针转90度,才能得到正常视频。
12.4.音频声道重映射
左声道为0,右声道为1。减号左边的数字是输入,右边的数字是输出。
只有右声道有声音的音频,同时在左右声道发出:
ffmpeg -i input.mp3 -af "channelmap=1-0|1-1" output.mp3
只有左声道有声音的音频,同时在左右声道发出:
ffmpeg -i input.mp3 -af "channelmap=0-0|0-1" output.mp3
12.5.更改音量
将音量变为1.5倍:
ffmpeg -i input.wav -af "volume=1.5" output.wav
让音量变成了原来的1/4那么安静:
ffmpeg -i input.ogg -af "volume=0.75" output.ogg
增加音量10分贝(降低就用负数):
ffmpeg -i inputfile -vcodec copy -af "volume=10dB" outputfile
提示音量为原来的1*3倍(降低2倍,参数为volume=0.5):
ffmpeg -i input.mp4 -af volume=3 out.mp4
12.6.更改播放速度
纯视频
视频过滤器是 setpts (PTS = presentation time stamp),数值越大越慢,越小越快,调整范围为[0.25,4]。设原速度为1。
播放速度加倍,比原速度快一倍,1/2:
ffmpeg -i input.mkv -vf "setpts=0.5*PTS" output.mkv
播放速度降低了一半,比原先慢一倍,1*2:
ffmpeg -i input.mp4 -vf "setpts=2*PTS" output,mp4
纯音频
过滤器atempo设置声音的播放速度,调整范围[0.5, 2.0],数字越小越慢,越大越快。
速度降低,1*0.75,变为原速度的0.75倍:
ffmpeg -i input.wav -af "atempo=0.75" output.wav
速度加快到原来的4=2*2倍:
ffmpeg -i input.mp3 -af "atempo=2.0,atempo=2.0" ouutput.mp3
有音频的视频
可以按照声音的速度进行调整,比如速度调快到1.45倍,那么基于声音和图像原速度1,声音1*1.45=1.45,图像1/1.45=0.689655。
ffmpeg -i input_video.mp4 -filter_complex "[0:v]setpts=0.689655*PTS[v];[0:a]atempo=1.45[a]" -map "[v]" -map "[a]" out_video.mp4
新视频按原视频速度的1.45倍速度进行播放,
可以在命令中加上指定fps(-r 60)防止丢帧。
官方教程
http://ffmpeg.org/ffmpeg-all.html
网络资源:
https://howvideo.works/#ffmpeg
- end
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/2764.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设