Win的安装
- 打开FFmpeg的官方网站:http://ffmpeg.org/
- 下载网址:https://ffmpeg.zeranoe.com/builds/,选择版本window 64-bit、static静态
- 配置环境变量 : 我的电脑—》右键—》属性—》高级系统设置—》环境变量—》用户变量—》Path
3.开始验证,cmd后 执行命令 ffmpeg
centos7/centos8 简洁安装ffmepg
简洁安装
# centos8
>sudo yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm
>sudo yum install -y http://rpmfind.net/linux/epel/7/x86_64/Packages/s/SDL2-2.0.14-2.el7.x86_64.rpm
>sudo yum install -y ffmpeg
# centos7
>sudo yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
>sudo yum install -y http://rpmfind.net/linux/epel/7/x86_64/Packages/s/SDL2-2.0.14-2.el7.x86_64.rpm
>sudo yum install -y ffmpeg
按步骤安装
>wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2
>tar jxvf ffmpeg-4.2.2.tar.bz2
>cd ffmpeg-4.2.2/
>./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-version3 --enable-pthreads --enable-shared --enable-libmp3lame --enable-libx264 --enable-pic --enable-libfdk-aac --enable-openssl --enable-nonfree
>make && make install
如果./configure报错
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
yum install yasm
或者:
>wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
>tar xvf yasm-1.3.0.tar.gz
>cd yasm-1.3.0
>./configure
>make
>make install
2.libx264
>wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2
>tar xvf x264-master.tar.bz2
>cd x264-master
>./configure --prefix=/usr/x264/ --includedir=/usr/local/include --libdir=/usr/local/lib --enable-shared
>make && make install
3.libfdk-aac
>wget https://downloads.sourceforge.net/opencore-amr/fdk-aac-2.0.1.tar.gz
>tar zxvf fdk-aac-2.0.1.tar.gz
>cd fdk-aac-2.0.1
>./configure --disable-static
>make && make install
4.libtool: line 1762: g++: command not found
yum install gcc*
5. openssl
# yum -y install openssl-devel
>wget http://mirrors.ibiblio.org/openssl/source/old/1.0.2/openssl-1.0.2k.tar.gz
>tar -xvf openssl-1.0.2k.tar.gz
>cd openssl-1.0.2k
>./config shared
>make && make install
6.gnutls, lame,faac
# yum -y install gnutls gnutls-devel
# yum -y install lame lame-devel
# yum -y install faac faac-devel
检索、推流
ua = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
rf = "referer防盗链地址"
_from = "直播流地址"
_ua = '-user_agent "{}"'.format(ua)
_rf = '-headers "Referer: {}"'.format(rf)
_push = "目的地址或本地路径"
# ffprobe检索直播流命令(携带-user_agent -referer)
_ping = 'ffprobe {} {} -v quiet -print_format json -show_format "{}"'.format(_ua, _rf, _from)
# ffmpeg推流命令(携带-user_agent -referer)
cmd = 'ffmpeg {} {} -i "{}" -c copy -f flv {}'.format(_ua, _rf, _from, _push)
其他常用参数
# 复制源的视频及音频编码,不转码
-c copy
# 复制音频,视频转码为h264
-acodec copy
-vcodec h264
# 转码-视频码率
# ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow and placebo.
-preset:v veryfast
# 转码-视频帧率为20
-r 20
# 转码-视频比特率为固定值
-b 1024k
# 转码-视频帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:
# sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-s size
# 转码-视频横纵比 4:3 16:9 或 1.3333 1.7777
-aspect aspect
# 转码-视频顶部、底部、左、右切除带大小 像素单位
-croptop size
-cropbottom size
–cropleft size
–cropright size
# 转码-视频顶部补齐的大小 像素单位
-padtop size
-padbottom size
–padleft size
–padright size
# 转码-补齐条颜色(hex,6个16进制的数,红:绿:兰排列,比如 000000代表黑色)
–padcolor color
# 转码-在视频左上角(x=20,y=25的位置)加遮盖层(w=80,h=25大小),色块颜色(color=white),透明度(1为不透明)
-vf drawbox=x=20:y=25:w=80:h=25:color=white@1:t=fill
# 转码-取视频画面的第一帧制成封面jpg
ffmpeg -i file.mp4 -vf "select=eq(pict_type\,I)" -frames:v 1 -pix_fmt yuvj422p -vsync vfr -qscale:v 2 -f image2 file.jpg -y
录制直播
play_url = "直播流地址"
path = "./file.mp4" # 保存文件路径
cmd = 'ffmpeg -i "{}" -y -c:v libx264 -strict -2 {}'.format(play_url, path)
压缩视频
ffmpeg -i pingcap-intro-converted.mp4 -b:v 64k -r 20 -c:v libx264 -s 640x320 -strict -2 pingcap.mp4
ffmpeg -i testfile.mp4 -vcodec copy -acodec copy testfile.flv
ffmpeg -i input.mp4 -vcodec libx264 -crf 20 output.mp4 #采用H.264视频压缩算法和AAC音频压缩算法,视频帧率10fps,音频码率32k
获取封面
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-ss 表示开始时间
-t 表示共要多少时间。
如此,ffmpeg会从input.mp4的第20s时间开始,往下10s,即20~30s这10秒钟之间,每隔1s就抓一帧,总共会抓10帧。
视频剪切
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
为视频添加logo
右上角:
ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4
左下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4
右下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4
去掉视频的logo
语法:-vf delogo=x:y:w:h[:t[:show]]
x:y 离左上角的坐标
w:h logo的宽和高
t: 矩形边缘的厚度默认值4
show:若设置为1有一个绿色的矩形,默认值0。
ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4
转换gif
ffmpeg -i input_video.mp4 -vframes 30 -y -f gif output.gif
#将视频转成 gif 将输入的文件从 (-ss) 设定的时间开始以 10 帧频率,输出到 320x240 大小的 gif 中,时间长度为 -t 设定的参数。
ffmpeg -ss 00:00:00.000 -i input.mp4 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif
截去底部40像素高度
ffmpeg -i in.mp4 -filter:v "crop=in_w:in_h-40" -c:a copy out.mp4
剪辑视频和裁剪视频画面
#从30s开始截取10秒的视频并封装进h264,aac编码的out.mp4里
ffmpeg -i in.mp4 -ss 00:00:30 -t 00:00:10 -acodec aac -vcodec h264 -acodec aac out.mp4
#将1920x1080的视频截取中间的1080x1080部分,crop的参数选择为width:height:x:y,width:height为裁剪后的视频分辨率,x:y为裁剪出来的左上角的点的坐标,故本视频需要为x轴(1920-1080)/2=420,y轴不变故用0占位。
ffmpeg -i in.mp4 -vf crop=1080:1080:420:0 -acodec aac out.mp4
视频(音频)变速
视频变速使用-filter:v setpts=参数,音频变速使用-filter:a atempo=参数
#将视频调整为0.5倍速
ffmpeg -i in.mp4 -filter:v setpts=0.5*PTS out.mp4
#音频变速为原先的两倍
ffmpeg -i in.mp3 -filter:a atempo=2.0 out.mp3
在视频的第8.01秒处截取 352*240 的缩略图
ffmpeg -i test2.asf -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg
提取视频中的音频
ffmpeg -i input.mp4 -acodec copy -vn output.mp3
// -vn: 去掉视频;-acodec: 音频选项, 一般后面加copy表示拷贝
去掉视频中的音频
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
// -an: 去掉音频;-vcodec:视频选项,一般后面加copy表示拷贝
m3u8的下载
ffmpeg -i https://douban.donghongzuida.com/20200914/9641_dc8ea6b2/1000k/hls/index.m3u8 -threads 6 t9.mp4
使用详解
ffmpeg -c:v h264_cuvid -i 1.mp4 -s 1280:720 -r 29.97 -b:v 600k -c:v h264_nvenc 1-1.mp4
命令说明:
-c:v 这个是-vocdec的缩写 意思是编解码方式
-c:v h264_cuvid 这个的意思就是使用英伟达GPU解码
-i 这个是输入的意思
1.mp4 这个是要输入的文件
-s 这个是设置分辨率
-r 这个是设置帧速率(fps)
-b:v 这个是设置指定比特率(bits/s),似乎ffmpeg是自动VBR的,指定了就大概是平均比特率
-c:v h264_nvenc 这个的意思是使用英伟达GPU编码
1-1.mp4 这个是输出文件
一定要注意!!!
解码必须放在输入文件的前面,不然会报错。(当然我的是这样,具体情况视不同环境而定
具体的使用案例
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i "1.mp4" -threads 6 -c:v h264_nvenc -b:v 400k "new1.mp4"
-hwaccel cuvid:使用cuvid进行硬件加速
-c:v h264_cuvid:使用h264_cuvid进行解码
-c:v h264_nvenc:使用h264_nvenc进行编码
-b:v 2000k:Video Bitrate,我的源(1080P)的原始vb大概是4100k左右,高清片的这个参数数值估计应该就在4000k上下;压到2000k大概属于“画质确实能感觉到变差但勉强能看”的程度吧(但反正我主要是存移动设备上方便查看就无所谓了)。
参考时间: 长度两个半小时,大小接近5个G的片子压完大概用了十分钟不到。
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i "input.ts" -map 0 -vcodec copy -acodec copy -f matroska "output.mkv"
视频文件转M3U8:
ffmpeg -re -i input.mp4 -c -copy -f hls -bsf:v h264_mp4toannexb output.m3u8:从文件转换HLS直播
ffmpeg -re -i input.mp4 -c -copy -f hls -bsf:v h264_mp4toannexb -start_number 300 output.m3u8:设置M3U8列表中的第一片的序列数
ffmpeg -re -i input.mp4 -c -copy -f hls -bsf:v h264_mp4toannexb -hls_time 10 output.m3u8:设置M3U8列表中切片的duration
推流:
ffmpeg -re -i 100.mov -vcodec copy -acodec aac -f flv -b:v 500k -b:a 40k -s 352x288 -y rtmp://127.0.0.1:1935/live/livestream
多路推流:
ffmpeg -i "rtmp://127.0.0.1:1935/live/livestream1" -i "rtmp://127.0.0.1:1935/live/livestream2" -acodec aac -f flv -b:v 500k -b:a 40k -s 352x288 -y -filter_complex overlay=20:16 "rtmp://127.0.0.1:1935/live/livestream"
截取部分视频
crop的参数格式为w:h:x:y,
w、h为输出视频的宽和高,
x、y标记输入视频中的某点,将该点作为基准点,向右下进行裁剪得到输出视频。
如果x y不写的话,默认居中剪切
ffmpeg -i in.mp4 -filter:v "crop=1900:900:100:500" -threads 5 -preset ultrafast -y -c:a copy out.mp4 // 截取部分视频,宽1900,高900的视频
Docker FFMPEG 转 H265 命令
docker run --rm -it \
-v $(pwd):/config \
linuxserver/ffmpeg \
-i /config/output_set.mp4 \
-c:v libx265 -crf 30 -map 0:v -map 0:a:0 \
/config/New_x265.mp4
使用 FFMPEG 转 H265 减小文件大小
ffmpeg -i input.mp4 -c:v libx265 -crf 30 -map 0:v -map 0:a:0 output.mp4
crf越高,压缩率越高,值是30-100
未完待续…