笔记笔记
  • Home
  • AI&ML
  • Example
  • Zoo
  • 关于
⌘ K
ffmpeg
macOS 遇到的问题
最后更新时间:
Copyright © 2023-2024 | Powered by dumi | GuoDapeng | 冀ICP备20004032号-1 | 冀公网安备 冀公网安备 13024002000293号

TABLE OF CONTENTS

‌
‌
‌
‌

ffmpeg

CentOS Stream 9

期待安装ffmpeg version 5.1.4版本。

dnf install -y --nogpgcheck https://dl.fedoraproject.org/pub/epel/epel-release-latest-$(rpm -E %rhel).noarch.rpm
dnf install -y --nogpgcheck https://dl.fedoraproject.org/pub/epel/epel-next-release-latest-$(rpm -E %rhel).noarch.rpm
dnf install -y --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm
dnf install -y --nogpgcheck https://mirrors.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-$(rpm -E %rhel).noarch.rpm
dnf update
dnf config-manager --set-enabled crb
dnf install epel-release epel-next-release
dnf install -y ffmpeg ffmpeg-devel
ffmpeg -version
ffprobe -version

CentOS 8

官方编译方法: https://trac.ffmpeg.org/wiki/CompilationGuide/Centos

yum install yasm x264-devel zlib-devel -y
wget http://www.ffmpeg.org/releases/ffmpeg-5.1.2.tar.gz
tar -zxvf ffmpeg-5.1.2.tar.gz
make clean
./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264
make
make install
## 如果没有安装上 x264,可以尝试自己编译一个
wget https://code.videolan.org/videolan/x264/-/archive/stable/x264-stable.tar.gz
tar -zxvf x264-stable.tar.gz
./configure --prefix=/usr/local/x264 --enable-shared --enable-static --disable-asm
make
make install
wget http://www.ffmpeg.org/releases/ffmpeg-5.1.2.tar.gz
tar -zxvf ffmpeg-5.1.2.tar.gz
make clean
./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 \
--enable-pthreads \
--extra-cflags=-I/usr/local/x264/include \
--extra-ldflags=-L/usr/local/x264/lib
make
make install
wget http://www.ffmpeg.org/releases/ffmpeg-5.1.2.tar.gz
tar -zxvf ffmpeg-5.1.2.tar.gz
make clean
./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264
make
make install
vi /etc/profile
export PATH=$PATH:/usr/local/ffmpeg/bin
source /etc/profile
## 这个命令声称需要的依赖,但是貌似不是必须执行
yum install autoconf automake bzip2 cmake freetype-devel gcc gcc-c++ git libtool make mercurial pkgconfig zlib-devel x264-devel
## 下面安装的版本太低了
yum update -y
yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm -y
yum install http://rpmfind.net/linux/epel/7/x86_64/Packages/s/SDL2-2.0.14-2.el7.x86_64.rpm -y
yum install ffmpeg ffmpeg-devel -y
## 卸载软件
yum remove ffmpeg ffmpeg-devel -y
ffmpeg -version
ffprobe -version

获得媒体信息

ffprobe -show_streams -v quiet -of json -i <file>

查看支持的滤镜

ffmpeg -filters
ffmpeg -formats
ffmpeg -encoders | grep 264
ffmpeg -codecs |grep 264

把视频转换成 QuikTime 支持的格式

ffmpeg -y -i output.mp4 -c:v libx264 -pix_fmt yuv420p -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" output1.mp4
## -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" 能解决长宽不能被2整除的问题。
ffmpeg -y -i 1.mov -vf "scale=1920:1080" -pix_fmt yuva444p10le -vendor apl0 -c:v prores_ks -r 30 444.mov
## -c:v prores_ks 带透明通道的视频

剪裁视频一段时间

ffmpeg -i 1.mp4 -ss 0 -t 5 -c:v libx264 cut.mp4

调整素材尺寸

ffmpeg -y -i 1.png -vf "scale=1920:1080" cut.png
ffmpeg -y -i 1.mp4 -vf "scale=1920:1080" -c:v libx264 cut.mp4

转场

ffmpeg -y \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-filter_complex "[0][1]xfade=transition=fade:duration=1:offset=4,format=yuv420p" \
-c:v libx264 out.mp4
ffmpeg -y \
-i 3.mp4 \
-i 4.mp4 \
-filter_complex "[0][1]xfade=transition=fade:duration=2:offset=3,format=yuv420p" \
-c:v libx264 out.mp4
ffmpeg -y \
-i 1.mp4 \
-i 2.mp4 \
-filter_complex "[0]trim=start=0:end=5,setpts=PTS-STARTPTS[v0];[v0][1]xfade=transition=fade:duration=2:offset=3,format=yuv420p[video];[0]atrim=start=0:end=5[a0];[a0][1]acrossfade=44100:2:1:c1=tri:c2=tri[audio]" \
-map "[video]" \
-map "[audio]" \
-movflags +faststart \
-c:v libx264 \
-c:a aac \
out.mp4
## 音频视频分开处理

叠加视频

