FFmpeg用法

🌈Description
​ 本文主要介绍ffmpeg的各种用法,纯纯干货,请慢慢咀嚼,管饱。

环境搭建

图像处理

视频切割

1
ffmpeg -ss 00:00:05 -t 00:00:04 -i C:\Users\mmmm2sdsd1\Desktop\105_Flashing_Frying_six_dragon_05.ts -vcodec copy -acodec copy output.ts  
- 00:00:05  :起始时间点。  
- 00:00:04  :切割视频总时长。 

视频转图像(vidoe 2 BMP):

1
2
ffmpeg -ss 00:00:00 -i C:\Users\jimmy_wei\Desktop\142.MOV -t 00:00:15 -s 1920x1088 -pix_fmt bgr24 -y C:\Users\jimmy_wei\Desktop\halo\142\%06d.bmp  
ffmpeg -ss 00:00:03 -i E:\_VIDEO\435_AQUAMAN_08.mp4 -t 00:00:15 -s 3840x2160 -pix_fmt bgr24 -y E:\_BMP\3840_2160\435\%06d.bmp

图像合成视频(BMP 2 video):

1
ffmpeg -framerate 60 -i C:\Users\jimmy\Desktop\source_pic\%06d.bmp -r 60 -s 1920x1080 -c:v libx265 -crf 18 -pix_fmt yuv420p -y C:\Users\jimmy\Desktop\output.mp4  

视频推流

20230426164032|left|500

推流视频到nginx网页

nginx服务器:
  • 软件地址:D:\Program\nginx-1.7.11.3-Gryphon
  • 启动方法:nginx.exe -c conf\nginx-win-rtmp.conf
ffmpeg推流:
  • 指令:ffmpeg -re -i F:\2_视频\电视剧\武林外传\1.郭女侠怒砸同福店,佟掌柜妙点迷路人.mkv -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/live/home
    按Q可以退出推流。
查看推流视频:

推流视频到b站

b站服务器端设置:
  • 开播设置 - 个人中心 - bilibili link
  • 进入直播,点击开播设置,设置分类,房间名称,开启直播20230426135952|left|425
  • 生成rtmp推流地址和串流密匙。这两个会在推流中使用。
    • 服务器地址:%%🔐α 💡ID💡1vqREn1/S+Z8L2gewqQOW6s1cZIOuE+HJnrtMH1bhfjvU2kIUkt1n31BEZV5Q51XTAlVmk1HG/b0P96qcjcFGFmS+EElaSrL 🔐%%
    • 串流密钥:%%🔐α 💡ID💡NTCvUsiKTYODuGkCPb88QCIKEMfWaSri+NoFOiyquHczADwXk4Ex73RK980fFdxyNAV+ddz27TY73NdnfJFFdvo9zOj0LDZBAwqUGsNQRr96fF6F1SkbNPw/i4Ri9nZlbfrAdDMvEud2yqvzhlcu8gpym2SnxkL4yToj 🔐%%
ffmpeg推流:
  • 指令模板:ffmpeg -re -stream_loop -1 -i "test.mp4" -c copy -f flv "${rtmp}"
    视频文件全路径不需要加双引号。
    rtmp地址需要加双引号,替换${rtmp}即可。
  • 实际测试ok指令:%%🔐α 💡ID💡PK4pmoTqn46s4H/D2oQ/N65OryxeHqiollA6Jtzzgb8H4h1ITMrqGX+9Syr/9CUXtTcCNzTu34+Uleo1QfgHGUZd2fxpmSEJdozTvbi4A7LfYxAiZkCREe8f1oS8z9nSqLqFbuoAjzq260KE/j7hkB/3AtDMY0CRcrDklOXkJ7u0i2OELTrW3ie8fBvCpMUfGHBn1IYkZTtLAKmr5EWzW888ngpZtgopijPhrO+vPVfATMtwQZBoiXadL6YjRTaVmuhzVdG6qG1Hb2Cn0KuiKOYIeDVeU78t0OKOWBaaZUIPijqyEz4BRI+2ZC62yu48+OgG1IWuzNcToGw6JVtVDfTpUd3OvAl8gzFX1wOmpAzFBJsRYwkA2+yl/0O4NbFNnJkeUwBq6Iylb9kGEDyh/Ww= 🔐%%
查看推流视频:
b站推流应用价值:
什么是无人直播?

无人直播是一种自动化、智能化的直播方式,其运作过程不需要人工干预或仅仅需要非常少量的人工干预。相对于传统的人工直播模式,无人直播更加智能、高效、稳定和节省人力成本。
具体来说,无人直播通过将摄像头、麦克风、主机、人工智能等技术设备集成在一起,实现了直播内容的自动生成、发布以及分发等功能,不需要直播员现场控制,而是通过算法和预设的规则智能化地进行直播,从而实现了自动化直播。
同时,无人直播还有着更高的直播覆盖率和更好的直播质量。无人直播被广泛应用于各种应用场景,如电商直播、房地产直播、景区直播、体育赛事直播等。

