不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

FFmpeg常用命令整理

检测源流信息

1
ffmpeg -i 源流地址

推流

把A.MP4和B.mp4打包进同一个ts流,并推到本机的10003端口

1
ffmpeg -re -i A.mp4  -re -i B.mp4  -map 0:0 -map 0:1 -map 1:0 -map 1:1  -program program_num=1:title=videoA:st=0:st=1 -program program_num=3:title=videoB:st=2:st=3 -c copy -f mpegts udp://localhost:10003

以此类推

1
2
3
4
5
推一路流
ffmpeg -re -i A.mp4 -map 0:0 -map 0:1 -program program_num=1:title=videoA:st=0:st=1 -f mpegts udp://localhost:10003

推三路流
ffmpeg -re -i shenzhen.ts -re -i guangdong.ts -re -i girl.mp4 -map 0:0 -map 0:1 -map 1:0 -map 1:1 -map 0:0 -map 0:1 -program program_num=1:title=videoA:st=0:st=1 -program program_num=3:title=videoB:st=2:st=3 -program program_num=5:title=videoXXX:st=4:st=5 -f mpegts udp://localhost:10003

循环推一路流,不做编码

1
ffmpeg -re -stream_loop -1 -i aaa.xx -c copy -f mpegts udp://localhost:10003

命令参数解释

  • re:realtime 推的速度,按当前帧率推
  • map 0:0 第一个流的视频
  • map 0:1 第一个流的音频
  • map 1:0 第二个流的视频
  • map 1:1 第二个流的音频
  • program_num=1:title=videoA:st=0:st=1 0,1合成一个视频videoA
  • program program_num=3:title=videoB:st=2:st=3 2,3合成一个视频videoB
  • -stream_loop 循环推流
  • -c copy 将视频中压缩的数据复制
  • -c:v libh264 将视频流强制转换为h264编码

查看流中的program信息

1
ffprobe -show_programs -print_format json -timeout 5000000 -i udp://localhost:10003  
  • 注意:这个命令有返回值,0表示执行成功,1表示失败。

将流中的program 1和program 3分别截取5s钟的时间,生成了两个文件

1
ffmpeg -timeout 5000000 -i udp://localhost:10003  -t 0:0:5  -map p:1 -c copy  1.mp4 -t 0:0:5 -map p:3 -c copy 3.mp4 
  • 注意。此时推的是复合流。

对视频流抽帧

1
ffmpeg -i 源流地址 -vframes 1 -vf scale=90:51 图片存放路径

重复推流

1
2
3
ffmpeg -re -stream_loop -1 -i aaa.xx -c copy -f mpegts udp://localhost:10003

./ffmpeg -re -i -stream_loop -1 startslient.mp3 -c:a aac -f flv rtmp://123.56.17.184/live/znn

将流保存成文件

1
2
3
4
ffmpeg -i 流地址 -c copy 文件名

例如:
ffmpeg -i udp://localhost:10003 -c copy test.ts

检测源流中是否有静音

1
2
3
4
5
ffmpeg -i silence.mp3 -af silencedetect=noise=0.0001 -f null -
(默认音频中如果有2秒是静音,就认为是有静音的)

持续让ffmpeg检测音频5秒
ffmpeg -i silence.mp3 -af silencedetect=noise=0.0001 -t 0:0:5 -f null -

切分视频片段

切分纯视频片段

1
ffmpeg -i test.flv -vsync 0 -filter_complex "[0:v]select='between(t-start_t,8.250,10.000)'[xv];[xv]setpts='PTS-STARTPTS'[vout];[vout]scale=1920:1080,pad=1920:1080:0:0:black[vout2]" -map "[vout2]" -c:v libx264 test.ts

切分纯音频片段

1
ffmpeg -i test.mp3 -filter_complex "[0:a]aselect='between(t,0.000,26.250)'[xa];[xa]asetpts='NB_CONSUMED_SAMPLES/SAMPLE_RATE*1/TB'[aout] " -map "[aout]" out.mp3

切分带音频的视频片段

1
ffmpeg -i test.flv -filter_complex "[0:v]select='between(t-start_t,5.250,10.000)'[xv];[xv]setpts='PTS-STARTPTS'[vout];[vout]scale=[vout2]" -r 25 -map "[vout2]" -c:v libx264 -x264-params sps-id=6 out.ts

命令参数解释

  • -vsync 0:打印ffmpeg详细日志的开关
  • black:添加黑边
  • libx264:编码

合并视频片段

1
ffmpeg -f concat -safe 0 -i test.txt -c copy out.mp4
  • test.txt:一个文件列表,里面存放着要合并的视频片段名
  • -f concat -safe 0:打开文件时会用到

合并视频的同时添加图片和文字水印

1
ffmpeg -f concat -safe 0 -i test.txt -t 27.040 -loop 1 -i 1080P%05d.png -filter_complex "[0:v][1:v]overlay=x=0:y=885:enable='between(t,0,30)'[out];[out]drawtext=fontfile=simhei.ttf:text='name':x=414:y=928:fontsize=60:fontcolor=white:enable='between(t,0,30)'[out];[out]drawtext=fontfile=simhei.ttf:text='title':x=630:y=933:fontsize=52:fontcolor=white:enable='between(t,0,30)'" -y -c:v libx264 out.mp4
  • -loop 1,让png序列循环

链接

how-can-i-overlay-png-image-sequence-but-start-at-particular-frame-using-ffmpeg

利用ffmpeg实现添加图片水印和文字水印,添加多个水印

使用ffmpeg给视频添加图片及文字水印

------ 本文结束------
如果本篇文章对你有帮助,可以给作者加个鸡腿~(*^__^*),感谢鼓励与支持!