本文档说明
使用 OpenCV 的 VideoWriter 录制摄像头视频,了解编码格式选择,并实现视频文件回放。
前置准备
bash
source ~/opencv-env/bin/activate1
基础录制
使用 cv2.VideoWriter 将摄像头画面保存为视频文件:
python
import cv2
import time
import os
os.environ.setdefault('DISPLAY', ':0')
DEVICE_INDEX = 73
DURATION = 5 # 录制时长(秒)
OUTPUT = "record.mp4"
cap = cv2.VideoCapture(DEVICE_INDEX)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
cap.set(cv2.CAP_PROP_FPS, 25)
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建 VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(OUTPUT, fourcc, 25.0, (w, h))
# 丢弃前几帧(让自动曝光稳定)
for _ in range(5):
cap.read()
frames = 0
start = time.time()
print(f"Recording {DURATION}s to {OUTPUT}...")
while time.time() - start < DURATION:
ret, frame = cap.read()
if not ret:
break
out.write(frame)
frames += 1
elapsed = time.time() - start
out.release()
cap.release()
size_mb = os.path.getsize(OUTPUT) / (1024 * 1024)
print(f"Done: {frames} frames / {elapsed:.1f}s / {size_mb:.1f}MB")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
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
编码格式说明
| FourCC | 格式 | 文件后缀 | 说明 |
|---|---|---|---|
mp4v | MPEG-4 | .mp4 | 通用兼容,CPU 软编码 |
XVID | MPEG-4 | .avi | 兼容性好 |
MJPG | Motion JPEG | .avi | 每帧独立压缩,文件较大 |
TIP
pip 安装的 OpenCV 只支持 CPU 软编码。如需硬件加速编码(文件更小、不占 CPU),参考 硬件加速进阶。
边录边显示
同时在屏幕上显示画面并录制:
python
import cv2
import time
import os
os.environ.setdefault('DISPLAY', ':0')
DEVICE_INDEX = 73
DURATION = 10
OUTPUT = "record_display.mp4"
cap = cv2.VideoCapture(DEVICE_INDEX)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(OUTPUT, fourcc, 25.0, (w, h))
win = "Recording"
cv2.namedWindow(win, cv2.WINDOW_NORMAL)
cv2.setWindowProperty(win, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
for _ in range(5):
cap.read()
frames = 0
start = time.time()
print(f"Recording + Display for {DURATION}s... Press 'q' to stop early")
while time.time() - start < DURATION:
ret, frame = cap.read()
if not ret:
break
frames += 1
elapsed = time.time() - start
fps = frames / elapsed if elapsed > 0 else 0
# 叠加录制状态
cv2.putText(frame, f"REC {elapsed:.1f}s | FPS: {fps:.1f}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)
cv2.imshow(win, frame)
out.write(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
out.release()
cap.release()
cv2.destroyAllWindows()
size_mb = os.path.getsize(OUTPUT) / (1024 * 1024)
print(f"Saved: {OUTPUT} ({frames} frames, {size_mb:.1f}MB)")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
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
性能提示
OpenCV 边录边显示时帧率约 14fps(1280×720),因为 CPU 同时负责编码和渲染。如需满帧录制+显示,使用 硬件加速的 GStreamer tee 方案。
视频回放
播放已录制的视频文件:
python
import cv2
import os
os.environ.setdefault('DISPLAY', ':0')
VIDEO_FILE = "record.mp4"
cap = cv2.VideoCapture(VIDEO_FILE)
if not cap.isOpened():
print(f"Error: Cannot open {VIDEO_FILE}")
exit()
fps = cap.get(cv2.CAP_PROP_FPS)
total = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f"Playing: {VIDEO_FILE} ({w}x{h}, {fps:.1f}fps, {total} frames)")
win = "Playback"
cv2.namedWindow(win, cv2.WINDOW_NORMAL)
cv2.setWindowProperty(win, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
delay = int(1000 / fps) if fps > 0 else 33
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow(win, frame)
if cv2.waitKey(delay) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
print("Playback finished")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
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
VideoWriter API 速查
| 参数 | 说明 |
|---|---|
filename | 输出文件路径 |
fourcc | 编码格式,用 cv2.VideoWriter_fourcc(*'mp4v') 创建 |
fps | 帧率(建议与摄像头一致) |
frameSize | 分辨率元组 (width, height) |
python
out = cv2.VideoWriter("output.mp4", cv2.VideoWriter_fourcc(*'mp4v'), 25.0, (1280, 720))
out.write(frame) # 写入一帧
out.release() # 完成录制,关闭文件1
2
3
2
3