无人直播优势?

人工智能技术、自动化技术等先进技术逐渐成熟,让我们可以更加智能地管理业务,提高工作效率。此外,无人直播可以为企业、机构、个人提供更加便捷、高效、安全的直播服务,让他们更好地宣传品牌、增加销售额、吸引更多客户。
无人直播还可以提高直播的稳定性和可靠性,减少人工干预导致的差错和错误,从而更好地满足用户的需求,实现商业价值。总之,无人直播是一种符合科技发展趋势、提高工作效率和商业价值的好方式。

摄像头推流

nginx服务器:

  • 软件地址:D:\Program\nginx-1.7.11.3-Gryphon
  • 启动方法:nginx.exe -c conf\nginx-win-rtmp.conf

python OpenCV + ffmpeg推流

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
39
40
41
42
43
44
45
46
47
48
49
50
51
import subprocess as sp  
import cv2 as cv
import subprocess
### 参考教程:https://zhuanlan.zhihu.com/p/74260950
### 后期如果要提升响应速度,减少延迟,可以参考下面这篇文章:
### https://zhuanlan.zhihu.com/p/38136322


rtmpUrl = "rtmp://localhost:1935/live/home"
camera_path = 0
cap = cv.VideoCapture(camera_path)

# Get video information
fps = int(cap.get(cv.CAP_PROP_FPS))
width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))

# ffmpeg command
command = ['ffmpeg',
'-y',
'-f', 'rawvideo',
'-vcodec','rawvideo',
'-pix_fmt', 'bgr24',
'-s', "{}x{}".format(width, height),
'-r', str(fps),
'-i', '-',
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
'-f', 'flv',
rtmpUrl]

# 管道配置
p = sp.Popen(command, stdin=sp.PIPE)

# read webcamera
while(cap.isOpened()):
ret, frame = cap.read()
# frame_queue.put(frame)
if not ret:
print("Opening camera is failed")
break

# process frame
# your code
# process frame

# write to pipe
# if frame_queue.empty() != True:
# frame_new = frame_queue.get()
p.stdin.write(frame.tostring())

ffmpeg 参数详解

基本使用方式:

