ffmpeg命令

哔站下载合并

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
#sh
SHPATH=`readlink -f $0`
SHDIR=`dirname $SHPATH`

cd "$SHDIR"
#file
TMP_PATH=tmp.txt
LIST_PATH=list.txt


#
find ./ -type f -name "*.mp4" |grep -v out.mp4|sed 's#^.\/##'|sort  > $TMP_PATH

#
>$LIST_PATH
while read LINE
do
    LINE_NEW=`echo $LINE `
    echo "file '$LINE_NEW'" >> $LIST_PATH
done < $TMP_PATH

/usr/local/bin/ffmpeg -f concat -safe 0  -i $LIST_PATH -c copy -y out.mp4
1
2
3
4
5
6
#查看硬件状态
nvidia-smi

#硬件加速
ffmpeg -hwaccel auto -i input.mp4 output.mp4
ffmpeg -hwaccel auto -i input.flv output.mp4

下载视频流

视频转码

1
ffmpeg -i "$LINE"  -c copy -y -bsf:v h264_mp4toannexb -f mpegts  $VIDEO_OUT/$i.mp4

并行合并音视频,将其混合

1
2
#音视频混合
ffmpeg -i 59.mp4 -i 59.m4a -acodec copy -vcodec copy 1111.mp4

(相同码率)视频串联拼接

1
2
3
4
5
6
7
#视频串联
#将要合并的文件名写入到list.txt,输出名为out.mp4
ffmpeg -f concat -safe 0  -i list.txt -c copy out.mp4

#注!!!list.txt,需要加入'file''字段,范例
file /volume1/Download/2022-11-19/卡尔2022-11-19_020001.mp4
file /volume1/Download/2022-11-19/卡尔2022-11-19_224701.mp4

(不同码率)视频串联拼接

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#先查看需要合并视频是否是同一码率,如果不是进行统一封装
ffmpeg -i test.mp4

#需要先要要合并的视频进行统一封装:h264_mp4toannexb
ffmpeg -i head.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts head1.mp4
ffmpeg -i test.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts test1.mp4
ffmpeg -i foot.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts foot1.mp4

#flv to mp4
VIDEO_OUT='[2024-06-29 20-06-27][卡尔][【提前开播加油】重生之接单赚钱].flv'
OUT_MP4='卡尔直播回放2024-06-29_[土匪、VS怪兽、如初、啵啵、kelly、贝拉(四月)].mp4'
ffmpeg -i "$VIDEO_OUT" -c copy -bsf:v h264_mp4toannexb -f mpegts -y "$OUT_MP4"



#将视频放入list.txt
echo "head1.mp4 test1.mp4 foot.mp4" >list 
#将要合并的文件名写入到list.txt,输出名为out.mp4
ffmpeg -f concat -safe 0  -i list.txt -c copy  -y out.mp4

#################################################################################

获取分辨率

1
ffmpeg -i  head.mp4 2>&1|grep Video:|awk '{print $11}'

获取视频时长

1
2
3
4
5
6
#获取视频信息过滤 Duration行
$ /volume1/@appstore/ffmpeg/bin/ffmpeg -i 卡尔2022-12-08.mp4 2>&1|grep Duration
  Duration: 04:34:27.92, start: 0.000000, bitrate: 2156 kb/s
#awk截取时间
$ /volume1/@appstore/ffmpeg/bin/ffmpeg -i 卡尔2022-12-08.mp4 2>&1|grep Duration|awk -F ' |,' '{print $4}'
04:34:27.92

分割视频:按时间戳

ffmpeg -i [源文件] -ss [起始时间] -to [结束] -c copy [输出文件]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#将src.mp4从00:00:00到1:00:00的视频截取出来,输出名为out.mp4
ffmpeg -i '卡尔直播回放2024-06-26_[土匪、球球VS金克斯、璃月].mp4' -ss 00:00:00 -to 00:01:00 -c copy out.mp4


##############
VIDEO_SRC='卡尔直播回放2024-02-26_[土匪、飒飒VS柯柯、叶麦].mp4'
VIDEO_OUT="$VIDEO_SRC.new.mp4"
TIME_START='00:00:00'
TIME_END='03:21:29'
ffmpeg -i $VIDEO_SRC -ss $TIME_START -to $TIME_END -c copy  -y $VIDEO_OUT

cp $VIDEO_OUT /volume1/demo/biliup-rs/Downloads/kaerlol/202501/