ffmpeg -y \
-i 1.mp4 \
-i 1.mov -ss 0 -t 15 \
-filter_complex "[0][1]overlay=0:0,format=yuv420p[video];[0]volume=2[a0];[1]atrim=start=0:end=15,volume=0.3[a1];[a0][a1]amix=inputs=2:duration=longest[audio]" -map "[video]" \
-map "[audio]" \
-movflags +faststart \
-c:v libx264 \
-c:a aac \
output.mp4
## overlay=0:0 视频遮盖
ffmpeg -y \
-i t1.mp4 \
-i 444.mov -ss 0 -t 15 \
-filter_complex "[1]boxblur=10[v1];[0][v1]overlay=0:0,format=yuv420p[video];[0]volume=2[a0];[1]atrim=start=0:end=15,volume=0.3[a1];[a0][a1]amix=inputs=2:duration=longest[audio]" -map "[video]" \
-map "[audio]" \
-movflags +faststart
-c:v libx264 \
-c:a aac \
output.mp4
## boxblur=10 模糊效果
ffmpeg -y \
-i 1.mp4 \
-i 2.mp4 \
-filter_complex "\
[1]format=yuva444p,colorchannelmixer=aa=0.5[v1];\[0][v1]overlay=0:0,format=yuv420p" \
-c:v libx264 \
-c:a aac \
output.mp4
## format=yuva444p 为视频提供了透明通道
ffmpeg -y \
-i 2.mp4 \
-i 1.mp4 \
-filter_complex "\
[1]format=yuva444p,colorchannelmixer=aa=0.5,setpts=PTS-STARTPTS+(2/TB)[v1];\
[0][v1]overlay=0:0:enable='between(t,2,4)'[video];\
[0]volume=0.2[a0];\
[1]adelay=2000|2000[a1];\
[a0][a1]amix[audio]\
" \
-map "[video]" \
-map "[audio]" \
-pix_fmt yuv420p -c:v libx264 -r 30 -c:a aac -ar 44100 output.mp4
## setpts=PTS-STARTPTS+(2/TB) 视频延迟 2 两秒
## :enable='between(t,2,4)' 设置得加的时间段
## adelay=2000|2000 竖线两侧表示两个声道,延迟2000毫秒

视频变速

ffmpeg -y \
-i 1.mp4 \
-filter_complex "[0]setpts=0.5*PTS[video];[0]atempo=2.0[audio]" \
-map "[video]" -map "[audio]" \
-pix_fmt yuv420p -c:v libx264 -r 30 -c:a aac -ar 44100 output.mp4

镜像视频

## hflip 垂直轴;vflip 水平轴
ffmpeg -y \
-i 1.mp4 \
-filter_complex "[0]hflip" \
-pix_fmt yuv420p -c:v libx264 -r 30 -c:a aac -ar 44100 output.mp4

生成高清 GIF

ffmpeg -y -i 1.mp4 -ss 00:00 -f image2 -vframes 1 -vf scale=540x960 g1.jpg
ffmpeg -y -i 2.mp4 -ss 00:00 -f image2 -vframes 1 -vf scale=540x960 g2.jpg
ffmpeg -y -i g%d.jpg -vf palettegen palette.png
ffmpeg -y -framerate 2 -f image2 -i g%d.jpg -i palette.png -lavfi scale=540x960,paletteuse -loop 0 output.gif

推流

# 比较费电
ffmpeg -re -stream_loop -1 -i a.mp4 -c:v libx264 -c:a aac -f rtsp rtsp://192.168.2.200:8554/live_01
# 比较省电
ffmpeg -re -stream_loop -1 -i a.mp4 -c copy -f rtsp rtsp://192.168.2.200:8554/live_01

其他例子

