- 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')
-