#####################mp4 to mp4
VIDEO_SRC='卡尔_2024-08-24_21-06-34.mp4'
VIDEO_OUT=new_"$VIDEO_SRC"
TIME_START='00:00:00'
TIME_END='03:52:22'
ffmpeg -i "$VIDEO_SRC" -ss $TIME_START -to $TIME_END -c copy  -y "$VIDEO_OUT"
#

OUT_MP4='卡尔直播回放2024-06-29_[土匪、VS怪兽、如初、啵啵、kelly、贝拉(四月)].mp4'
ffmpeg -i "$VIDEO_OUT" -c copy -bsf:v h264_mp4toannexb -f mpegts -y "$OUT_MP4"

cp $VIDEO_OUT /volume1/demo/biliup-rs/Downloads/kaerlol/202501/
###################flv to mp4
VIDEO_SRC='kaer2024-09-28T21_03_16.flv'
VIDEO_OUT=new_"$VIDEO_SRC"
TIME_START='00:00:00'
TIME_END='04:53:17'
ffmpeg -i "$VIDEO_SRC" -ss $TIME_START -to $TIME_END -c copy  -y "$VIDEO_OUT"
#


TO_MP4=out.mp4
ffmpeg -i "$VIDEO_OUT" -c copy -bsf:v h264_mp4toannexb -f mpegts -y "$TO_MP4"

cp $VIDEO_OUT /volume1/demo/biliup-rs/Downloads/kaerlol/202501/

加字幕水印

核心使用:drawtext

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#每5秒显示2秒
TITLE=卡尔
FF=/volume1/homes/admin/biliup-rs/src/font/font.ttf
DATE=`date +%F`
#FILE=/volume1/homes/admin/biliup-rs/src/mp4/head.mp4
FILE=head.mp4
ffmpeg -i "$FILE" -vf "drawtext=fontsize=30:fontfile=$FF:text="$TITLE$DATE":x=20:y=20:fontcolor=green:box=0:boxcolor=yellow:enable=lt( mod(t\,5)\,2)" out.mp4


####B站水印,透明度0.3
#每30秒显示10秒
#标题
TITLE='B站<扯犊子哟>'
#字体
FF=wawa.ttf
#文件
FILE=old.mp4
ffmpeg -i "$FILE" -vf "drawtext=fontsize=60:fontfile=$FF:text="$TITLE":x=20:y=h-line_h-5:fontcolor=white:alpha=0.3:box=0:boxcolor=yellow:enable=lt( mod(t\,30)\,10)" -y out.mp4

获取视频截图

参数:

-t:持续时间

-f:图片格式,

-s:格式大小,如-s 640x360

-y:覆盖,直接使用

1
2
#获取第一名的截图
ffmpeg -i out.mp4 -y -f mjpeg  -t 1  out.png

图片加水印居中

listlist

使用cuda加速

ffmpeg -framerate 1 -loop 1 -i 

不使用cuda加速

ffmpeg -framerate 1 -loop 1 -i 

ffmpeg -framerate 1 -loop 1 -i 

指定视频长度

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#图片
PNG_PATH=/tmp/image.png
#MP3
MP3_PATH=/tmp/music.mp3
#视频长度(单位:秒)
OUT_TIME=5
#输出
OUT_PATH=/tmp/out.mp4


#############
ffmpeg  -framerate 15 -loop 1  -i $PNG_PATH  -i $MP3_PATH -t $OUT_TIME  -y  $OUT_PATH

豆包ai

1
ffmpeg -loop 1 -i example.jpg -i example.mp3 -c:v libx264 -preset medium -crf 23 -pix_fmt yuv420p -c:a copy -shortest -movflags +faststart video.mp4

"

1
2
3
4
5
6
#
img_path=
mp3_path=
mp4_path="${mp3_path}.mp4""

ffmpeg -loop 1 -i "$img_path" -i "$mp3_path" -c:v libx264 -preset medium -crf 23 -pix_fmt yuv420p -c:a copy -shortest -movflags +faststart "$mp4_path"

命令解释:

  1. 输入参数:

  2. -loop 1:让图片无限循环播放,从而使视频时长与音频时长一致。

  3. -i example.jpg:指定图片输入文件。

  4. -i example.mp3:指定音频输入文件。

  5. 视频处理:

  6. -c:v libx264:使用 H.264 视频编码器,这是一种广泛兼容的编码器。

  7. -preset medium:设置编码速度与压缩率的平衡,medium 是一个较为常用的预设。

  8. -crf 23:设置恒定速率因子(CRF),取值范围为 0 - 51,数值越小画质越好,通常 23 是一个不错的平衡值。

  9. -pix_fmt yuv420p:将视频像素格式设置为 YUV420P,以确保视频在大多数播放器上都能正常播放。

  10. 音频处理:

  11. -c:a copy:直接复制音频流,不进行重新编码,这样可以节省处理时间并保持音频质量。

  12. 输出控制:

  13. -shortest:让输出视频的时长与最短的输入(通常是音频)一致。

  14. -movflags +faststart:优化视频文件的头部信息,使视频可以更快地开始在线播放。