ffmpeg -i 1.mov -hide_banner
变速
ffmpeg -y -i t1.mp4 -filter:v "setpts=0.1*PTS" -c:v libx264 -c:a aac -r 30 cut.mp4
ffmpeg -y -i t1.mp4 -filter_complex "[0]setpts=0.1*PTS[video];[0]atempo=10.0[audio]" -map "[video]" -map "[audio]" -c:v libx264 -c:a aac -r 30 output.mp4
剪辑对应时间视频
ffmpeg -i 0.mp4 -ss 1000 -t 15 -c:v libx264 cut.mp4
ffmpeg -i 1.mp4 -ss 0 -t 15 -c:v libx264 3.mp4
ffmpeg -i 2.mp4 -ss 0 -t 5 -c:v libx264 4.mp4
视频转码兼容 QuikTime
ffmpeg -y -i output.mp4 -c:v libx264 -pix_fmt yuv420p -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" output1.mp4
-vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" 可以用来兼容不能被二整除的问题
统一素材大小
ffmpeg -y -i 1.png -vf "scale=128:110" 3.png
ffmpeg -y -i 2.png -vf "scale=128:110" 4.png
ffmpeg -y -i 1.mov -vf "scale=1920:1080" -pix_fmt yuva444p10le -vendor apl0 -c:v prores_ks -r 30 444.mov
制作专场,素材需要尺寸统一
图片转场
ffmpeg -y -loop 1 -t 5 -i 3.png -loop 1 -t 5 -i 4.png -filter_complex "[0][1]xfade=transition=fade:duration=1:offset=4,format=yuv420p" -c:v libx264 output.mp4
视频转场
ffmpeg -y -i cut.mp4 -i cut1.mp4 -filter_complex "[0][1]xfade=transition=fade:duration=2:offset=3,format=yuv420p" -c:v libx264 -c:a aac output.mp4
ffmpeg -y -i 3.mp4 -i 4.mp4 -filter_complex "[0][1]xfade=transition=diagbl:duration=2:offset=3,format=yuv420p" -c:v libx264 output.mp4
offset=4 会在指定时间开始淡入淡出效果 类似剪裁了视频
format=yuv420p 用来兼容 QuikTime
ffmpeg -y -i 0.mp4 -i t1.mp4 -filter_complex "[0]trim=start=2000:end=2005,setpts=PTS-STARTPTS[v0];[v0][1]xfade=transition=fade:duration=2:offset=3,format=yuv420p[video];[0]atrim=start=2000:end=2005[a0];[a0][1]acrossfade=44100:2:1:c1=tri:c2=tri[audio]" -map "[video]" -map "[audio]" -movflags +faststart -c:v libx264 -c:a aac output1.mp4
ffmpeg -y -i cut.mp4 -i cut1.mp4 -filter_complex "[0][1]overlay=125:125:alpha=0.6:enable='between(t,0,2)'" -pix_fmt yuv420p -c:v libx264 output.mp4
ffmpeg -y -i 3.mp4 -i 4.mp4 -filter_complex "[1]format=yuva444p,colorchannelmixer=aa=0.5[v1];[0][v1]overlay=0:0,format=yuv420p" -c:v libx264 -c:a aac output.mp4
ffmpeg -y -i t1.mp4 -i 444.mov -ss 0 -t 15 -filter_complex "[1]boxblur=10[v1];[0][v1]overlay=0:0,format=yuv420p[video];[0]volume=2[a0];[1]atrim=start=0:end=15,volume=0.3[a1];[a0][a1]amix=inputs=2:duration=longest[audio]" -map "[video]" -map "[audio]" -movflags +faststart -c:v libx264 -c:a aac output.mp4
ffprobe -select_streams v -show_entries format=duration,size,bit_rate,filename -show_streams -v quiet -of csv="p=0" -of json -i test.mp4
ffprobe -select_streams v -show_entries format=duration,size,bit_rate,filename -show_streams -v quiet -of json -i
ffprobe -show_streams -v quiet -of json -i
缺失音轨的,添加音轨
ffmpeg -y \
-f lavfi -i anullsrc=r=44100:cl=stereo \
-i 6232_1666937024.mp4 \
-filter_complex "[1]trim=start=0:end=5,setpts=PTS-STARTPTS,scale=1080:1920[video];[0]atrim=start=0:end=5[audio]" \
-map "[video]" \
-map "[audio]" \
-pix_fmt yuv420p -c:v libx264 -r 30 -c:a aac -ar 44100 out1.mp4
匹配视频与音频的时间长度
ffmpeg -y \
-f lavfi -i anullsrc=r=44100:cl=stereo \
-i 100.mov \
-filter_complex "[1]trim=start=0:end=7,setpts=PTS-STARTPTS,scale=1080:1920[video];[0]atrim=start=0:end=7[a0];[1]atrim=start=0:end=7[a1];[a0][a1]amix=inputs=2:duration=longest[audio]" \
-map "[video]" \
-map "[audio]" \
-pix_fmt yuv420p -c:v libx264 -r 30 -c:a aac -ar 44100 out2.mp4
连接视频
ffmpeg -y \
-i out1.mp4 \
-i out2.mp4 \
-i out1.mp4 \
-i out2.mp4 \
-filter_complex "[0:0][0:1][1:0][1:1][2:0][2:1][3:0][3:1]concat=n=4:v=1:a=1[video][audio]" \
-map "[video]" \
-map "[audio]" \
-pix_fmt yuv420p -c:v libx264 -r 30 -c:a aac -ar 44100 concat.mp4
视频转场
ffmpeg -y \
-i out1.mp4 \
-i out2.mp4 \
-i out1.mp4 \
-i out2.mp4 \
-filter_complex "\
[0][1]xfade=transition=fade:duration=2:offset=4[v1];\
[v1][2]xfade=transition=fade:duration=2:offset=10[v2];\
[v2][3]xfade=transition=fade:duration=2:offset=14[video];\
[0:a][1:a]acrossfade=d=1:c1=tri:c2=tri[a1];\
[a1][2:a]acrossfade=d=1:c1=tri:c2=tri[a2];\
[a2][3:a]acrossfade=d=1:c1=tri:c2=tri[audio]\
" \
-map "[video]" \
-map "[audio]" \
-pix_fmt yuv420p -c:v libx264 -r 30 -c:a aac -ar 44100 output.mp4
注意如果你遇到安装不上,403 什么的,可以早点休息,上班时间试试。不行就过几天试试,再不行可能就是真不行了。