1
ffmpeg [[options][`-i' input_file]] {[options] output_file}

参数含义:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
a) 通用选项
-L license
-h 帮助
-fromats 显示可用的格式,编解码的,协议的。。。
-f fmt 强迫采用格式fmt
-i filename 输入文件
-y 覆盖输出文件(即如果test.***文件已经存在的话,不经提示就覆盖掉了)
-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持
-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持。使用-ss参数的作用,可以从指定时间点开始转换任务,-ss后的时间单位为秒
-title string 设置标题(比如PSP中显示影片的标题)
-author string 设置作者
-copyright string 设置版权
-comment string 设置评论
-target type 设置目标文件类型(vcd,svcd,dvd) 所有的格式选项(比特率,编解码以及缓冲区大小)自动设置 ,只需要输入如下的就可以了:ffmpeg -i myfile.avi -target vcd vcd.mpg
-hq 激活高质量设置
-itsoffset offset 设置以秒为基准的时间偏移,该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持。
b) 视频选项
-b bitrate 设置比特率,缺省200kb/s
-vb bitrate set bitrate (in bits/s)
-vframes number 设置要编码多少帧
-r fps 设置帧频 缺省25
-s size 设置帧大小 格式为W*H 缺省160X128.也可以直接使用简写,也认:Sqcif qcif cif 4cif 等
-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
-croptop size 设置顶部切除带大小 像素单位
-cropbottom size -cropleft size -cropright size
-padtop size 设置顶部补齐的大小 像素单位
-padbottom size -padleft size -padright size -padcolor color 设置补齐条颜色(hex,6个16进制的数,红:绿:兰排列,比如 000000代表黑色)
-vn 不做视频记录
-bt tolerance 设置视频码率容忍度kbit/s (固定误差)
-maxrate bitrate设置最大视频码率容忍度 (可变误差)
-minrate bitreate 设置最小视频码率容忍度(可变误差)
-bufsize size 设置码率控制缓冲区大小
-vcodec codec 强制使用codec编解码方式,如-vcodec xvid 使用xvid压缩 如果用copy表示原始编解码数据必须被拷贝。
-sameq 使用同样视频质量作为源(VBR)
-pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
-passlogfile file 选择两遍的纪录文件名为file
c)高级视频选项
-g gop_size 设置图像组大小 这里设置GOP大小,也表示两个I帧之间的间隔
-intra 仅适用帧内编码
-qscale q 使用固定的视频量化标度(VBR) 以<q>质量为基础的VBR,取值0.01-255,约小质量越好,即qscale 4和-qscale 6,4的质量比6高 。此参数使用次数较多,实际使用时发现,qscale是种固定量化因子,设置qscale之后,前面设置的-b好像就无效了,而是自动调整了比特率。
-qmin q 最小视频量化标度(VBR) 设定最小质量,与-qmax(设定最大质量)共用
-qmax q 最大视频量化标度(VBR) 使用了该参数,就可以不使用qscale参数
-qdiff q 量化标度间最大偏差 (VBR)
-qblur blur 视频量化标度柔化(VBR)
-qcomp compression 视频量化标度压缩(VBR)
-rc_init_cplx complexity 一遍编码的初始复杂度
-b_qfactor factor 在p和b帧间的qp因子
-i_qfactor factor 在p和i帧间的qp因子
-b_qoffset offset 在p和b帧间的qp偏差
-i_qoffset offset 在p和i帧间的qp偏差
-rc_eq equation 设置码率控制方程 默认tex^qComp
-rc_override override 特定间隔下的速率控制重载
-me method 设置运动估计的方法 可用方法有 zero phods log x1 epzs(缺省) full
-dct_algo algo 设置dct的算法 可用:
0 FF_DCT_AUTO 缺省的DCT
1 FF_DCT_FASTINT
2 FF_DCT_INT
3 FF_DCT_MMX
4 FF_DCT_MLIB
5 FF_DCT_ALTIVEC
-idct_algo algo 设置idct算法。可用的有:
0 FF_IDCT_AUTO 缺省的IDCT
1 FF_IDCT_INT
2 FF_IDCT_SIMPLE
3 FF_IDCT_SIMPLEMMX
4 FF_IDCT_LIBMPEG2MMX
5 FF_IDCT_PS2
6 FF_IDCT_MLIB
7 FF_IDCT_ARM
8 FF_IDCT_ALTIVEC
9 FF_IDCT_SH4
10 FF_IDCT_SIMPLEARM
-er n 设置错误残留为n
1 FF_ER_CAREFULL 缺省
2 FF_ER_COMPLIANT
3 FF_ER_AGGRESSIVE
4 FF_ER_VERY_AGGRESSIVE
-ec bit_mask 设置错误掩蔽为bit_mask,该值为如下值的位掩码 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
-bf frames 使用frames个B 帧,支持mpeg1,mpeg2,mpeg4(即如果-bf 2的话,在两个非b帧中间隔的b帧数目为2,即IBBPBBPBBP结构)
-mbd mode 宏块决策
0 FF_MB_DECISION_SIMPLE 使用mb_cmp
1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
-4mv 使用4个运动矢量 仅用于mpeg4
-part 使用数据划分 仅用于mpeg4
-bug param 绕过没有被自动监测到编码器的问题
-strict strictness 跟标准的严格性
-aic 使能高级帧内编码 h263+
-umv 使能无限运动矢量 h263+
-deinterlace 不采用交织方法
-interlace 强迫交织法编码 仅对mpeg2和mpeg4有效。当你的输入是交织的并且你想要保持交织以最小图像损失的时候采用该选项。可选的方法是不交织,但是损失更大
-psnr 计算压缩帧的psnr
-vstats 输出视频编码统计到vstats_hhmmss.log
-vhook module 插入视频处理模块 module 包括了模块名和参数,用空格分开
-bitexact 使用标准比特率
-max_qdiff 视频中所有桢(包括i/b/P)的最大Q值差距
-b_qfactor 表示i/p与B的Q值比例因子,值越大B桢劣化越严重
-b_qoffset 表示1/p与B的Q值比例的偏移量,值越大B桢劣化越严重.如果大于0,那么下一个B的Q=前一个P的Q乘以b_quant_factor再加上offset,如果小于0,则B的Q=负的normal_Q乘以factor加上offset.
-i_qfactor p和i的Q值比例因子,越接近1则P越优化.
-i_qoffset p和i的Q的偏移量
D)音频选项%%%%
-ab bitrate 设置音频码率
-ar freq 设置音频采样率
-ac channels 设置通道 缺省为1,即单通道
-an 不使能音频纪录
-acodec codec 使用codec编解码 如:-acodec AAC 使用AAC音频编码

对了,如果大家对AI、新技术、软件评测感兴趣,可以关注我的微信公众号:image-20220328170047757|left或者个人博客:https://weicun.gitee.io/ 蓝色单车


🌈参考:

  1. 睡后收入(无人直播) - 掘金
  2. FFmpeg的官方网址是 http://ffmpeg.mplayerhq.hu/
  3. 中文Wiki是 http://www.ffmpeg.com.cn/
  4. Windows下安装使用ffmpeg - 知乎
  5. Ffmpeg使用技巧
  6. 家庭视频监控系统