ASR/CV/ML      ffmpeg常用指令   
文章目录  [隐藏]



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
可以显示视频生成时间、分辨率、帧率等。

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

承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设