跑马灯

1
2
#注意字体文件
ffmpeg -i video.mp4 -vf "drawtext=text=周五,周五,卡秃子休息日! :expansion=normal:fontfile=foo.ttf: y=h-line_h-10:x=(mod(15*n\,w+tw)-tw): fontcolor=white: fontsize=40: shadowx=2: shadowy=2"  -y output.mp4

图片+音乐+跑马灯=合成视频

参数解析

-framerate 每秒帧数,数字越小刷新越慢(跑马灯效果以15为优)

-loop 1 图片循环一次

-i 要读取的文件

-t 制定视频长度

-y 存在同名视频文件时直接覆盖

ffmpeg 停止

1
killall -INT ffmpeg

ffmpeg 视频添加背景

参数说明:

scale:缩放尺寸

overlay:位于屏幕的位置

居中:overlay=w/2:h/2

右下角:overlay=(W-w):0

注:大写W为(背景图的)背景的宽带,小写w为视频的宽带;大写H为(背景图的)背景高度,小写h为视频的高度

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#视频居中
ffmpeg -loop 1 -i 1.png -i 1.mp4 -filter_complex "[1]scale=w=800:h=450[s];[0][s]overlay=w/2:h/2" -shortest -y output.mp4

#youtube视频
ffmpeg -loop 1 -i 1.png -i 1.mp4 -filter_complex "[1]scale=w=1040:h=585[s];[0][s]overlay=(W-w)/2:h/2/2/2" -shortest -y output.mp4






#视频在右上角
ffmpeg -loop 1 -i 1.png -i 1.mp4 -filter_complex "[1]scale=w=800:h=450[s];[0][s]overlay=(W-w):0" -shortest -y output.mp4

#视频在右下角
ffmpeg -loop 1 -i 1.png -i 1.mp4 -filter_complex "[1]scale=w=800:h=450[s];[0][s]overlay=(W-w):(H-h)" -shortest -y output.mp4

浏览器代理

1
'Mozilla/5.0 (Linux; Android 10; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36'

基于FFmpeg对视频叠加图片水印

1
2
#input.mp4是你要添加水印的视频文件,watermark.png是水印图片,overlay=10:10表示将水印放在视频的左上角,output.mp4是输出文件名
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4 
1
2
#当图片的背景色为纯色时如纯白色),可以使用movie与colorkey滤镜做配合做成半透明效果
ffmpeg -i 1.mp4 -vf "movie=bili.png,colorkey=white:0.01:1.0 [wm]; [in] [wm] overlay=30:10 [out]" image1_out.mp4

左下角水印

1
2
3
4
5
6
7
ffmpeg -i 1.mp4 -vf "movie=bili.png,lut=a=val*0.5 [wm]; [in] [wm] overlay=x=10:y=H-h-5 [out]" -y image3_out.mp4
#解析
-i 1.mp4                 输入视频
-vf                      方法
movie=bili.png           水印图
lut=a=val*0.5 [wm]       水印透明度
overlay=x=10:y=H-h-5     x坐标y坐标(H为视频高度h为水印高度5为5像素)

ffmpeg提取音频

1
2
3
SRC_FILE='卡尔直播回放2024-07-25_[土匪、涵涵VS小屋、乔西]【辈分局】.mp4'
OUT_WAV="$SRC_FILE.wav"
ffmpeg -i "$SRC_FILE" -ar 48000 -ac 2 -sample_fmt s16 "$OUT_WAV"

ffmpeg添加字幕水印,控制显示时间戳

视频添加字幕水印,蓝色高亮

时间戳有enable='between(t,10,20),控制在10显示,第20秒消失

1
ffmpeg -i input.mp4 -vf "drawtext=fontfile=wawa.ttf: text='Your Text Here': fontcolor=white: fontsize=36: x=(w-text_w)/2+1: y=(h-text_h)/2+1: enable='between(t,10,20)', drawtext=fontfile=wawa.ttf: text='Your Text Here': fontcolor=blue: fontsize=36: x=(w-text_w)/2: y=(h-text_h)/2: enable='between(t,10,20)'" -c:a copy -y output.mp4