http://www.ffmpeg.org/download.html
如下载过慢,可以找我要安装包,qq:1206154726
下载后解压直接就可调用
from ffmpy3 import FFmpeg
ff = FFmpeg(inputs={r'C:\Users\ht-desktop-001\Desktop\1.mp4': None},
outputs={r'C:\Users\ht-desktop-001\Desktop\1.avi': None})
print(ff.cmd)
ff.run()
# 转视频格式,需要的话可以配环境变量
#如果找不到ffmpeg,则修改源码绝对路径,在ffmpy3.py中
https://johnvansickle.com/ffmpeg/release-source/
下载后解压缩
xz -d ffmpeg-4.1.tar.xz
tar -xf ffmpeg-4.1.tar
确保系统有gcc和yasm(如果没有则下载)
yum install gcc
安装yasm
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
gunzip yasm-1.3.0.tar.gzcd yasm-1.3.0
tar -xf yasm-1.3.0.tar
cd yasm-1.3.0
./configure
make && make install
cd ~
cd ffmpeg-4.1
./configure --enable-shared --prefix=/usr/local/ffmpeg #输入如下命令/usr/local/ffmpeg为自己指定的安装目录
make & make install
# 也可分开1.make 2.make install
修改文件/etc/ld.so.conf(也可不用)
vim /etc/ld.so.conf
输入以下内容
include ld.so.conf.d/*.conf
/usr/local/ffmpeg/lib/
输入ldconfig使修改生效。
输入: /usr/local/ffmpeg/bin/ffmpeg -version
或: /root/ffmpeg-4.1/ffmpeg -version
附录:
# 如果此句还找不到so文件,吧lib文件需要加到环境变量中
export LD_LIBRARY_PATH=/home/compile_ffmpeg/build/lib/ # 临时 配置之后最好运行一下:# ldconfig
在~/.bashrc 或者 ~/.bash_profile 中加入 export 语句(永久)
vim ~/.bash_profile
export LD_LIBRARY_PATH=/root/project/code/tree_hole_gpt/ffmpeg/lib/ # 文件末尾添加
视频相关
格式转换
.
# 命令: ffmpeg -i source target
# 例如avi转mp4
ffmpeg -i input.avi output.mp4
提取视频(从视频中提取音频)
# 命令: ffmpeg -i input -acodec type -vn output
# 例如mp4提取音频一般为aac,某些格式可能会报错
ffmpeg -i input.mp4 -acodec aac -vn output.aac
提取音频(只保留视频而不保留音频)
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
视频剪切
# 从时间为00:00:15开始,截取5秒钟的视频
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
ffmpeg -ss 00:00:00 -to 00:05:23 -i imput.mp4 -y -f mp4 -vcodec copy -acodec copy -q:v 1 output.mp4
参数说明:
-ss 指定要截取的视频的起始时间。
-to 指定要截取的视频的终止时间。
-i 输入文件,这里指的就是视频文件。
-y 表示无需询问,直接覆盖输出文件(如果有原文件的话)。
-f 指定输出视频的格式。
-acodec 指定音频编码格式。copy表示编码格式不发生改变,直接复制原来的编码格式,这样会大大提升速度。
-vcodec 指定视频编码格式。copy表示编码格式不发生改变,直接复制原来的编码格式,这样会大大提升速度。
-q:v 1 q是质量,v是视频,v的取值范围是[1, 35],取值1的时候,对应着最佳的视频质量。
添加字幕
# mp4添加软字幕
ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4
# mkv添加软字幕
ffmpeg -i input.mkv -i subtitles.srt -c copy output.mkv
# 硬字幕
ffmpeg -i end_font.mp4 -vf subtitles=words.srt -y output.mp4
码率控制
一个视频源的码率太高了,有10Mbps,文件太大,想把文件弄小一点,但是又不破坏分辨率
# 将码率将为2Mbps
ffmpeg -i input.mp4 -b:v 2000k output.mp4
ffmpeg官方wiki比较建议,设置b:v时,同时加上 -bufsize,用于设置码率控制缓冲器的大小,
设置的好处是,让整体的码率更趋近于希望的值,减少波动。
# 设置为码率在2Mpbs波动
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
-minrate最小码率,-maxrate最大码率
# 码率最大不超过2500k
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
编码转换
比如一个视频的编码是MPEG4,转换为H264编码
ffmpeg -i input.mp4 -vcodec h264 output.mp4
修改分辨率
将输入的1920x1080缩小到960x540输出
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
添加图片(可以用于给视频添加logo)
# 将图片添加到视频中,默认在左上角
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
# 右上角
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w 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]]
ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4
截取画面
# r表示每一秒几帧,-q:v表示存储jpeg的图像质量,一般2是高质量。
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
如此,ffmpeg会把input.mp4,每隔一秒,存一张图片下来
# -ss表示开始时间,-t表示共要多少时间
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
如此,ffmpeg会从input.mp4的第20s时间开始,往下10s,即20~30s这10秒钟之间,每隔1s就抓一帧,总共会抓10帧
视频拼接
ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
提取图像的频率,-ss 开始时间,-t 持续时间
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi //剪切视频
视频中生成gif图片
ffmpeg -i capx.mp4 -t 10 -s 320x240 -pix_fmt rgb24 jidu1.gif
// -t参数表示提取前10秒视频
// -s 表示按照 320x240的像素提取
ffmpeg -ss 0 -t 4 -i C:\Users\Yi\Desktop\4.74a8ed67.mp4 -s 1000*660 -r 15 res.gif
-ss 0秒开始
-t 4秒结束
视频导出成多张图片(取帧)
ffmpeg -i output.mp4 -r 30 -f image2 foo-%05d.jpeg
ffmpeg -i video.mp4 frames_%05d.png
帧合并视频
ffmpeg -i frames_%05d.png -vcodec mpeg4 test.mp4
ffmpeg -y -framerate 25 -i D:\video\frames_%05d.png -vcodec mpeg4 test.mp4
ffmpeg -y -framerate 24.0 -i "D:/Temp/img/img.%04d.png" -c:v libx264 -crf 30 -preset:v ultrafast -pix_fmt yuv420p -vf "scale=960:-2" "D:/Temp/output.mov"
参数:
y 将所有需要确认的操作默认为yes
-framerate 或 -r , 为帧率,默认25
-i “D:/Temp/img.%04d.png” 为输入图片的命名格式
-c:v 为视频编码格式, libx264表示使用H.264, 这种格式文件体积较小
H.264又有四种画质等级,baseline, extended, main, high
使用 -level 指定,1.0 、 2.0 、 3.0 或 4.0
-vf 为视频过滤器video filter,其中scale为resolution,-2表示保持原有比例,输入图片是720x540的,输出后视频的默认尺寸放大了,变为960x(540*960/720)
–preset的参数主要调节编码速度和质量的平衡,有ultrafast(转码速度最快,视频往往也最模糊)、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这10个选项,从快到慢。
-crf:v 为视频质量参数 constant rate factor,0-51,0为无损,51为最糟画质,默认23
-pix_fmt 为像素模式pixel format,最常用格式为yuv420p, 其它yuv444p, rgb555le等
查看视频总帧数
ffprobe test.mp4 -select_streams v -show_entries stream=nb_frames -of default=nk=1:nw=1 -v quiet
获取视频的总时长
ffprobe test.mp4 -select_streams v -show_entries stream=duration -of default=nk=1:nw=1 -v quiet
ffprobe -i input -show_entries format=duration -v quiet -of csv="p=0"
按间隔帧来提取视频中的帧(从第1帧取到第1000帧,隔4帧取一次)
ffmpeg -i test.mp4 -vf "select=between(n\,1\,1000)*not(mod(n\,4))" -vsync 0 image_%05d.jpg
按时间间隔取帧(每0.5秒取一帧)
ffmpeg -i test.mp4 -vf "select=(gte(t\,0.5))*(isnan(prev_selected_t)+gte(t-prev_selected_t\,0.5))" -vsync 0 aaaaaaa_%05d.jpg
查看视频信息
ffprobe -v quiet -show_format -show_streams -print_format json test.mp4
录屏
ffmpeg -f gdigrab -i desktop -q:v 0.01 -vcodec mpeg4 -f mp4 out.mp4
-i 输入设备
-vcodec 视频编码格式
-f 视频封装格式
缺点只能录制视频,不能录制音频
使用ffmpeg播放pcm音频
ffplay.exe -ar 16000 -ac 1 -f s16le -i 111.pcm
格式转换
ffmpeg -i input.mp3 output.wav
# 转换过程中也可以指定其他参数
ffmpeg -i null.ape -ar 44100 -ac 2 -ab 16k -vol 50 -f mp3 null.mp3
ffmpeg.exe -ar 16000 -ac 1 -f s16le -i test1.raw test1.mp3
ffmpeg.exe -ar 16000 -ac 1 -f s16le -i test1.raw test1.wav
-i代表输入参数
-acodec aac(音频编码用AAC)
-ar 设置音频采样频率
-ac 设置音频通道数
-ab 设定声音比特率
-vol <百分比> 设定音量
# wav 文件转 16k 16bits 位深的单声道pcm文件
ffmpeg -y -i 16k.wav -acodec pcm_s16le -f s16le -ac 1 -ar 16000 16k.pcm
# 44100 采样率 单声道 16bts pcm 文件转 16000采样率 16bits 位深的单声道pcm文件
ffmpeg -y -f s16le -ac 1 -ar 44100 -i test44.pcm -acodec pcm_s16le -f s16le -ac 1 -ar 16000 16k.pcm
# mp3 文件转 16K 16bits 位深的单声道 pcm文件
ffmpeg -y -i aidemo.mp3 -acodec pcm_s16le -f s16le -ac 1 -ar 16000 16k.pcm
// -acodec pcm_s16le pcm_s16le 16bits 编码器
// -f s16le 保存为16bits pcm格式
// -ac 1 单声道
// -ar 16000 16000采样率
百度文档: https://ai.baidu.com/ai-doc/SPEECH/7k38lxpwf
音频合成
# 直接拼接
ffmpeg -i "concat:input1.mp3|input2.mp3|input3.mp3" -c copy output.mp3
# 或者混合在一起
ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT
音视频合成
如果音频比视频长,就会停在最后一帧继续播放音频
ffmpeg -i a.wav -i a.avi out.avi
截取音频
ffmpeg64.exe -i 124.mp3 -vn -acodec copy -ss 00:00:00 -t 00:01:32 output.mp3
录制命令
# 录制屏幕,输出到d:/out.mp4
ffmpeg -f gdigrab -i desktop -f mp4 d:/out.mp4
# -r设置帧率
此命令用于录制视频,无法录制声音,按q退出
录制音频
# 查看设备
ffmpeg -f dshow -list_devices true -i dummy
# 录制麦克风
ffmpeg -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -acodec libmp3lame audio.mp3
# 录制系统声音,立体声看不见可能是被禁用了
ffmpeg -f dshow -i audio="立体声混音 (Realtek High Definition Audio)" -acodec libmp3lame audio.mp3
同时录制音频视频
# 录制屏幕和系统声音
ffmpeg -f dshow -i audio="立体声混音 (Realtek High Definition Audio)" -f gdigrab -i desktop -f mp4 d:/out.mp4
# 录制屏幕和麦克风
ffmpeg -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -f gdigrab -i desktop -f mp4 d:/out.mp4
os.system(
f'{self.ffmpeg} -y -i {old_path} -vframes 1 '
f'{os.path.join(self._desktop_path, dir_name)}.jpg > NUL 2>&1')